操作系统问题.pdf
《操作系统问题.pdf》由会员分享,可在线阅读,更多相关《操作系统问题.pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1页(共7页)显示所有答案显示所有答案 隐藏所有答案隐藏所有答案 操作系统问题操作系统问题 代表在时间允许的情况下选择用来在本部分中讨论的问题。问题1.下列代码概述了一个简单的分时调度程序:struct MState int Regs31;/*保存用户寄存器的状态*/User;int N=42;/*要调度的进程数*/int Cur=0;/*“活动”进程数*/struct PCB struct MState State;/*处理器状态*/Context PageMap;/*针对进程的虚拟机映射*/int DPYNum;/*控制台/键盘数*/ProcTblN;/*每进程一个ProcTbl*/Sc
2、heduler()ProcTblCur.State=User;/*保存当前用户状态*/Cur=(Cur+1)%N;/*增量模N*/User=ProcTblCur.State;/*使另一ProcTbl处理当前这个ProcTbl*/假设用户每次敲击键盘上的某个键时,会产生一个中断,中断处理程序将这个新字符复制到常驻内核输入缓冲区中。操作系统包含一个ReadKey服务调用(SVC),通过用户从输入缓冲区中读取下一个字符这种方式来调用它。如果输入缓冲区为空,则SVC将挂起,直到有一个字符可用时为止。这个ReadKey SVC处理程序的第一个雏形如下所示。SVC处理程序例程将用户状态保存在用户结构中,然
3、后调lReadKey_h()。当ReadKey_h()返回时,SVC处理程序重新恢复该用户的状态,然后通过执行JMP(XP)命令来重启用户程序。ReadKey_h()int kdbnum=ProcTblCur.DPYNum;while(BufferEmpty(kdbnum)/*临时占用,等待循环结束*/User.Regs0 =ReadInputBuffer(kdbnum);上图说明了针对某个计算机的直接映射高速缓存块,该计算机使用32位数据字和32位字节地址。A在执行完ReadKey SVC后,用户程序将从输入缓冲区的哪个地方来找到下一个字符?隐藏答案隐藏答案 SVC将从输入缓冲区中读取的字符
4、存储到用户结构的R0槽中。恰好在内核返回到用户模式之前,上述内容被装载到用户的R0槽中。2002年4月29日第2页(共7页)B请解释上面提出的这个实现方案会出现什么问题。隐藏答案隐藏答案 当用户开始调用ReadCh管理程序时,如果缓冲区为空,那么处理程序会在内核中出现死循环而禁止中断。这样,就会阻止对缓冲区进行填充,所以该代码就进入到死循环中。C另外一个键盘处理程序的草案如下所示:ReadKey_h()int kdbnum=ProcTblCur.DPYNum;if(BufferEmpty(kdbnum)User.RegsXP=User.RegsXP-4;else User.Regs0=Read
5、InputBuffer(kdbnum);请解释改进后的程序是怎样修正最初实现方案中存在的问题。隐藏答案隐藏答案 当缓冲区为空时,该代码返回到用户模式,并且重新执行SVC。通过返回到用户模式来允许中断(很简单!),这样中断就能够发生,并且在键入某个按键时,缓冲区最终就可以填满。D设计人员注意到这样一个事实:进程只是在浪费其时间片等待有人来按键。所以他们提出以下修改方案:ReadKey_h()int kdbnum=ProcTblCur.DPYNum;if(BufferEmpty(kdbnum)User.RegsXP=User.RegsXP-4;Scheduler();else User.Regs0
6、=ReadInputBuffer(kdbnum);当删去“User.RegsXP=User.RegsXP-4;”这个代码行时,最可能出现的结果是什么?隐藏答案隐藏答案 在下一次调度时,用户程序将不会重新执行SVC,并且进一步假定下一个字符在R0中是可用的。简言之,它将会处理一个“垃圾”字符,即利用的是在最初的SVC的R0中产生的垃圾字符。E请解释这种修改是如何改进系统的整体性能的(假定没有删去第4行代码“User.RegsXP=User.RegsXP-4;”)。隐藏答案隐藏答案 调用scheduler()使得在等待下一个字符到来的时候,允许其他程序运行。2002年4月29日 第3页(共7页)F
7、该版本的处理程序仍然不能防止按任意量来进行调度,尽管在输入缓冲区中没有出现任何字符时,很可能只是再次调用Scheduler()。对于讲座中所描述的核心例程sleep(status)和wakeup(status)来说,请解释是怎样使用它们才能确保只有在这些例程有某些“用处”时才会对它们进行调度。隐藏答案隐藏答案 通过调用sleep(status),处理器会在下一次调度用于执行的用户程序(即在已经键入一个字符以后)时通知核心例程。这样,在用于执行的进程所能做的事情只是发现缓冲区仍然为空并且将其自身挂起时,就可以避免重新调度这些用于执行的进程。如果键盘处理器调用wakeup(status),核心例程
8、就可以找到已经进入睡眠状态并且等待与“状态”相关的某个事件发生的所有进程。接着,它就可以将这些进程标记为准备用于再次执行。因此,只有在这些进程拥有一些较好的理由允许它们继续运行时,这些进程才会运行。问题2.下列问题是关于在设计项目3中使用的简单分时核心程序。单击此处可以在一个独立的窗口中查看代码。A重启之后会发生什么情况?隐藏答案隐藏答案 在硬件重启以后,它会从存储单元0处开始执行。我们查看一下代码,存储单元0处有“BR(I_Reset)”,它将会指引到以下代码段:CMOVE(P0Stack,SP)CMOVE(P0Start,XP)JMP(XP)对于用户进程0来说,这些指令先对堆栈指针进行初始
9、化,然后跳转到该进程的第一条指令。由于我们才刚刚启动,程序还没有对其他寄存器中的内容作任何假定,所以我们只能让拥有在它们发生时所拥有的任何值。注意:这就意味着在单独重置以后,存在着错误的程序(例如,那些对寄存器进行测试的值出现在对它们设置之前)很可能表现为不同方式。为了提供某些可重用性保证,许多操作系统在开始执行某个进程之前,都将该进程的寄存器初始化为某个已知值。B处理器是怎样开始执行其他用户进程的?隐藏答案隐藏答案 时钟中断是由硬件定期生成的(中断之间的常见时间间隔是1/60秒=16.6ms);每个中断被称为该时钟的一个“滴答”单位。我们的中断处理程序(I_CLK)对XP进行备份,使之指向被
10、中断指令的指令,并且保存寄存器0中的内容。然后,它会查看当前用户进程已经运行了多长时间,如果是少于两个时钟滴答,则寄存器0的内容就会被恢复,并且继续执行被中断的程序。2002年4月29日 第4页(共7页)如果用户进程已经到了2个时钟滴答,所有当前进程的寄存器都被保存在某种核心数据结构(UserMState)中,并且我们通过调用Scheduler()来确定将要运行哪个进程。Scheduler()非常简单:它只是按某种循环方式在用户进程之间不断循环。改变当前进程涉及到先将UserMState复制到当前用户进程的合适的结构中,然后将下一个进程的数据复制到UserMState中。最后,核心例程恢复用户
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 问题
限制150内