进程与线程:
进程:为了提高CPU执行效率,减少因为程序等待带来的CPU空转以及其他计算机资源的浪费而提出来的。
线程:为了减少进程切换和创建的开销,提高执行效率,节省资源。
多进程与多线程区别:
线程之间共享:进程的堆空间、全局静态存储区
线程之间私有:线程ID、寄存器的值、栈内存、线程的调度策略、线程的私有数据、信号屏蔽字、errno变量
进程间通信:
1、管道:无名管道:半双工,只能在具有亲缘关系的进程间使用
有名管道:半双工,允许无亲缘关系进程之间的通信
2、信号量:一个计数器,可以用来控制多个线程对共享资源的访问,可以同步进程,但是信号量有限。
3、信号:较复杂,用于通知接收进程某个事件已经发生
4、消息队列:是消息的链表,存放在内核中并由消息队列标识符标识,可实现任意进程间的通信,但信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。
5、共享内存:映射一段能被其他进程所访问的内存,这段内存由一个进程创建,但多个进程都可以访问,然而往该内存区存放信息或从中取走信息的进程间通常需要同步。
6、套接字:时间短、性能高、可以加密、安全性强。
线程间通信:
1、锁机制:互斥锁、读写锁、自旋锁
互斥锁:提供了以排他方式防止数据结构被并发修改
读写锁:允许多个线程同时读共享数据,而对写操作是互斥的
自旋锁:互斥锁是资源被占用时,申请者进入睡眠状态,而对于自旋锁,申请者则循环检测是否已经释放锁
2、条件变量:以原子的方式阻塞进程,直到某个特定条件为真为止,对条件变量的测试是在互斥锁的保护下进行的
3、信号量:一个计数器,可以用来控制多个线程对共享资源的访问
4、屏障:是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到合作线程达到某一点,然后从该点继续执行
进程与线程的选择:
页面置换算法:
分为局部页面置换和全局页面置换,局部置换仅仅在产生这次缺页的进程的驻留页中选择,而全局置换把内存中所有未被锁定的页都作为置换的候选页,而不管它们属于哪一个进程。
局部页面置换算法:
1、最优页面置换算法(OPT):选择置换下次访问距当前时间最长的那些页,由于它要求操作系统必须知道将来的事件,所以是不可能的,但是它仍能作为一种标准来衡量其他算法的性能
2、最近最少使用(LRU):置换内存中上次使用距当前最远的页,性能接近OPT,但是比较难实现
3、先进先出(FIFO):实现简单,性能相对较差
4、时钟策略(clock):有一个标志位,当发生缺页中断时,考察指针指向的最老页面,若它的标志位为0,立即淘汰,若标志位为1,则把该位置0,然后指针往下移动一格,如此下去,直到找到被淘汰的页面,然后指针指向它的下一格
5、二次机会法(enhanced clock):通过增加一个标志位,使时钟算法更有效,增加一个修改标志位,如果需要被替换的页并没有被修改,那么这个页和硬盘中的页的内容是一致的,所以不需要把这个页写回到硬盘中,直接释放内存即可。若页被修改了,那么就先把页写回到硬盘中去,再进行替换。以此减少对硬盘的访问。
6、最不常用算法(LFU):当一个缺页中断发生时,选择访问次数最少的那个页面,并淘汰。
全局页面置换算法:
1、工作集置换算法:工作集窗口随着时间轴在平移,当某一个页不属于工作集时,就将它替换
2、缺页率置换算法(PFF):常驻集大小可变,根据缺页率的变化间接体现出运行程序对内存的需求,从而动态调整运行过程中常驻集的大小
抖动问题:
如果分配给一个进程的物理页面太少,不能包含整个的工作集,那么进程将会造成很多的缺页中断,需要频繁地在内存与外存之间替换页面,从而使进程的运行速度变得很慢,我们把这种状态称之为‘抖动’。
系统并发度:驻留在内存中的进程数目叫做系统并发度。
产生抖动的原因:随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升,所以OS要选择一个适当的进程数目和进程需要的帧数,以便在并发水平和缺页率之间达到一个平衡。
进程调度:
调度决定了哪个进程必须等待、哪个进程可以继续运行,因此它影响着系统的性能。
调度算法:
1、先来先服务(FCFS):也称作先进先出,FCFS执行长进程比执行短进程更好,相对于I/O密集型的进程,更有利于处理器密集型的进程
2、时间片轮转调度(Round Robin):基于时钟的抢占策略,每个进程在被抢占前都给定一片时间。
3、最短进程优先(SPN):非抢占,下一次选择预计处理时间最短的进程,难点在于需要知道或至少需要估计每个进程所需要处理的时间,长进程可能饥饿
4、最短剩余时间(SRT):针对SPN增加了抢占机制的版本,选择预期剩余时间最短的进程,必须有关处理时间的估计,长进程可能饥饿
5、最高响应比优先(HRRN):使用了归一化周转时间,它是周转时间和实际服务时间的比率,可作为性能度量。计算公式:
R为响应比,w为等待处理器时间,s为预计的服务时间
当前进程完成或被阻塞时,选择R值最大的进程,R值越大,进程的‘年龄’越大,策略同样需要估计每个进程所需要处理的时间
6、多级反馈(MLFQ):使用动态优先级机制,能够区分进程在动态执行过程中的特征来动态调整进程优先级,如:等待时间越长,优先级越高,执行时间越长,优先级越低
7、公平共享调度
死锁:
死锁的条件:
1、互斥:一次只有一个进程可以使用一个资源,其他进程不能访问已分配给其他进程的资源
2、占有并等待:当一个进程等待其他进程时,继续占有已经分配的资源
3、不可抢占:不能强行抢占已占有的资源
4、循环等待:存在一个封闭的进程链
解决方法:
死锁预防、死锁避免、死锁检测、死锁恢复
五种IO模型:
IO多路转接:可以监视多个描述符,一般来说 select 和 epoll 最常用,select 因其跨平台性质,而 epoll 由于其性能最好,更加灵活
select:数组实现,最大1024个描述符,开销大
IO多路复用之select总结 - Rabbit_Dale - 博客园
poll:链表实现,突破描述符1024的限制,一般只用POLLIN、POLLOUT和POLLERR即可
IO多路复用之poll总结 - Rabbit_Dale - 博客园
epoll:红黑树实现
IO多路复用之epoll总结 - Rabbit_Dale - 博客园
epoll 两种工作模式:水平触发(LT)和边沿触发(ET)
LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。
ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。
ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
如何设置非阻塞模式?
1、open()函数:通过设置 flags,必选项 O_WDRW | O_NONBLOCK,适用于终端( dev/tty )
2、fcntl函数(头文件<fcntl.h>):
可执行各种描述符控制操作,设置方法如下,先读再改变,避免更改其余标志位
int flag = fcntl(fd,F_GETFL);
flag |= O_NONBLOCK;
fcntl(fd,F_SETFL,flag);
网友评论