进程调度算法
https://blog.csdn.net/fuzhongmin05/article/details/55802925
- 先来先服务(FCFS)
- 时间片轮转
- 短作业优先(SJF)
- 多级反馈队列:有多个队列,优先从前面队列取线程执行;若线程在一次时间片段未执行完毕,则移入下一个队列中。
- 优先权调度算法(FPF):抢占式(来了更高优先权的进程时则搁置正在执行的进程)、非抢占式。
页面置换算法
操作系统概念第七版中文版p284
- 先进先出(FIFO-first in first out)-最基本的算法:先被调入的页先被调换出去
- 最佳调度算法(OPT-Optimal Replacement)-理想的、不切实际的算法:调出的页是将来最长时间不访问的页,实际环境根本无法知道之后会访问哪一页,通常用来作为评价其他置换算法的标准。
- 最近最久未使用(LRU-least recently used)-实践中效果接近于OPT:调出未使用时间最长的页
- 近似LRU:LRU和OPT算法一样,不存在belady异常(增加内存的帧数后,反而需要更多的置换次数),在实践中是一种较为合理的算法,但是LRU基于栈结构,需要特殊的硬件支持,因此便有了下列。
- 附加引用位算法:为内存内的每一帧设置一个8位的标志位。当某一帧被使用时,此帧的最高位被置为1,其它位后移。置换时置换出标志位值最小的帧。
- 二次机会算法(SCR):基于FIFO,为内存里的每一帧设置一个1位的标志位。
当某一帧被使用时,将标识设置为1;
当某一帧按照FIFO原则被选中替换时,判断标志位:
如果标识位是1,则将标志位设为0,并将该帧放到队列的尾部。
如果标识位是0,则写出该帧。
- 时钟算法(clock):改进的二次机会。二次机会需要不断的修改链表,浪费时间,所以有了时钟算法。基于二次机会算法的逻辑,但是所有帧围成环形结构,只需要一个指针指向最前面的帧。
- 增强型二次机会: 每一次置换需要一次写出一次写入。但是没被修改过的帧是不必写出的,所以应尽量避免换出修改过的帧。增强型二次机会算法有两个标志位,一个标志是否最近使用过,一个标志是否修改过。置换原则为(0,0)、(0,1)、(1,0)、(1、1)。
- 最不经常使用(LFU- least frequently used):调出使用频率最低的页
最常使用(MFU- most frequently used)):调出使用频率最高的页(例如数据仓库)
这两种算法的实现都很费时,且不能很好的近似OPT,所以不常用。
进程间通信
进程间通信分为两类:共享内存,建立消息传递系统。《操作系统概念第7版》P85
共享内存
- 共享内存:https://blog.csdn.net/skyroben/article/details/72625028
- 信号量:https://blog.csdn.net/skyroben/article/details/72513985
创建信号量的进程在创建的时候设置信号量的id,其他进程可以通过id获取信号量,之后通过PV操作同步信号量。PV是荷兰语的缩写:P(passeren)通过,信号量减1;V(vrijgeven)释放,信号量加1.。
建立消息传递系统
网络端口
- 管道:https://blog.csdn.net/shltsh/article/details/46524401
用于父子进程的通信,只能单向通信。父进程创建一个管道后持有管道的入口和出口,fork子进程的时候,子进程也得到了管道的入口和出口。父子进程分别关闭管道的一端后就初始化了父到子或者子到父的管道。
- 命名管道(FIFO):https://www.cnblogs.com/cxq0017/p/6525027.html
突破匿名管道只能父子通信的局限,也是半双工。
- 匿名管道位于内存,命名管道位于文件系统
创建队列的进程在创建的时候设置队列的id,其他进程可以通过id获取队列,之后通过send和receive函数通信。
kill -9 和 crtl+c都是一种信号