c语言程序分析题详细解析的基础问题求分析过程

一、介绍你最得意的一个项目

四、微服务架构、SOA、单体架构、分布式架构

PHP的魔术常量、系统常量

PHP 关键配置项有哪些

PHP的生命周期/启动流程

说一下PHP的(内存)垃圾回收机制

PHP常见运行模式有几种

常见的框架, 以及各自优缺点.

PHP的魔术常量、系统常量

array_push :在数组尾部插入一个元素

array_keys :返回数组中部分的或所有的键名并未其建立数字索引

array_values:获取数组中所有的值并给其建立数字索引

array_diff:两数组差集,判断的是数组元素的值,返回的数组会保持映射关系,具体是关联数组或索引数组,与第一个元素有关

array_intersect:两数组交集,判断的是数组元素的值,返回的数组会保持映射关系,具体是关联数组或索引数组,与第一个元素有关;array_intersect_assoc:会将索引也最为比较的依据,返回索引和数值均一致的数据。

array_sum:计算数组值的总和,以整数或者浮点数的形式返回

array_rand:从数组中随机取出一段元素,如 array_rand($arr, 2),随机返回两个元素,注意返回的是键,而不是值,所以一定是索引数组。

array_map:对于数组使用回调函数

重要的排序函数:排序都是使用的快排算法

strlen:字符串的长度

strstr:获取当前字段之后的字符串

如果 start 是非负数,返回的字符串将从 stringstart 位置开始,从 0 开始计算。

如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。

如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。

如果提供了负数的 length,那么 string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。

strpos:字符串首次出现的位置;strrpos:字符串最后一次出现的位置;

stripos:不区分大小写,字符串首次出现的位置;

exit会直接退出终止执行,退出进程;return 只是会返回上级调用处;

echo 是语法而不是函数;print 是函数,输出字符串;print_r打印出变量的信息;var_dump输出变量的信息;

PHP默认不支持多线程,但是可以通过扩展开启多线程。对于多线程而言,会存在线程安全的问题。

PHP采用了TSRM(线程安全资源管理器)的方式来进行线程安全管理工作:具体就是为每个线程复制一份全局变量和静态变量数据,保证他们不会相互影响(很耗费内存空间,特别是线程以及全局变量比较多的时候)。

phpinfo() :打印出PHP相关信息,如扩展信息、PHP版本、系统信息,生产环境中一定不能开启。

是两者都是OSI七层模型里的传输层协议,都是全双工通信。

TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的;
TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到;
TCP协议对系统资源要求比较多了;
TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
TCP是一对一的通信,而UDP则可以支持一对一,多对多,一对多的通信。
TCP面向的是字节流的服务,UDP面向的是报文的服务。

简述TCP三次握手以及四次挥手

为何需要三次:避免在网络结点中流转过久的连接请求又重新回到了服务器,而服务器不知道这个请求是无效的,会向客户端发送确认报文,会造成重复的连接建立。

四次放手:首先是客户端主动发送断开连接报文,服务器端发送确认报文;然后服务器发送断开连接报文,客户端回复确认报文

如何实现浏览器跨域请求.

常见的有jsonp方式、服务器代理、CORS三种方式,其中Jsonp与CORS(跨域资源共享)两者的区别如下。

    JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理;而JSONP主要结合Ajax使用 老的浏览器支持JSONP却不支持CORS,而绝大多数现代浏览器都已经支持了CORS

  4) 最少连接数 调度器会记录每个server的连接数 然后选择最少连接数的server提供服务,这样可以保证每个server的负载均衡。

LVS有三种工作模式:NAT、TUN、DR,目前使用最广泛的也就是DR模式。

负载均衡有两层、三层、四层、七层负载均衡几大类。其中,LVS是属于四层负载均衡;nginx以及BFE均属于七层负载均衡。

关于header的各种参数的作用

本质原因是http是无状态的,需要通过session、cookie机制来保持会话信息。

session是将会话数据保存在服务器端,比较安全;session数据可以保存在数据库、文件或者redis中;高并发情况下会产生大量的session数据,对于存储在服务器文件而言,可能会造成服务器资源的消耗紧张;

常常采用的是将session数据存储在一个单独的服务中,例如公司的passport服务。

cookie是将数据保存在客户端,数据不太安全;可以设置cookie的key 、val 、 失效时间 、域、 path;对于未设置失效时间的cookie则认为是会话cookie,它的生命周期与浏览器是同步的,浏览器关闭之后cookie便会被删除

cookie跨域请求携带如何解决

浏览器在发送请求时会根据请求的地址查找与该地址匹配的cookie信息一起发送。

可以设置cookie的domain为根域名,这样在发起所有二级域名的请求时都会携带上该cookie信息。这也是sso单点登录的原理。

浏览器同源策略:不允许访问跨域的Cookie

1)如果是域名归属于同一个根域名,可以设置cookie的domain域为根域名(或者域名交集),无须在做其他操作

常见的事件驱动模型以及相互之间的区别。


\S:匹配任何非空白字符;

\s:匹配任何空白字符,包括空格、制表符、换页符等等;

. :匹配除换行符 \n 之外的任何单字符。

\d:匹配数字字符,与[0-9]相同

\D:匹配非数字字符,与[^0-9]相同

\w:匹配任何只包含字母数字字符和下划线的字符组成的字符串,与[0-9a-zA-Z_]相同

\W:匹配字符串,忽略下划线和字母数字字符串

正则表达式在很多地方都有使用,一定要牢记使用。

进程与线程的区别与联系

 进程是操作系统分配和管理资源的基本单位,每一个进程都有一个自己的地址空间 。进程至少有 5 种基本状态,它们是:创建态,等待态,执行状态,阻塞态,终止状态。

进程之间可以通过信号量、共享地址、管道、信号等多种方式进行通信。

 线程是CPU调度的基本单元,一个进程内至少会有一个主线程,一个进程内的多线程之间会共享进程的地址空间,会造成资源的竞争。

具体有以下几种解决方案:

MySql性能优化方案

你知道的几个关键配置项

innodb_buffer_pool_size:InnoDB存储引擎在用,这个缓冲用途很大。InnoDB可以用它还缓存索引、数据、自适应hash索引、锁、以及写入操作。其中,可以将写入操作进行合并,开启一个线程,定期把这种写入操作持久化到磁盘中去。

Redis是如何保证高性能的

redis低层是使用的C语言编写的,而且数据是基于内存,并且使用了I/O多路复用的事件处理模型,是单进程单线程的服务。

Redis有安全认证功能,但是memcache就没有了。

Redis常见的对象类型

Redis常见的有字符串、列表、hash、集合、有序集合五大类。

其中字符串的低层是使用的SDS(简单动态字符串);列表的低层是使用的压缩列表或双端链表;hash的低层是使用的字典或者压缩列表;集合的低层是使用的跳跃表;有序集合的低层可能使用压缩列表或者整数

整数字符串对象类型可以实现对象的复用,而且低层的对象数据结构里记录了对象的引用计数。

字符串:常用与缓存、计数器

hash:缓存对象数据

列表:先进先出,消息队列

集合:利用集合的交差并补,实现共同关注好友列表

有序集合:利用每个元素的优先级,实现排行榜功能

Redis使用注意事项

每个key一定要设置失效时间,不要使用系统自带的失效策略,而是要主动删除无效数据。 Redis对于SDS会维持一个buffer,某些情况下可能造成内存的过度占用而不会被释放。 使用setex方法代替set expire方法(因为两个方法是独立的,并不是一个原子性的操作,而且操作两次的话涉及到两次网络交互) 尽量使用批量操作,因为redis的性能瓶颈就是在网络通信处,如使用mget()

Redis常见配置项了解

memcached不会主动进行内存的回收操作,只有在get请求数据时才会判断数据是否已经失效,如果已经失效则会删除数据;

在内存不够时会使用LRU算法进行内存的回收,这个期间可能会造成有些未失效的数据被删掉,造成数据的丢失;

redis的内存回收利用了对象的定期删除 + 惰性删除两种;同时结合了max_memory选项,在内存不够时根据LRU删除数据;

Memcached集群,server端之间并不会进行相互的通信,通信完全由你的客户端来完成,你只需在客户端规定好你的key值,然后 set进行,此时会有一个散列算法,来决定你key会存放在哪台server上。

分布式是在客户端实现的;整个的数据是放在一个大的hash表中的;key可以设置过期时间,删除策略为惰性删除,当内存空间不够时按照LRLU(最近最少使用)的原则删除数据。

Memcached没有安全认证功能,一个普通的telnet客户端就可以连接server。

常常用于页面的静态化;

Memcached主要使用于存储实时性和安全性要求不是很高的数据;由于Memcache不能提供持久化功能,一定不能将其作为主库使用;

mongodb支持副本集、索引、自动分片,可以保证较高的性能和可用性。

默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景。但是应当避免在高事务安全性的系统中使用MongoDB,除非能从架构设计上保证事务安全。

MongoDB的复副集(Master-Slave)配置非常简洁方便,此外,MongoDB可以快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性。

数据量很大或者未来会变得很大

依赖数据库(MySQL)自身的特性,完成数据的扩展是较困难的事,在MySQL中,当一个单达表到5-10GB时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用MySQL通常需要借助驱动层或代理层完成这类需求。而MongoDB内建了多种数据分片的特性,可以很好的适应大数据量的需求。

MongoDB支持二维空间索引,因此可以快速及精确的从指定位置获取数据。

在一些传统RDBMS中,增加一个字段会锁住整个数据库/表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。通常发生在数据表大于1G的时候(当大于1TB时更甚)。 因MongoDB是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据。另外一个好处当业务数据发生变化时,是将不在需要由DBA修改表结构。

memcache是单进程多线程的网络处理模型,低层是采用的libevent事件库来处理高并发的;支持的数据类型比较单一,而且可以进行的操作也比较少;而且不支持备份、持久化、复制等特性;

缓存和数据库双写不一致

缓存穿透:查询key在缓存和数据库中均不存在数据,会造成低层存储系统的负载加载,有可能会压垮服务,造成整个服务的宕机。

缓存不可用,造成整个的流量都打到了存储层,造成低层存储的负载加大,会导致存储服务压力过大,出现宕机。

1、前期:通过架构设计保证服务的高可用性

2、发生中:限流、降级、熔断

    为什么用swoole?swoole的优势是什么? tcp三次握手过程,详细一些。 握手过程中可能出什么问题 优先级队列如何实现 什么是epoll?你怎么用的,简单写下代码?accept阻塞在哪儿了?如果是epoll为什么不阻塞了? 异步和非阻塞的区别,说详细 php中使用epoll的伪代码流程 进程,线程,协程的区别 最大堆最小堆实现优先级队列 epoll的常用模式是哪两种?区别是什么?
}

我要回帖

更多关于 c语言程序分析题详细解析 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信