现代操作系统课后答案中文WORD.docx
- 文档编号:5420015
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:27
- 大小:49.09KB
现代操作系统课后答案中文WORD.docx
《现代操作系统课后答案中文WORD.docx》由会员分享,可在线阅读,更多相关《现代操作系统课后答案中文WORD.docx(27页珍藏版)》请在冰点文库上搜索。
现代操作系统课后答案中文WORD
MODERNOPERATINGSYSTEM
第一章答案
1.操作系统必须向用户提供一台扩展(即,实际上)的机器,和它必须管理I/O设备和其它系统资源。
2.多道程序就是CPU在内存中多个进程之间迅速切换。
它一般被用来使CPU保持忙碌,当有一个或多个进程进行I/O时。
3.输入spooling是作业中的读入技术,例如,从卡片在磁盘,这样当当前执行的进程完成时,将等候CPU。
输出spooling在打印之前首先复制打印文件,而非直接打印。
在个人计算机上的输入spooling很少,但是输出spooling非常普遍。
4.多道程序的主要原因是当等候I/O完成时CPU有事可做。
如果没有DMA,I/O操作时CPU被完全占有,因此,多道程序无利可图(至少在CPU利用方面)。
无论程序作多少I/O操作,CPU都是100%的忙碌。
当然,这里假定主要的延迟是数据复制时的等待。
如果I/O很慢的话,CPU可以做其它工作。
5.第二代计算机没有必要的硬件保护操作系统免受恶意的用户程序的侵害。
6.它依然存在。
例如,Intel以各种各样的不同的属性包括速度和能力消耗来生产PentiumI,II,III和4。
所有这些机器的体系结构都是兼容的,仅仅是价格上的不同,这些都是家族思想的本质。
7.25X80字符的单色文本屏幕需要2000字节的缓冲器。
1024X768象素24位颜色的位图需要2359296字节。
1980年代这两种选择将分别地耗费$10和$11520。
而对于当前的价格,将少于$1/MB。
8.选择(a),(c),(d)应该被限制在内核模式。
9.个人的计算机系统总是交互式的,而且经常只有一个用户。
而大型机系统几乎总有许多用户强调批处理或者分时。
除了对所有资源的有效使用,大型机系统上的保护更加重要。
10.从管道中每纳秒出现一条指令。
意味着该机器每秒执行十亿条指令。
它对于管道有多少个阶段全然不予理睬。
即使是10-阶段管道,每阶段1nsec,也将执行对每秒十亿条指令。
因为无论那种情况,管道末端输出的指令数都是一样的。
11.原稿包含80X50X700=2800000字符。
当然,这不可能放入任何目前的CPU中,而且对于1MB的cache来说也太大了,但是如果可能的话,在寄存器中只需2.8msec,在Cache中需要5.8msec。
整本书大约有2700个1024字节的数据块,因此从磁盘扫描大约为27秒,从磁带扫描则需2分钟7秒。
当然,这些时间仅为读取数据的时间。
处理和重写数据将增加时间。
12.从逻辑上说,边界寄存器使用虚拟地址或者物理地址没有任何关系。
然而,前者的性能更好。
如果使用虚拟地址,虚拟地址和基址寄存器的相加,与比较可以同时开始,而且可以
并行。
如果使用物理地址,相加完成之前是不能进行比较的,这就增加了存取时间。
13.也许。
如果调用者取回控制,并且在最终发生写操作时立即重写数据,将会写入错误的数据。
然而,如果驱动程序在返回之前首先复制将数据复制到一个专用的缓冲器,那么调用者可以立即继续执行。
另一个可能性是允许调用者继续,并且在缓冲器可以再用时给它一个信号,但是这需要很高的技巧,而且容易出错。
14.陷井由程序造成的,并且与它同步。
如果程序一而再地被运行,陷井将总在指令流中相同位置的精确发生。
而中断则是由外部事件和其时钟造成的,不具有重复性。
15.Base=40000,Limit=10000。
按照本书中描述的方法Limit=50000是不正确的。
这种方法也是可以执行的,不过这样做将等待addree+Base完成后才能开始边界检查,将会使计算机速度减慢。
16.进程表是为了存储当前被挂起、甚或是被延迟和阻塞的进程状态。
在单一进程的系统中是不需要,因为单一进程从不挂起。
17.装配文件系统将使得装配目录中已有的任何文件都不可访问,因此装配点通常都是空的。
然而,系统管理人员可能需要将某些位于被装配目录中的非常重要的文件复制到装配点,使得他们在进行设备检查或修理时,可以在紧急事件中的普通路径上找到这些文件。
18.如果进程表中没有空闲的槽(或者没有内存和交换空间),Fork将失败。
如果所给的文件名不存在,或者不是一个有效的可执行文件,Exec将失败。
如果将要解除链接的文件不存在,或者调用Unlink的进程没有权限,则unlink将失败。
19.如果fd不正确,调用失败,将返回.1.。
同样,如果磁盘满,调用也失败,要求写入的字节数和实际写入的字节数可能不等。
在正确终止时,总是返回nbytes。
20.包含字节:
1,5,9,2。
21.块特殊文件包含被编号的块,每一块都可以独立地读取或者写入。
而且可以定位于任何块,并且开始读出或写入。
这些对于字符特殊文件是不可能的。
22.系统调用实际上并没有名称,除了在文件中这样描述之外。
当库例程read陷入内核时,它将系统调用号码放入寄存器或者堆栈中。
该号码通常用于一张表的索引。
这里确实没有使用任何名称。
而另一方面,库例程的名称是十分重要的,因为它将用于程序中。
23.是的,尤其当系统内核是消息传递系统时。
24.就程序逻辑而言,库例程调用哪个系统调用是没有关系的。
但是,如果需要考虑性能问题,无需系统调用就可以完成的任务将使程序运行更快。
所有的系统调用都会导致用户环境和内核环境的切换开销。
更进一步,在多用户系统中,在系统调用完成之前,操作系统可能调度到其他的进程,这将使得调用过程的处理更加迟缓。
25.某些UNIX调用没有相应的Win32API:
Link:
Win32程序不能给文件另外一个名称,或者使某个文件出现在多个目录中。
同时,试图创建链接可以便于测试,并且在文件上加锁。
Mount和umount:
Windows程序不能创建关于标准的路径的假定命名,因为具有多个磁盘驱动器的系统上路径名,其驱动器部分是不同的。
Chmod:
Windows程序员不得不假定所有的用户都能访问每个文件。
Kill:
Windows程序员不能kill行为失常的程序。
26.这些都可以直接转换:
(a)microyear=106X365X24X3600=31.536sec。
(b)1km。
(c)有240字节,也就是1,099,511,627,776字节。
(d)它是6X1024公斤。
SOLUTIONSTOCHAPTER2PROBLEM
1.从阻塞到运行的转换是可以想象的。
假设某个进程在I/O上阻塞,而且I/O结束,如果此时CPU空闲,该进程就可以从阻塞态直接转到运行态。
而另外一种转换(从阻塞态到就绪态)是不可能的。
一个就绪进程是不可能做任何会产生阻塞的I/O或者别的什么事情。
只有运行的进程才能被阻塞。
2.应该有一个寄存器包含当前进程表项的指针。
当I/O结束时,CPU将把当前的机器状态存入到当前进程表项中。
然后,将转到中断设备的中断向量,读取另一个过程表项的指针(服务例程)。
然后,就可以启动这个进程了。
3.通常,高级语言不允许访问CPU硬件,而这种访问是必需的。
例如,中断处理程序可能需要禁用和启用某个特定设备的中断服务,或者处理进程堆栈区的数据。
另外,中断服务例程需要尽快地执行。
4.内核使用单独的堆栈有若干的原因。
其中两个原因如下:
首先,不希望操作系统崩溃,由于某些用户程序不允许足够的堆栈空间。
第二,如果内核将数据保留在用户空间,然后从系统调用返回,那么恶意的用户可能使
用这些数据找出某些关于其它进程的信息。
5.即使是有可能实现,也是很难保持文件系统的一致性。
假设某个客户进程给服务器进程1
发送请求要更新文件。
该进程更新其内存的cache项。
然后,另一个客户进程给服务器进程
2发送请求读取该文件。
不幸的是,如果该文件还在cache中,服务器进程2对此毫不知情,将返回过时的数据。
如果第一个进程在缓冲后将文件写到磁盘中,而服务器进程2每次读取时检查磁盘其缓存的备份是否是最新的,系统还可以工作,但是需要避免磁盘访问的所有缓存系统。
6.当线程停止时,其值保留在寄存器中。
当进程停止时寄存器必须被保存。
分时线程与分时进程没有区别,因此每个线出都需要其自己的寄存器保存区。
7.不会。
如果单线程进程在键盘上阻塞,就不能创建子进程。
8.当工作者线程从磁盘读取Web页时,它就会被阻塞。
如果使用用户级线程,该动作将阻塞整个进程,而破坏多线程的价值。
这就是使用内核线程的原因:
某些线程的阻塞不会影响到其他线程。
9.进程中的线程是相互协作的,而不是相互对立的。
如果放弃是为了应用程序,那么线程将放弃CPU。
毕竟,通常是同一个程序员写的代码。
10.用户级线程不能按时钟剥夺,除非整个进程的时间片用完。
内核级线程可以单独地被剥夺。
在后一种情况下,如果线程运行过久,时钟将中断该当前进程,因而当前线程也被中断。
内核可以自由地从同一个进程中选取其他线程运行。
11.在单线程情况下,cache命中需15msec,cache未命中需要90msec。
其加权平均为2/3*
15+1/3*90。
因此,平均请求为40msec,而服务器每秒可处理25个。
对于多线程服务器,所有磁盘等待都是重叠的,因此每个请求都耗时15msec,而服务器每秒可处理66.6666个请求。
12.是的。
如果服务器是完全CPU绑定的,则不需要多线程。
这只会增加不必要的复杂性。
假设某个百万人口区域的电话查号系统(类似于114),如果每个(姓名,电话号码)记录为64个字符,整个的数据库则为64MB,这就很容易全部读入服务器内存中以提供快速的查询。
13.指针是确实必要的,因为全局变量的大小是未知的。
它可能是从字符到浮点数数组的任何类型。
如果保存其值,就不得不把其大小传递给create_global,这都没有问题,但是必须将其类型作为set_global的第二个参数,那么read_global返回值的类型是什么呢?
14.runtime系统可以正好在这一时刻阻塞或者解除阻塞某个线程,并且忙于处理调度队列。
此时并不适合于时钟中断处理程序开始检查该队列是否应该进行线程切换,因为它们可能处于不一致的状态。
解决方法可以是:
当进入runtime系统后,设置一个标志。
时钟处理程序将看到该标志,并且设置其自己的标志,然后返回。
当runtime系统完成时,它将检测时钟标志,看是否有时钟中断发生,并且现在运行时钟处理程序。
15.这是可能的,不过效率很低。
线程想要做一个系统调用,首先设定警报定时器,然后才执行调用。
如果线程阻塞,定时器将控制归还给线程包。
当然,大多数调用是不阻塞的,而定时器必须被清除。
每个可能被阻塞的系统调用都必须作为3个系统调用来执行。
如果定时器过早时效,各种问题都可能发生。
用这种方法建立线程包并不好。
16.当低优先级进程位于其临界区,而高优先级进程就绪并且被调度时,将发生优先级倒置问题。
如果使用忙等待,它将一直运行。
对于用户级线程,不可能发生低优先级线程突然被剥夺而允许高优先级线程运行,因为是不可剥夺的。
而内核级线程,就会出现这个问题。
17.每个线程都是自己调用例程,因此它必须有其自己的堆栈以保存局部变量、返回地址等等。
这一点用户级线程和内核级线程是一样的。
18.竞争条件是指如下的情形:
两个(或多个)进程将要执行某些动作,其执行依赖于准确的定时。
如果某个进程首先执行,所有事件顺利完成,但是如果另一个先执行,则会产生致命的错误。
19.是。
模拟的计算机可能是多道程序的。
例如,当进程A运行时,它读出某些共享变量。
然后,发生一个模拟时钟计时,而进程B运行。
它也读出相同的变量。
接着,它把该变量加
1。
当进程A运行时,如果它也是给变量加1,就会产生竞争条件。
20.是,它还是有用的。
当然,它依然是忙等待。
21.该方法对可剥夺调度完全没问题。
事实上,它就是为这种情况设计的。
当调度为不可剥夺的,该方法将会失败。
假设turn初值为0,而进程1首先运行。
它将一直循环,永不释放CPU。
22.当然可以。
将内存字作为标志,0表示没有进程使用临界变量,1表示有某个进程正在使用。
将1放入寄存器中,并且交换内存字和寄存器。
如果寄存器在交换后为0,则准许访问。
如果它包含1,则拒绝访问。
当进程完成时,将0存储在内存标志中。
23.执行信号量操作,操作系统首先要禁用中断。
然后,它读取信号量的值。
如果执行down操作,而信号量等于0,就将调用进程放入与信号量有关的阻塞进程列表中。
如果执行up操作,必须检测看是否有任何进程在信号量上被阻塞。
如果有一个或多个进程被阻塞,从阻塞进程的列表中移出一个,使之就绪。
当所有这些操作都完成后,就可以开启中断了。
24.将每个计数信号量与2个二值信号量联合:
M用于互斥;B用于阻塞。
另外,每个计数
信号量都组合一个用于保存up次数减去down次数的计数器,以及在该信号量上阻塞的进程列表。
为了实现down操作,进程首先通过对M执行down操作,以获得对信号量、计数器以及列表的独占访问权。
然后,将计数器减1。
如果大于等于0,只需对M执行up操作并退出即可。
如果M为负数,就将该进程放入阻塞进程列表中。
接着,对M执行up操作,对B执行down操作来阻塞该进程。
为了实现up操作,首先对M执行down操作以获得互斥,然后将计数器加1。
如果计数器大于0,则没有进程阻塞,就只需对M执行up操作。
不过,如果计数器小于等于0,则必须从列表中移出某些进程。
最后,按次序对B和M执行up操作。
25.如果程序操作按阶段执行,直到两个进程都完成当前阶段才能进入下一阶段,这时就应该使用屏障。
26.对于时间片轮转调度,该方法不会出现问题。
L迟早会运行,而且最终将离开其临界区。
对于优先级调度,L永远得不到运行;而对于时间片轮转,它将周期性地得到一时间片,因此就有机会离开其临界区。
27.对于内核线程,线程可以在信号量上阻塞,而内核可以运行该进程中的其它线程。
因而,使用信号量没有问题。
而对于用户级线程,当某个线程在信号量上阻塞时,内核将认为整个进程都被阻塞,而且不再执行它。
因此,进程失败。
28.其实现的代价很高。
每次在某些等待变化的进程的谓词中出现的任何变量,runtime系统都必须重新计算该谓词,以判断该进程是否能够被解锁。
而对于Hoare和BrinchHansen管程,则只需signal原语即可唤醒进程。
29.雇员之间通过消息传递进行通信:
在该例中,消息为订单、食物和袋子。
在UNIX中,该4个进程通过管道连接。
30.它不会导致竞争条件(不会丢失任何东西),不过它是完全的忙等待。
31.如果某个哲学家阻塞,其邻居稍后能够在test中检测其状态,发现他已经饥饿,当叉子可用时,就可以唤醒他了。
32.该变化将意味着在哲学家停止进餐后,他的邻居都不能接着被选择。
事实上,他们永远不会被选择。
假设哲学家2完成了进餐,他将为哲学家1和3运行test,而两者都不会被启动,即使他们两个都饿了而且两个叉子都是可用的。
类似的,如果哲学家4完成进餐,哲学家3也不会被启动。
他将无法启动。
33.变种1:
读者优先。
当读着活跃时,写者都无法启动。
当一个新的读者出现时,它可以立即开始除非当前有写者是活跃的。
当写者完成时,如果有读者在等待,他们全都启动,无论是否有写者存在。
变种2:
写者优先。
当有写者等待时,读者都不会开始。
当最后活跃的进程结束,如果有作者,就启动它;否则,所有读者(如果有)全部开始。
变种3:
平衡的版本。
当有读者是活跃的,新的读者可以立即开始。
当写者完成时,新的写者优先,如果有写者等待的话。
也就是说,一旦开始读,就一直读到没有读者为止。
同样地,一旦开始作,所有挂起的写者都被允许运行。
34.它将需要nTsec。
35.如果进程在列表中出现多次,它在每个周期内得到多个时间片。
这种方法可以用来给重
要的进程更多的CPU时间。
但是当该进程阻塞时,最好从可运行进程的列表中将其所有项都删除。
36.在简单的情况下是有可能通过看源代码来判断是否为I/O绑定的。
例如,程序开始时,将其所有输入文件读入到缓冲器中,这种程序通常不是I/O绑定的;但是,对不同文件进行增量地读写(诸如编译程序)的问题很有可能是I/O绑定的。
如果操作系统提供诸如UNIXps的命令,就可以得知被程序使用的CPU时间的量,你能把这个时间量与整个的时间比较以判断。
当然,最有意义就是你是系统中唯一的用户。
37.对于管道中的多个进程,普通的父进程可以将数据流的信息传递给操作系统。
有了这个信息,OS就可以确定哪个进程可以向需要输入的阻塞进程提供输出。
38.CPU的效率就是有用的CPU时间除以整个的CPU时间。
当Q≥T时,基本的周期就是进程运行T,然后进程切换S。
因此,(a)和(b)的效率都是T/(S
+T)。
当时间片比T短时,每运行一次T就要求T/Q次进程切换,浪费时间为ST/Q。
因此,其效率为
T
T+ST/Q
也就是下降到Q/(Q+S),这就是(c)的答案。
至于(d),只需以S替代Q,就可以计算出其效
率为50%。
最后,(e)的效率趋近于0。
39.最短作业优先可以使得平均响应时间最短。
0 X,3,5,6,9. 3 3,X,5,6,9. 5 3,5,X,6,9. 6 3,5,6,X,9. X>9: 3,5,6,9,X. 40.对于时间片轮转,在头10分钟里,每个作业获得1/5的CPU时间。 在第10分钟时,C结束。 在接下来的8分钟里,每个作业获得1/4的CPU时间,然后D完成。 然后,在接下来的6分钟内,余下的3个作业各获得1/3的CPU时间,直到B结束,以此类推。 因此,5个作业的完成时间分别为是10,18,24,28和30,平均为22分钟。 对于优先级调度,B最先运行,6分钟完成。 其它作业分别在第14,24,26和30分钟完成,平均为18.8分钟。 如果作业按AÎE的次序执行,则分别在第10,16,18,22和30分钟完成,因此,平均为 19.2分钟。 最后,最短作业优先调度的完成时间分别为第2,6,12,20和30分钟,平均为14分钟。 41.第一次得到1个时间片。 随后获得2,4,8和15个时间片,因此必须经过5次交换。 42.可以检查程序是否期待输入,并且对输入进行处理。 不期待输入也不对输入进行处理的程序将不得到任何特殊的优先级提升。 43.预测值为40/8+20/8+40/4+15/2=25。 44.所使用的CPU的片断为35/50+20/100+10/200+x/250。 为了使得进程可调度,必须是总和小于1。 因此,x必须小于12.5msec。 45.当内存太小不能载入所有就绪进程时,就需要使用两级调度。 某些进程被载入内存,并且从中选择一个运行。 内存中进程会随着时间调整。 这种算法容易实现也非常有效,另外,时间片轮转调度并不管进程是否在内存中。 SOLUTIONSTOCHAPTER3PROBLEM 1.在美国的,假设有三个或更多候选人竞选总统。 每个人都不足多数,又都不愿放弃。 这就是死锁。 2.如果打印机在收到整个文件之前开始打印(加速响应),磁盘可能被其他请求文件装满,而其他文件又必须等到第一个文件完成后才能开始,但是磁盘空间又无法接受当前文件。 如果后台打印直到整个的文件接受后才开始打印文件,就可以拒绝大的请求。 开始打印文件相当于保留打印机;如果将打印机保留到整个文件接受后,整个系统就可以避免死锁。 当然无法容纳的文件仍然是死锁的,必须另选其他设备打印较大的文件。 3.打印机是不可剥夺的;系统在完成前一个作业之前,不能开始打印另一个作业。 Spool磁盘是可剥夺的;假设协议允许的话,可以删除未发送完毕的大文件,让用户稍后再发送。 4.是的,没有任何区别。 5.是的,还有其他形式的图表。 我们声明资源只能由单个的进程占用。 由资源方块到进程圆圈的弧线表明该进程拥有该资源。 因此,具有从两个或更多弧线的方块意味着所有这些进程都占用该资源,这是与规则不符的。 因而,有多重的出弧的方块,而结束于不同的圆圈的任何图表都是不合规则的。 从方块到方块的弧,以及从圆圈到圆圈的弧也是违反规则的。 6.可以将部分资源预留,只能由管理员自己的进程使用,这样就可以运行外壳和程序,对死锁做出评估,以杀死某些进程是系统可以继续运行。 7.这些变化都不会导致死锁。 无论哪种情况,都没有出现循环等待。 8.资源的自愿放弃非常类似于通过剥夺进行恢复。 其主要区别在于计算机进程不能自己解决这种问题。 把操作系统作为警察,以覆盖独立进程所服从的一般规则。 9.该进程请求的资源比系统所有的资源要多。 没有什么方法可以获得这些资源,因此无法完成,即使其他进程不再请求资源。 10.如果系统有两个或多个CPU,两个或多个进程可以平行,就可导致斜向的轨迹。 11.是的。 可以在三维中实现。 Z轴用于表示第三个进程执行的指令。 12.该方法只能在预先确知什么时候使用资源的情况下才能进行调度。 在实践中,这是很少见的。 13.D的请求是不安全的,而C的请求是安全的。 已分配 请求矩阵 可用资源 A: 2000 1020 0121 B: 1000 0131 C: 0121 1010 14.某些状态是既非死锁也不安全的,但是这些状态会导致死锁状态。 例如,假设有4种资源: 磁带,绘图仪,扫描仪和CD-ROM,以及竞争这些资源的3个进程。 有下列的情形: 该状态并未死锁,因为还可以执行很多行动,例如,A仍然可以得到2台打印机。 然而,如 果每个进程都请求其剩余需求,就会导致死锁。 15.该系统是不会死锁的。 假设每个进程都已占用1个资源,还有1个资源是空闲的。 任一进程都可以请求该资源并且得到它,然后该进程能够完成并且释放2个资源。 因此,死锁是不可能的。 16.如果某个进程有m个资源,该进程就能完成,而不会造成死锁。 因此,最坏的情况是所有进程都占又m–1个资源,而且都再申请另一个。 如果系统还剩余1个资源,其中一个进程就能完成,并且释放其所有资源,同时也可以让其余进程也完成。 因此,避免死锁的条件就是r≥p(m-1)+1。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 现代 操作系统 课后 答案 中文 WORD