wx:嵌入式工程师成长日记
1.僵尸进程有什么危害?
僵尸进程的进程号并不会被释放,但是系统的进程号是有限的,如果出现大量僵尸进程就会导致系统无进程号可用就无法产生新进程。
2.进程调度算法即策略有哪些?
先来先服务,短作业优先调度,高优先级优先,时间片轮,多级反馈队列
3.有抢占式和非抢占式的区别
非抢占式优先权算法:在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成
抢占式优先权调度算法:在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程
4.并发和并行
并发是对于单个cpu来说,只能一个进程运行,但是线程的切换时间则是减少到纳秒数量级,多个任务不停的来回切换;并行是对于多个CPU来说,多个进程同时运行
区别:并行的"同时"是同一时刻可以多个任务在运行(处于running),并发的"同时"是经过不同线程快速切换
5.什么是死锁,产生的条件,如何解决?
死锁是指多个进程在执行过程中,因争夺资源而造成互相等待,此时系统产生了死锁
产生条件:
1.互斥条件:进程对所分配的资源不允许其他进程访问,若其他进程需要访问,只能等待,知道该进程使用完毕后释放资源
2.请求保持条件:进程获得一定资源后,又对其他资源发出请求,但该资源被其他进程占用,此时请求阻塞,而且这个进程不会释放自己已经占有的资源
3.不可剥夺条件:进程获得资源,只能自己释放,不可剥夺
4.环路等待条件:若干进程之间形成一种头尾相接等待资源关系
解决:
资源一次性分配,从而解决请求保持的问题;
可剥夺资源:当进程新的资源未得到满足时,释放已有的资源;
资源有序分配:资源按序号递增,进程请求按递增请求,释放则相反;
6.互斥锁机制
互斥锁机制:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒
7.进程、线程的中断切换的过程是怎样的
上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换
进程上下文切换:
(1)保护被中断进程的处理器现场信息
(2)修改被中断进程的进程控制块有关信息,如进程状态等
(3)把被中断进程的进程控制块加入有关队列
(4)选择下一个占有处理器运行的进程
(5)根据被选中进程设置操作系统用到的地址转换和存储保护信息
(6)根据被选中进程恢复处理器现场
8.多路IO复用技术有哪些,区别是什么?
1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;而epoll保证了每个fd在整个过程中只会拷贝一次。
2)每次调用select都需要在内核遍历传递进来的所有fd,才知道哪些fd是被设置了;而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了。
select设置监听的集合不能被重新使用
3)select支持的文件描述符数量太小了,默认是1024;而epoll没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048
epoll为什么高效:拷贝、查询、返回
1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间
2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把当前进程往设备等待队列中挂一次,而epoll只要一次拷贝,而且把当前进程往等待队列上挂也只挂一次,这也能节省不少的开销。
3)当我们调用 epoll_wait() 函数返回的不是实际的描述符,而是一个代表就绪描述符数量的值,这个时候需要去epoll指定的一个数组中(epoll_event定义的结构体)依次取得相应数量的 socket 描述符即可,这个数组里面保存的都是可以的文件描述符,而不需要遍历扫描所有的 socket描述符,因此这里的时间复杂度是O(1),这里和select的区别是select返回的也是可用的数量,但是并没有告诉你可用的文件描述符是谁,你必须得遍历全部的文件描述符,才知道是那些就绪了。
epoll最大的优点就在于它只管就绪的socket描述符,而跟socket描述符的总数无关