1、select和epoll的区别
select的时间复杂的为O(n),select仅仅只知道I/O事件发生啦,却并不知道是那几个流(可能有一个,多个或者全部),我们只能无差别的轮询所有流,找出能读出数据或者写入数据的流,对他们进行操作,所以select具有O(n)的复杂度,处理的流越多,无差别轮询时间就越长。epllo的时间复杂度为O(1),epllo会把那个流发生了怎样的I/O事件通知我们,所以epllo实际上是事件驱动(每个·事件都关联上fd的),此时我们对这些流的操作都是有意义的。
2、static修饰局部变量和全局变量区别
静态全局变量:具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域,静态局部变量:具有局部作用域,它只被初始化一次,自从第一次被初始化后直到程序运行结束都一直存在。
3、堆和栈的区别
栈由系统分配,堆由程序员控制;栈较小,有默认上限,堆理论上可以申请整个虚拟内存的大小;栈向下增长,地址由高到底,堆向上增长,地址从低到高;栈的分配效率较高,保证函数执行跳转的效率,堆的分配更为复杂,容易产生碎片,需要回收;栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等,堆一般情况下堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
4、线程与进程的区别
线程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实习了操作系统的并发;线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发:线程是操作系统可识别的最小执行和调度单位。一个线程只属于一个进程,而一个进程可以有多个线程,进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存,进程是资源分配的最小单位,线程是CPU调度的最小单位;进程切换的开销远大于线程切换的开销。进程编程调试可靠性高,但是创建销毁开销大,线程正相反,开销小,切换速度块,但是编程调试相对复杂。
5、野指针出现情况和解决方案
1、指针变量声明时没有被初始化,可以在指针声明时初始化,可以是具体的地址值,也可让它指向NULL 。2、指针p被free或者delete之后,没有置为NULL。指针指向的内存空间被释放后指针应该指向NULL。3、指针操作超越了变量的作用范围,在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。