广工班操作系统课后答案.docx
- 文档编号:7365754
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:17
- 大小:29.08KB
广工班操作系统课后答案.docx
《广工班操作系统课后答案.docx》由会员分享,可在线阅读,更多相关《广工班操作系统课后答案.docx(17页珍藏版)》请在冰点文库上搜索。
广工班操作系统课后答案
吐血整理>_<所有题目+答案,绿色部分是答案漏了或者是我自己做的,请大家自己补上,其他答案提供者是雪梅(第一次弘扬上传的答案和今早那份答案的汇总版了),有兴趣的童鞋可以拿去打印,格式调好了梦婷
第一章P19
1-2.你对操作系统和用户程序之间的关系有何看法?
阐述你的看法。
操作系统和用户程序之间是相互调用的一种复杂的动态关系,操作系统通过虚拟机界面为用户程序提供某种服务,用户程序在运行的过程中不断使用操作系统提供的服务来完成自己的操作,主程序可以是操作系统或用户程序,子程序可以使用户程序或操作系统。
1-7.有人说设备管理软件(设备驱动程序)因为经常由第三方提供,因此不应该作为操作系统的一部分。
你对此有何看法?
你认为应该如何判断一个软件是否属于操作系统?
我认为设备管理软件不应作为操作系统的一部分。
因为由第三方提供,所以安全性得不到保证,而且不同的提供方提供的软件之间存在差异,兼容性上存在问题,或许软件不能在系统中运行。
判断一个软件是否属于操作系统,就要看它是否满足操作系统的功能,而且要看它安全性、健壮性能是否好。
第二章P37
2-3.计算机从过去单一操作员单一控制终端到现在的个人机,似乎我们转了一个圈。
是不是我们人类总喜欢反复无常呢?
请阐述你对这种否定之否定的观点.
不是反复无常,操作系统是根据时代的要求而发展的,单一操作员单一控制终端时代,计算机成本极高,人对计算机的要求是立即执行人发出的命令,随着时代的发展,人类要求计算机越来越小、越来越快、越来越便宜、利用率越来越高,现在低廉的价格和多样的功能,已使人们对计算机的期望变成个人工具。
所以这并不是反复无常,而是旋转式上升。
2-4.虽然我们不赞成对未来进行预测,但你是否对操作系统的未来演变有自己的看法呢?
一是向微内核方向发展,二是向大而全的全方位方向发展。
微内核操作系统虽然有不少人在研究,但在工业界获得的承认并不多。
这方面的代表有MACH系统。
在工业界来说,操作系统是向着多功能、全方位方向发展。
WINDOWSXP操作系统现在有四千万行代码,某些LINUX版本有2亿行代码,SOLARIS的代码行数也不断增多。
鉴于大而全的操作系统管理起来比较复杂,现代操作系统采取的都是模块化的方式:
即一个小的内核加上模块化的外围管理功能。
2-7.很多人都说,没有操作系统的计算机是一堆废铁,无法运转。
但在计算机刚诞生的时候,谁也不知道操作系统这回事儿。
那个时候的计算机为什么在没有操作系统的情况下能够运转呢?
它们又是如何运转呢?
操作系统的功能是将计算机以一个更加越容易,更加方便,更加强大的方式呈现给用户,管理计算机上软硬件资源,而初期没有操作系统的计算机复杂性并不高,人对计算机的要求也不高,仅靠人工命令操作即可,可以再BIOS操作,也可以用汇编语言操作CPU
2-9.MACH说提倡3的微内核操作系统因为运行效率低下而没有获得广泛的商业应用,你认为其效率低下的原因何在?
微内核系统功能单一,应用范围小,系统资源利用率低
第三章P56
3-3.有人认为,内核态程序可以访问任何资源的权限对系统安全造成严重威胁,你怎么看
内核态程序可以拥有更多资源,可以充分调度资源,提高效率。
但是内核态的安全问题非常重要,一旦内核态被劫持,操作系统就会失去控制。
所以要提高内核态的安全等级。
3-7.论述系统调用和壳之间的关系。
用户通过在壳上输入正确的指令调用系统调用,壳是包裹在操作系统外的一层外壳,让操作系统不被错误的指令操控。
3-9.fork是如何实现一次调用两次返回的?
它有必要么?
为什么?
有必要。
Fork语句创建了一个子进程,返回的时候,父进程返回的是子进程的ID,子进程返回的是0,通过判断返回值,知道这个是父进程还是子进程。
3-11.挑战题:
内核态的特权是如何实现的?
第四章P74
4-1.发明进程的根本动机是什么?
它与程序是什么关系?
请予以论述。
发明进程的根本动机是为了进行多道编程。
进程就是运行中的程序。
4-2.进程带给我们的最大好处是什么?
他又什么缺点么?
进程带给我们的最大好处是提高了CPU的利用率,但是进程不能同时处理多件事情,而且在阻塞的时候无法继续前进。
4-8.进程管理时两个重要考虑是公平和效率。
除此之外,还有什么因素需要考虑吗?
还需要考虑公平和效率哪方面更重要。
4-10.多道编程是否总能提高CPU的利用率?
为什么?
不是,当多道编程的度达到一定数量的时候,CPU利用率的提升空间就会很小,进程切换带来的系统消耗则变得非常明显。
4-12.分析:
在内核态下的继承通常共享一个地址空间,这是为什么?
操作系统内核对于此OS下的用户们来说只有一个,大家共享这套内核的资源,因此是同一套地址空间。
第五章P91
5-4.如果想让某个进程获得50%的运行机会,请问应该使用哪一种调度策略?
彩票调度算法
5-5.家丁有A、B、C3个进程,A、B均是纯计算进程,分别需要使用CPU计算50毫秒和100毫秒,而C每计算1毫秒后进行9毫秒的输入输出操作,并这样重复10次。
a)按顺序C、A、B几乎同时到达系统,给出FCFS的调度情况并计算系统响应时间
b)按顺序B、A、C几乎同时到达系统,给出FCFS的调度情况并计算系统响应时间。
如果使用时间片轮转,情况又如何?
这里假设时间片大小为10毫秒。
a)系统响应时间=100+50+100=250毫秒b)系统响应时间=50+100+100=250毫秒。
如果使用时间片轮转,系统响应时间=50+100+10=160毫秒。
5-7.优先级倒挂是怎么回事?
它有什么危害?
优先级倒挂是指一个低优先级的任务持有一个被高优先级认为所需要的共享资源。
危害是可能使高优先级进程一直不能获得资源造成系统故障,还可能造成系统性能降低。
5-8.请分析优先级倒挂的三种方法?
哪一种优势最明显?
优先级继承的优势明显。
5-12.如果一个进程在最后一个CPU任务结束后有一个很长的I/O操作,则在计算CPU响应时间的时候是否需要计入该I/O操作的耗时?
请说明你的理由.
我觉得应该计入CPU响应时间。
因为在I/O输入的时候,CPU不知道输入之后还是否需要进行计算,所以仍在等待,所以算CPU响应时间。
5-13.加入时间片轮转的时间片的大小事10毫秒,进程A在1毫秒的时候阻塞或者结束,进程B接着用该时间片,则进程B有的是9毫秒的时间片还是10毫秒?
为什么?
程序拥有的是10毫秒,因为时间片轮转是给每个程序固定的运行时间,程序切换之后,另外一个程序会重新获得这个固定的运行时间。
5-14.如果一个任务因为I/O操作阻塞了,其恢复后需要排到队尾等待么?
这个得看使用的是什么程序调度算法。
如果是FCFS算法,则不需要再等待。
第七章P123
7-2.用户态线程实现由于不能应对阻塞操作,有人认为其时没有任何用处的。
你持何种看法?
不赞同这种看法,用户态线程实现的切换效率高,具有比内核态更优的灵活性,而且用户态线程实现无需修改操作系统。
它的实现优势为现在操作系统线程实现提供了参考依据,所以它是有用的。
7-3.调度器激活时一种良好的解决用户态线程问题的方案吗?
它为什么没有得到商业应用?
调度器激活不是一种良好解决用户态线程问题的方案。
因为调度器激活违反了层次架构原则,这使得操作系统的设计和管理都变得复杂,而且调度器在第一次切换时总是选择阻塞的进程,这样也为黑客和各种攻击者提供了一个系统缺口,因此没得到商用操作系统认可。
7-6.一个进程中的不同线程如何共享信息?
这种共享可以在不同进程的不同线程之间直接实现么?
将共享资源存放在进程控制块里就可实现一个进程中不同线程的共享。
这种共享不可以在不进程的不同线程之间直接实现。
7-9.请解释包裹在线程实现上的作用,其使用价值大吗?
包裹的作用:
检查发出的系统调用会不会阻塞,它的实用价值不大,因为它没有完全解决线程阻塞造成的问题。
第八章P155
8-5.有一个同学提出了一种不适用信号量而又可以解决生产者-消费者问题中sleep和wakeup原语发生的死锁。
该方法就是再加一把锁来将“检查是否睡觉”和“睡觉“i昂个语句变成一组原子操作,从而防止信号丢失造成死锁,即
Voidproducer
……
Lock()
If(count==N)
Sleep();
Unlock
……
Voidconsumer(void)
Lock()
If(count==0)
Sleep();
Unlock();
……
该方法可行么?
不可行。
8-7.假定在进程通信中使用一种类似邮箱的机制。
当一个进程试图往一个满箱中放东西的时候,或者从一个空箱中拿东西的时候,该进程并不阻塞。
而是得到一个错误的返回码。
该进程立即重复上述过程(往邮箱中放东西或从邮箱中拿东西),直到成功为止。
请问这种机制会造成竞争么?
为什么?
这种机制会造成竞争,可能出现两个或者多个线程竞争同一个资源(信件)。
8-8.有一个同学认为本书给出的管理模式存在很大缺陷。
于是他提出了改进:
将wait、signal和broadcast三种原语去掉,代之以一种新的原语:
waituntil。
该新原语以一个布尔表达式作为参数,例如,waituntilx+y 请问你怎么看待这种改进的观点? 8-9.下面的程序使用院子加载和存入操作来实现互斥: //全局变量 blocked[0]=false; blocked[0]=false; turn=0; //Thread0 While (1){ blocked[0]=true; while(turn! =0)do; turn=0} //triticalesection Blocked[0]=false; } //Thread1 While (1){ Blocked[1]=true; While(turn! =1){ While(blocked[0])do; Turn=1;} //criticalsection Blocked[1]=false; } 请问该实现正确吗? 如果正确,请证明。 否则,请给出反例。 8-11.共享卫生间。 某单位为节省经费,决定建造男女共用的单性卫生间。 为满足社会风化要求,卫生间的使用需求需要满足如下条件: 在任何时候不同性别的人不能同时在卫生间里。 任务就是写一个程序来模拟卫生间的使用。 可以使用的工具是Mesa管理。 需要编写下述4个函数: Woman_wants_to_enter() Man_wants_to_enter() Woman_leaves() Man_leaves() 在这些函数里面可以使用原语lock()、unlock(),signal(),wait()和broadcast()来控制对卫生间的使用。 假定同一性别的人进入卫生间的数量不受限制。 8-12.第2个版本的卫生间共享 重做第十题的卫生间共享问题,这次把优先级赋予当前使用卫生间的性别。 例如,如果卫生间里面已经有女士在使用,新来的女士即可以直接进入,即使有男士在卫生间外面等待。 8-13.第3个版本的卫生间共享 这次需要保证公平,并防止饥饿: 如果女士在卫生间,则只要没有男士等待在外面,新来的女士皆可以进入卫生间。 如果有男士等待,则新来的女士就不能进去,而必须等待在男士后面。 当卫生间的最后一位女士离开时,等待的男士可全部进入。 第九章P183 9-3.忽略死锁似乎不像一个好的策略,但它在商业操作系统中得到了广泛的应用,为什么? 因为防止死锁的代价太高,比重启一百次的代价还高,发生死锁死机还不如直接重启。 9-6.死锁的根本基础是什么? 计算机系统有可能完全杜绝死锁么? 根本基础是资源有限,持有等待,不能抢占,循环等待条件。 计算机不可能完全杜绝死锁。 9-7.银行家算法在现实生活中经常使用,为什么使用类似策略的死锁应对策略在操作系统中却无法行使呢? 银行家算法是一个动态避免死锁算法,它的缺陷是需要知道将来需要什么,而在操作系统中并没有什么有效的办法计算出一个线程所需的资源额度,所以在操作系统无法行使该策略。 9-8.睡觉理发师问题: 一个理发店有一个理发师,一张理发椅子,N张等待椅子(N>1)。 当没有顾客的时候,理发师就睡觉。 当一个顾客来到店里时,如理发师在睡觉,则叫醒理发师,如果理发师正在给人理发,则坐在等待椅子上等待;如果等待的椅子都满了,则顾客就离开理发店而不理发了。 请问这种安排有发生死锁的可能么? 如果不能请予以证明。 如果可能,什么情况下会发生死锁? 请设计一个避免死锁的方案。 你采取的是哪种死锁应对策略? 理发师检查没有顾客,准备睡觉——挂起 顾客发现理发师没睡,等待——挂起 理发师睡觉——死锁 避免死锁方案,在理发师检查没有顾客和睡觉过程加锁。 两个动作要么全都做,要么一个都不做。 采取的是静态防止中的杜绝保持并等待。 9-9.四方恋爱问题: 假如我们有两男: 尤尔、夏士,两女: 左怡、尚珊。 左怡尚珊都喜欢玫瑰,谁送她们玫瑰,她们就和谁谈恋爱,尤尔和夏士都喜欢名表,谁送他们名表,他们就跟谁谈恋爱。 如果两位男士给同一位女士送玫瑰,或者一位女士同时给两位男士送名表,则两位男士大打出手(死锁)。 如果两位女士同时给一位男士送名表,后者一位男士同时给两位女士玫瑰,则两位女士将大打出手(死锁),请你帮助他们建立一对一的恋情关系,并在建立过程中防止大打出手(死锁) Inti尤=0,i夏=0,i左=0,i尚 While(i尤==0) {lock(); If(左怡送){i尤++;i左++;} Unlock(); Lock(); If(尚珊送){i尤++;i尚++;} Unclock(); lock(); If(送左怡){i尤++;i左++;} Unlock(); Clock(); If(送尚珊){i尤++;i尚++;} Unclock();} 9-11.本章讨论的哲学家就餐问题多个解决方案,请给出一个不同于书中解答的方案 9-12.本章给出的则学家就餐问题解决方案是否为最优方案? 请说明理由 9-13.有同学提出,本章给出的则学家就餐问题解决方案可能导致饥饿,即某个或某些哲学家永远得不到足够的筷子来就餐。 你同意该同学的看法吗? 如果你同意,那么本解决方案是否公平? 如果你不同意,请说明你的理由。 第十章P198 10-1.你能否用加载和存入原子指令实现锁? 请给出答案 内存加载和存入 Lock() {load; While(walue! =FREE) {store; Bad;} Value=BUSY; Store;} Unclock{load; Value=FREE; Store; } 测试与设置 Clock(){while(test_and_set(value)==1){}} Unclock(){value=0;} 10-2.lock() {disableinterrupts; While(value! =FREE) {enableinterrupts; Disableinterrupts;} Value=BUSY; Enableinterrupts; } 在如上所示的锁的实现中,enableinterrupts和disableinterrupts两条指令紧邻似乎是无聊之举,因为它们的效果互相取笑。 真的是这样吗? 不是,enableinterrupts: 是打开终端,让其他线程有机会通过中断被CPU调度,释放value,使进程获得value,紧接的disableinterrupts是将打开的中断关闭。 10-3.一同学认为用在切换时将中断保持为禁止状态(图10-9)的办法来解决图10-7所面临的问题太过复杂,不如干脆如图10-7中切换语句删除,留待操作系统的调度程序进行切换。 这样就不存在在何处启用中断的难题。 即将上锁程序变为如下: Lock() {disableinterrupts; If(value==FREE){ Value=BUSY;} Else{addthreadtoqueueofthreadswaitingforthislock; } Enableinterrupts; } 请问,上述锁的实现是否可行。 如果可行,证明其可行性。 如果不可行,给出反例。 不可行,因为disableinterrupts关断中断以后,进程一直占用CPU,别的线程没有机会被CPU调度,如果此时value=BUSY的话,那线程就无法向前推进,从而造成死帧。 10-4.一个同学提出一个解决使用测试与设置命令、非繁忙等待实现锁时(图10-10)所面临的一个线程同时存在两个状态的问题。 该方法非常简单,即让操作系统调度器在取得控制权后,检查一下刚刚被中断的线程是否在锁的系统调用里面,如果是,则不予切换线程,即将控制权再交回给被中断线程,使其可以继续执行下一句指令,从而切换到别的线程。 请问这种方法能奏效么? 如果能,它有什么缺点? 如果不能,它存在什么问题? 能,但是时间复杂度增大。 10-7.有人提出另一种使用测试与设置来实现锁的方法如下: Lock() While(test_and_set(guard)){} If(value==FREE){ Value==BUSY;} Else{ Addthreadtoqueueofthreadswaitingforthislock; Switchtonextrunnablethread; } Guard=0 } Unlock() {value=FREE; If(anythreadiswaitingforthislock) {movewaitingthreadfromwaitingqueuetoreadyqueue; Value=BUSY; } } 这种实现的特点是在unlock里不对guard进行厕所遇设置,而是直接对value进行操作。 请问: 这种实现方式能否正确运行,为什么? unclock中value=FREE,这个赋值语句不是原子操作,所以需要保护,否则FREE可能在传往value的途中被■掉,造成锁的释放失败。 第十一章P222 11-5.有同学提出,在固定分区的多道编程的内存管理下,只需要在编译时给出一个参数,即该程序将被加载的内存分区,便可以通过编译器来事先计算出每个程序虚地址的物理地址。 这样在加载后,就不在需要动态地址翻译了。 请问该建议怎么样? 该建议不可行,因为每加载一个程序都要给出一个参数,这样效率很低。 11-6.固定分区管理模式下,使用静态地址翻译能否满足地址独立的目标? 地址保护呢? 在固定分区管理模式下,使用静态地址翻译不能满足地址独立和地址保护。 11-7.固定分区时如何达到内存管理的两个抽象: 地址独立和地址保护? 请详细说明 地址独立: 是要程序发出的地址与物理地址无关,而固定分区管理中,每个程序的地址都不一样。 地址保护: 要求进程之间相互没有访问。 11-11.在多道编程下,我们说过需要动态地址翻译。 因为编译器不知道该程序将被加载到何地址上。 但有学生提出,可以使用加载器进行静态地址翻译,因为加载的时候我们已经知道加载的起始地址了。 请问这种做法行得通么? 行不通,没实现地址保护。 11-13.使用位图和链表来管理限制内存空间在时间效率上孰优孰劣? 为什么? 如果程序数量很少,那么链表比较好,因为链表的数量小。 位图表示法的空间成本是固定的,它不依赖于内存中程序的数量。 位图表示法没有容错能力 时间成本上,位图表示图在修改时简单 第十二章P243 12-1.与基本内存管理模式比较,分页管理模式的最大优点是什么? 最大优点是可以有效减少内存空间的外部碎片。 12-2.在一个页式内存系统下,一个程序能达到的最大尺寸是多大? 最大尺寸=硬盘尺寸—操作系统尺寸 12-5.设有一个32位寻址的分页系统,页面大小为16KB,假定页面号处于最左面,页面偏移值处于最右面,请问该系统需要多少位来表示页面号和页内号偏移值? 该系统能访问的最大虚拟页面号是多少? 18位,14位。 12-8.有人建议使用一个代数公式来进行虚拟页面到物理页面的映射,从而无须使用页表而节省页表而节省页表所占的内存空间。 请问你对这种建议做何评价? 这种建议不可行,因为物理内存比较小,而页面数比较多,可能会导致多个虚拟页面号指向同一个物理页面。 12-11.比莱迪异常出现的原因是什么? 它是一个悖论么? 比莱迪异常的原因是: 页面更换策略的不合理。 比莱迪异常不是悖论,它不是一种常见现象,而是一种异常现象。 它并不能说明我们不能给进程增加物理页面数或者增加物理页面数就一定会导致缺页中断。 12-13.多级页表策略是否会造成内存访问效率下降? 解决办法是什么? 会,解决方法: 使用翻译快表TLB。 第十三章P266 13-1.页面替换算法的根本追求是什么? 降低随后发生缺页中断的次数或者概率。 最理想的情况是选择一个再也不会被访问的页面进行替换。 13-2.提出最优页面替换算法的意义是什么? 为了定义一个标杆,以此来评判其他算法的优劣。 13-5.考虑一个460字的程序的下述内存访问序列: 10,11,104,170,309,185,245,246,434,458,364 假定采用页式虚拟内存管理,页面大小为100字,内存中有2个物理页面可供程序使用,且在开始时物理页面没有被任何进程占用。 1)若采用FIFO替换算法,那么有关访问序列的缺页中断次数是多少? 2)若采用LRU替换算法,那么有关该访问序列的缺页中断次数是多少? 460/100=4…6要用到5个页面0-99100-199200-299300-399400-459 (1)FIFO(中断次数6) 要访问的序列101110417073309185245246434458364 物理页面1000003333444 物理页面21111122223 中断标记√√√√√√ (2)URL(中断次数7) 要访问的序列101110417073309185245246434458364 物理页面1000000122222 物理页面21113331443 中断标记√√√√√√√ 13-6.在工作集算法里,每个页面的最后使用时间是在每次访问时都设置呢,还是只在却也中断被扫描到时才设置呢? 为什么? 在工作集算法里,每个页面的最后使用时间是指在缺页中断被扫描到时才设置。 因为工作集有时空局域性,如果时间都发生变化,那么就没有工作集了。 所以它在某段时间比较固定,不每一次访问都设置。 13-7.比较各种页面替换算法,说明为什么工作集时钟算法最受人们青睐。 因为工作集时钟算法继承了时钟算法以及工作集算法的优点。 时间更快,效率更好,公平性更佳。 13-10.工作集算法的提出时因为我们在观念上实现了突破,请问这种观念图片是什么? 这种观念的突破是没必要记录每个页面的访问的记录 13-11.虽然本章讨论了10种页面替换算法,但页面替换算法还有很多,例如,有一种成为“栈算法”的页面替换算法。 该算法的替换策略就是栈的操作策略: 后进先出。 即每次替换页面时,选择最后进入内存的页面进行替换。 试分析这种策略的优劣,并重做第五题。 使用栈算法的缺页中断次数是多少? 栈算法: 存在时间最长不一定访问次数最多,每次都
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 广工班 操作系统 课后 答案