操作系统概念 -第七版-重要概念的理解-(34-40)
34.fork()从父进程的当前代码开始复制一个子进程,如果在子进程调用exec()执行指定其他程序,那么子进程会被指定程序覆盖。
而在线程中调用fork有2种:一、只复制当前线程到子进程中,二、复制整个进程中的所有线程到子进程中。
而在线程中调用fork有2种:一、只复制当前线程到子进程中,二、复制整个进程中的所有线程到子进程中。
35.CPU调度中,
有简单的短期调度算法"FCFS先进先服务调度"的算法,这个算法CPU会有很时间花在等待上;
第二个稍微复杂的"短作业优先调度"算法,这个算法适合长期调度,特别是线程执行时间长短差异较大,这个算法有个问题就是怎么预测执行时间;
第三个就是“优先级调度”,每个线程都有执行的优先级,优先级低的作业要让步给优先级高的,这个算法容易出现低优先级线程久久未被执行,也就我们说的线程饥饿,解决办法就是“优先级衰老机制”,没过10分钟就会把所有等待线程的优先级-1,有个需要注意的是,假定优先级由低到高为" 127 - 0 " ,原本优先级为127(最低优先级),-1后变成0;
---------------------------------------在讲第四种之前要一个华丽的分割线-----------------------------------------
因为前面几种算法都是在强调 “被调度的作业是不可分割的原子”。而第四种算法则认为被调度的作业是可以被分割成很多时间片的。同时
轮转法调度被称为:一种最古老,最简单,最公平且使用最广的算法。
第四个算法是“轮转法调度”,这个算法就是把所有作业切成小时间片,所有进程都公平的执行一个小片段后就退让出CPU,这个算法有个缺点: 时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折衷。
第五个算法,我们可以给把任务按照需求分到不同的队列,不同的队列采用不同的算法,这个叫做“多级队列调度”,这是从队列数目的层面上对调度算法的优化,这个算法相比于前四个没那么精华。
再透露一个秘密,上面的算法很少单独使用,换句话说实际应用场景中的调度算法更复杂,比如上面5个算法可以同时使用。
这个算法的名字叫“多级反馈队列调度算法”,自己传送到搜索引擎查阅资料,这里不介绍了,
36.现在进入CPU的维度上去讨论调度问题(多CPU的机器很多,这里我们讨论的是同构多处理器),设计让多个CPU共享任务队列会涉及到一个“亲和度”,所谓的“CPU亲和度”就是CPU能否很好的适合其他CPU执行过的进程,就好比研究“鳏夫寡妇”能否和睦相处,是不是很有意思?其中不允许这种“转嫁”行为的叫硬亲和度,linux系统就是这种类型的,允许这种行为,但不保证可行的叫“软亲和度”。
37.解决了CPU亲和度的问题后,就要解决多核CPU的另一个大难题:“多核CPU的负载均衡问题”,负载均衡使得所有CPU都拥有自己的执行队列,多核CPU的执行时复杂的问题,我的资料缺页了,所以很抱歉。
38.顺道提一个“在多级反馈队列中,通常优先级与时间片的长度成反比,高优先级时间片短”,比如windows和solaris。而linux则反着来。
39.linux中,静态优先级一般为实时任务,而动态优先级会随着IO的沉睡时间来调参任务的优先级nice(+5或-5)。
40.对CPU的调度算法最好根据系统的使用场景来决定,比如Windows XP的前台进程的时间片数量会比后台进程的时间片数量多3倍。常用的考量参数:cpu的使用率,和cpu的吞吐量,吞吐量涉及周转时间和所有任务执行的总时间等等。
有简单的短期调度算法"FCFS先进先服务调度"的算法,这个算法CPU会有很时间花在等待上;
第二个稍微复杂的"短作业优先调度"算法,这个算法适合长期调度,特别是线程执行时间长短差异较大,这个算法有个问题就是怎么预测执行时间;
第三个就是“优先级调度”,每个线程都有执行的优先级,优先级低的作业要让步给优先级高的,这个算法容易出现低优先级线程久久未被执行,也就我们说的线程饥饿,解决办法就是“优先级衰老机制”,没过10分钟就会把所有等待线程的优先级-1,有个需要注意的是,假定优先级由低到高为" 127 - 0 " ,原本优先级为127(最低优先级),-1后变成0;
---------------------------------------在讲第四种之前要一个华丽的分割线-----------------------------------------
因为前面几种算法都是在强调 “被调度的作业是不可分割的原子”。而第四种算法则认为被调度的作业是可以被分割成很多时间片的。同时
轮转法调度被称为:一种最古老,最简单,最公平且使用最广的算法。
第四个算法是“轮转法调度”,这个算法就是把所有作业切成小时间片,所有进程都公平的执行一个小片段后就退让出CPU,这个算法有个缺点: 时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折衷。
第五个算法,我们可以给把任务按照需求分到不同的队列,不同的队列采用不同的算法,这个叫做“多级队列调度”,这是从队列数目的层面上对调度算法的优化,这个算法相比于前四个没那么精华。
再透露一个秘密,上面的算法很少单独使用,换句话说实际应用场景中的调度算法更复杂,比如上面5个算法可以同时使用。
这个算法的名字叫“多级反馈队列调度算法”,自己传送到搜索引擎查阅资料,这里不介绍了,
36.现在进入CPU的维度上去讨论调度问题(多CPU的机器很多,这里我们讨论的是同构多处理器),设计让多个CPU共享任务队列会涉及到一个“亲和度”,所谓的“CPU亲和度”就是CPU能否很好的适合其他CPU执行过的进程,就好比研究“鳏夫寡妇”能否和睦相处,是不是很有意思?其中不允许这种“转嫁”行为的叫硬亲和度,linux系统就是这种类型的,允许这种行为,但不保证可行的叫“软亲和度”。
37.解决了CPU亲和度的问题后,就要解决多核CPU的另一个大难题:“多核CPU的负载均衡问题”,负载均衡使得所有CPU都拥有自己的执行队列,多核CPU的执行时复杂的问题,我的资料缺页了,所以很抱歉。
38.顺道提一个“在多级反馈队列中,通常优先级与时间片的长度成反比,高优先级时间片短”,比如windows和solaris。而linux则反着来。
39.linux中,静态优先级一般为实时任务,而动态优先级会随着IO的沉睡时间来调参任务的优先级nice(+5或-5)。
40.对CPU的调度算法最好根据系统的使用场景来决定,比如Windows XP的前台进程的时间片数量会比后台进程的时间片数量多3倍。常用的考量参数:cpu的使用率,和cpu的吞吐量,吞吐量涉及周转时间和所有任务执行的总时间等等。