4.1举两个多线程程序设计的例子来说明多线程不比单线程方案提高性能
答:1)任何形式的顺序程序对线程来说都不是一个好的形式。例如一个计算个人报酬
的程序。
2)另外一个例子是一个“空壳”程序,如C-shell和korn shell。这种程序
必须密切检测其本身的工作空间。如打开的文件、环境变量和当前工作目录。
4.2描述一下线程库采取行动进行用户级线程上下文切换的过程
答:用户线程之间的上下文切换和内核线程之间的相互转换是非常相似的。但它依赖于线程库和怎样把用户线程指给内核程序。一般来说,用户线程之间的上下文切换涉及到用一个用户程序的轻量级进程(LWP)和用另外一个线程来代替。这种行为通常涉及到寄存器的节约和释放。
4.3在哪些情况下使用多内核线程的多线程方案比单处理器系统的单个线程方案提供更好
的性能。 答:当一个内核线程的页面发生错误时,另外的内核线程会用一种有效的方法被转换成
使用交错时间。另一方面,当页面发生错误时,一个单一线程进程将不能够发挥有效性能。因此,在一个程序可能有频繁的页面错误或不得不等待其他系统的事件的情况下,多线程方案会有比单处理器系统更好的性能。
4.4以下程序中的哪些组成部分在多线程程序中是被线程共享的? a.寄存值 b.堆内存 c.全局变量 d.栈内存 答:一个线程程序的线程共享堆内存和全局变量,但每个线程都有属于自己的一组寄存
值和栈内存。
4.5一个采用多用户线程的多线程方案在多进程系统中能够取得比在单处理器系统中更好
的性能吗?
答:一个包括多用户线程的多线程系统无法在多处理系统上同时使用不同的处理器。
操作系统只能看到一个单一的进程且不会调度在不同处理器上的不同进程的线程。因此,多处理器系统执行多个用户线程是没有性能优势的。
4.6就如4.5.2章节描述的那样,Linux没有区分进程和线程的能力。且Linux线程都
是用相同的方法:允许一个任务与一组传递给clone()系统调用的标志的进程或线程。但许多操作系统,例如windows XP和Solaris,对进程和线程都是一视同仁。基本上,这种使用notation的系统,一个进程的数据结构包括一个指向属于进程的不同线程的指针。区别建模过程和在内核中线程的两种方法。
答:一方面,进程和线程被视为相似实体的系统中,有些系统代码可以简化。例如,
一个调度器可以在平等的基础上考虑不同的进程和线程,且不需要特殊的代码,在调度中审查有关线程的进程。另一方面,这种统一会使进程资源限制更加困难。相反,一些额外的复杂性被需要,用来确定哪个线程与哪个进程一致和执行重复的计数任务。
4.7由4.11给出的程序使用了Pthread的应用程序编程接口(API),在程序的第c行
和第p行分别会输出什么?
答:c行会输出5,p行会输出0.
4.8考虑一个多处理器系统和用多线程对多线程模式编写的多线程程序。让程序中的用户线
程数量多于系统中的处理器的数量,讨论下列情况下的性能意义:
a.由程序分配的内核线程的数量比处理器少 b. 由程序分配的内核线程的数量与处理器相同
c. 由程序分配的内核线程的数量大于处理器数量但少于用户线程的数量
答:当内核线程的数量少于处理器时,一些处理器将仍然处于空闲状态。因为,调度图中
只有内核线程的处理器,而不是用户线程的处理器。当程序分配的内核线程的数量与处理器相同时,那么有可能所有处理器将同时使用。然而,当一个内核块内的内核(因页面错误或同时援引系统调用)相应的处理器将闲置。当由程序分配的内核线程的数量大于处理器数量时,封锁一个内核线程并调出,换入另一个准备执行的内核线程。因此,增加多处理器系统的利用率。
第五章 CPU调度
5.1为什么对调度来说,区分I/0限制的程序和CPU限制的程序是重要的?
答:I/0限制的程序有在运行I/O操作前只运行很少数量的计算机操作的性质。这种
程序一般来说不会使用很多的CPU。另一方面,CPU限制的程序利用整个的时间片,且不做任何阻碍I/O操作的工作。因此,通过给I/O限制的程序优先权和允许在CPU限制的程序之前运行,可以很好的利用计算机资源。
5.2讨论以下各对调度标准在某种背景下会有的冲突 a.CPU利用率和响应时间
b.平均周转时间和最大等待时间 c.I/O设备利用率和CPU利用率 答:a.CPU利用率和响应时间:当经常性的上下文切换减少到最低时,CPU利用率增加。
通过减少使用上下文切换程序来降低经常性的上下文切换。但这样可能会导致进程响应时间的增加。
b.平均周转时间和最大等待时间:通过最先执行最短任务可以使平均周转时间最
短。然而,这种调度策略可能会使长时间运行的任务永远得不到调度且会增加他们的等待时间。
c.I/O设备利用率和CPU利用率:CPU利用率的最大化可以通过长时间运行CPU
限制的任务和同时不实行上下文切换。I/O设备利用率的最大化可以通过尽可能调度已经准备好的I/O限制的任务。因此,导致上下文切换 。
5.3考虑指数平均公式来预测下一次CPU区间的长度,使用以下参数值会有什么影响? a.a=0和t=100毫秒 b.a=0.99和t=10毫秒
答:当a=0和t=100毫秒时,公式总是会预测下一次的CPU区间为100毫秒。当
a=0.99和t=10毫秒时,进程最近的行为是给予更高的重量和过去的就能成相比。因此,调度算法几乎是无记忆的,且简单预测未来区间的长度为下一次的CPU执行的时间片。
5.4考虑下列进程集,进程占用的CPU区间长度以毫秒来计算:
进程 区间时间 优先级 P1 10 3 P2 1 1 P3 2 3 P4 1 4 P5 5 2
假设在时刻0以进程P1,P2,P3,P4,P5的顺序到达。
a.画出4个Gantt图分别演示用FCFS、SJF、非抢占优先级(数字小代表优先级高)和RR(时间片=1)算法调度时进程的执行过程。
b.在a里每个进程在每种调度算法下的周转时间是多少? c.在a里每个进程在每种调度算法下的等待时间是多少?
d.在a里哪一种调度算法的平均等待时间对所有进程而言最小? 答:a.甘特图略 b.周转时间 P1 P2 P3 P4 P5 c.等待时间 P1 P2 P3 P4 P5 FCFS 0 10 11 13 14 RR 9 1 5 3 9 SJF 9 0 2 1 4 非抢占优先级 6 0 16 18 2 FCFS 10 11 13 14 19 RR 19 2 7 4 14 SJF 19 1 4 2 9 非抢占优先级 16 1 18 19 6 d.SJF 5.5下面哪些算法会引起饥饿
a.先来先服务
b.最短工作优先调度 c.轮换法调度 d.优先级调度
答:最短工作优先调度和优先级调度算法会引起饥饿
5.6考虑RR调度算法的一个变种,在这个算法里,就绪队列里的项是指向PCB的指针。 a.如果把两个指针指向就绪队列中的同一个进程,会有什么效果? b.这个方案的主要优点和缺点是什么?
c.如何修改基本的RR调度算法,从而不用两个指针达到同样的效果?
答.a.实际上,这个过程将会增加它的优先权,因为通过经常得到时间它能够优先得以
运行。
b.优点是越重要的工作可以得到更多的时间。也就是说,优先级越高越先运行。然
而,结果将由短任务来承担。
c.分配一个更长的时间给优先级越高的程序。换句话说,可能有两个或多个时间片在
RR调度中。
5.7考虑一个运行十个I/O限制任务和一个CPU限制任务的系统。假设,I/O限制任务一次分配给一个I/O操作1毫秒的CPU计算,但每个I/O操作的完成需要 10毫秒。同时,假设间接的上下文切换要0.1毫秒,所有的进程都是长进程。对一个RR调度来说,以下情况时CPU的利用率是多少: a.时间片是1毫秒 b.时间片是10毫秒
答:a.时间片是1毫秒:不论是哪个进程被调度,这个调度都会为每一次的上下文切换花费一个0.1毫秒的上下文切换。CPU的利用率是1/1.1*100=92%。
b.时间片是10毫秒:这I/O限制任务会在使用完1毫秒时间片后进行一次上下文切换。这个时间片要求在所有的进程间都走一遍,因此,10*1.1+10.1(因为每个I / O限定任务执行为1毫秒,然后承担上下文切换的任务,而CPU限制任务的执行10毫秒在承担一个上下文切换之前) 。因此,CPU的利用率是20、21.1*100=94%。
5.8考虑一个实施多层次的队列调度系统。什么策略能够使一个计算机用户使用由用户进程分配的最大的CPU时间片。 答:这个程序可以使分配给它的没有被完全利用的CPU时间最大化。它可以使用分配给它的时间片中的绝大部分,但在时间片结束前放弃CPU,因此提高了与进程有关的优先级。
1. 5.9考虑下面的基于动态改变优先级的可抢占式优先权调度算法。大的优先权数代表高优先权。当一个进程在等待CPU时(在就绪队列中,但未执行),优先权以α速率改变;当它运行时,优先权以速率β改变。所有的进程在进入就绪队列时被给定优先权为0。参数α和β可以设定给许多不同的调度算法。 a.β>α>0时所得的是什么算法? b.α<β<0时所得的是什么算法? 答:a.FCFS b.LIFO 5.10解释下面调度算法对短进程编程度上的区别: a.FCFS b.RR
c.多级反馈队列
答:a.FCFS----区别短任务是因为任何在长任务后到达的短任务都将会有很长的等待时间。 b.RR-----对所有的任务都是能够相同的(给它们相同的CPU时间区间),所以,短任务
可以很快的离开系统,只要它们可以先完成。 c. 多级反馈队列和RR调度算法相似——它们不会先选择短任务。
5.11用Window XP的调度算法,下列什么是数字优先的线程。
a.相对优先级的值为REALTIME_PRIORITY_CLASS的属于实体优先类型的线程 b.相对优先级的值为NORMAL_PRIORITY_CLASS的属于NORMAL类型的线程 c.相对优先级的值为HIGH_PRIORITY_CLASS的属于ABOVE_NORMAL类型的线程 答:a.26 b.8 c.14
5.12考虑在Solaris操作系统中的为分时线程的调度算法:
a:一个优先权是10的线程的时间片是多少?优先权是55的呢?
b:假设优先权是35的一个线程用它所有的时间片在没有任何阻止的情况下,这调度算法将会分配给这个线程什么样新的优先权?
c:假设一个优先权是35的线程在时间片结束前阻止I/O操作。这调度算法将会分配给这个线程什么样新的优先权?
答:a:160和40 b:35 C:54
5.13传统UNIX调度在优先数和优先级间成反比关系:数字越高,优先权越低。该调度进程利用下面的方程重新计算进程的优先权一次一秒: 优先权= (最近CPU使用率/ 2 ) +基本数
这里的基本数= 60,最近的 CPU使用率是指一个表明优先权从上一次重新计算后开始进程被CPU使用的情况。
假设最近进程p1的CPU使用率是40个,p2是18 ,p3是10。当优先权重新计算后这三个进程的新的优先权是什么?在此信息的基础上,传统UNIX的调度会不会提高或降低CPU限制的进程的相对优先权?
答 : 分配给这些进程的优先权分别是80,69和65.这调度降低了CPU限制的进程的相对优先权。
第六章 管程
6.1第一个著名的正确解决了两个进程的临界区问题的软件方法是Dekker设计的。两个进程P0和P1共享以下变量:
boolean flag[2]; /*initially false*/ int turn;
进程Pi(i==0或1)和另一个进程Pj(j==0或1)的结构见图7.27。 证明这个算法满足临界区问题的所有三个要求。
do{
flag[i]=ture; while(flag[j]){
if(turn==j){ flag[i]=false; while(turn==j); flag[i]=true; } }
临界区
turn=j;
flag[i]=false;
剩余区
}while(1);
图7.27 Dekker算法中的进程Pi结构
答:该算法满足三个相互排斥条件。(1)相互排斥是为了确保使用的变量和标志是可变的。如果所有进程都把他们的变量设置为真,只有一个会成功,那就是哪个进程轮到的问题了。等待中的进程只能够进入它的重要部分当其他进程在更新变量值时。
因篇幅问题不能全部显示,请点此查看更多更全内容