1.设计题:某同学所在的公司需设计一个多级反馈队列调度算法,给出设计思路。
答案:
设计思路:
多级反馈队列调度算法是一种根据先来先服务原则给就绪队列排序,为就绪队列赋予不同的优先级数,不同的时间片,按照优先级抢占CPU的调度算法。
算法的实施过程如下:
(1)按照先来先服务原则排序,设置N个就绪队列为Q1,Q2…QN,每个队列中都可以放很多作业;
(2)为这N个就绪队列赋予不同的优先级,第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低;
(3)设置每个就绪队列的时间片,优先权越高,算法赋予队列的时间片越小。时间片大小的设定按照实际作业(进程)的需要调整;
(4)进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。
(5)首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。
例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。
***对于同一个队列中的各个进程,按照 ( 时间片轮转法调度 )***。比如Q1队列的时间片为N,那么Q1中的作业在经历了时间片为N的时间后,若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。
在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业即抢占式调度CPU。
2. 目前,大多数计算机系统都支持虚拟页式地址转换机制。试设计下列问题:
(1).页式存储管理方案中,用户地址空间怎样划分?内存地址空间怎样划分?内存分配过程是怎样的?(10分)
(2).页表应设计哪些数据项,每个数据项的作用是什么?(10分)
答案:
(1).系统将用户程序的逻辑空间按照相等大小划分成若干界面,称为逻辑页面。(2分)
各个逻辑页面从0开始依次编号,每个逻辑页面内也从0开始编址,称为页内地址。用户程序的逻辑地址由逻辑页号和页内地址两部分组成。(2分)
页式存储管理将内存空间按照逻辑页面大小划分成等长的若干区域,每个区域为一个内存块。(2分)
内存的所有内存块从0开始编号。(1分)
内存分配时,以页面(块)为单位,并按用户程序所需页数多少进行分配。(2分)
逻辑上相邻的页面在内存中不一定相邻,即分配给用户程序的内存块不一定连续。(1分)
(2).页表表项有:
逻辑页面号;(2分)
物理页面号(或块号);(2分)
驻留位(中断位或特征位):指示该页在内存还是在外存;(2分)
外存地址:指示该页在外存的地址;(2分)
修改位:指示该页在内存驻留期间是否被修改过;(2分)
3.设计题:设计一个进程调度算法,给出思路,使得多个进程可以公平地使用CPU资源。
要求:
1. 每个进程都有一个优先级,优先级范围为1~10,数值越大表示优先级越高。
2. 每个进程都有一个时间片,时间片范围为1~10,数值越大表示时间片越长。
3. 每个进程的优先级和时间片都可以动态调整。
4. 系统中有多个进程,每个进程都需要使用CPU资源。
5. 要求进程能够公平地使用CPU资源,避免出现饥饿现象。
6. 要求进程能够及时响应用户的操作,避免出现卡顿现象。
答案:
设计思路:
1. 首先,根据进程的优先级和时间片,为每个进程计算一个权值,权值越大表示优先级越高。
2. 接着,将所有进程按照权值从大到小排序,优先级高的进程排在前面。
3. 然后,按照排序后的顺序,依次分配CPU资源给每个进程。
4. 每个进程执行完一个时间片后,重新计算权值,重新排序,然后再次分配CPU资源。
5. 如果有新的进程加入系统,也需要按照权值计算并加入排序队列中。
6. 如果有进程的优先级或时间片发生变化,也需要重新计算权值,并重新排序。
7. 为了避免饥饿现象,可以设置一个最大等待时间,如果某个进程等待CPU时间超过最大等待时间,就将其优先级提高一级。
8. 为了避免卡顿现象,可以设置一个最小时间片,如果某个进程执行的时间片小于最小时间片,就将其时间片增加一倍。
9. 在实现过程中,可以使用优先队列等数据结构来实现进程的排序和调度。
总之,该算法的核心思想是根据进程的优先级和时间片计算权值,然后按照权值对进程进行排序,从而实现公平地使用CPU资源。同时,还需要考虑饥饿和卡顿现象的问题,以保证系统的稳定性和响应性。
4.在多道程序系统中,进程的状态是走走停停的,向前推进的速度是不确定的,根据所学知识设计进程的状态和转换条件。
答案:
通常情况下,操作系统中的进程状态可以分为以下几种:
1.就绪状态(Ready): 进程已经分配到了所有必需资源,并且等待被分配CPU时间片。
2.运行状态(Running): 进程正在执行。
3.阻塞状态(Blocked): 进程因为等待某种资源而被挂起,暂时无法执行。当需要的资源变为可用时,进程将会被唤醒并切换到就绪状态。
此外,还有一些其他的状态,如:
1.创建状态(New): 进程正在被创建。
2.终止状态(Terminated): 进程已经完成了它的任务,或者由于某种原因而被强制终止。
进程状态之间的转换取决于不同的条件。常见的条件包括:
1.就绪状态转换到运行状态的条件是,进程被分配到一个CPU时间片,并且获得了所有必需的资源。
2.运行状态转换到就绪状态的条件是,进程使用完了它的CPU时间片,或者等待某个事件的发生,比如输入输出完成、某个资源可用等。
3.运行状态转换到阻塞状态的条件是,进程需要等待某个资源,但该资源目前不可用。
4.阻塞状态转换到就绪状态的条件是,进程需要的资源已经可用了。
5.创建状态转换到就绪状态的条件是,操作系统完成了进程的创建并分配了必要的资源,如内存空间和CPU时间片,并将进程设置为可运行状态,等待CPU的调度执行。
5.设计题:目录管理机制是操作系统中用于组织和管理文件的一种重要机制,请根据所学知识,从设计者角度对目录管理机制设计和实现
答案:
目录结构设计:选择适当的目录结构对于提高文件系统性能和用户体验至关重要,常见的目录结构包括树形结构、哈希表、线性链表等。
目录操作接口设计:为了方便用户或应用程序对目录进行操作,需要设计相应的目录操作接口,如创建目录、删除目录、列出目录下的文件等。
目录索引实现:把目录与文件之间的联系建立起来,一种常见的实现方式是利用索引节点记录每个文件的元数据信息,包括文件名、权限、大小、创建时间等,并将这些信息存储在磁盘上。
目录遍历算法实现:为了查找某个目录下的所有文件,需要实现一种目录遍历算法,目录遍历可以基于深度优先搜索或广度优先搜索实现。
目录权限控制实现:文件系统通常需要支持文件和目录的权限控制,以确保只有授权用户才能访问某些敏感数据,在实现目录管理机制时也需要考虑相关的权限控制实现。
6.认真阅读下面程序,给出输出结果,并画出进程树图,分析原因。( 10分)
#include <stdio.h>
#include <unistd.h>
int main(){
fork();
fork();
printf("hello\n");
}
return 0;
}
答案:
7.操作系统是国之重器之一,对国家的软件产业发展、信息安全至关重要,目前我国的操作系统仍然与美国有着一定的差距,根据自已掌握的知识,从软件生态和安全角度谈谈我国操作系统的发展现状、不足以及建议。(至少100字)
答案:
中国的操作系统发展起步较晚,尽管近年来取得了一定的进展,但与美国等发达国家相比仍存在差距。在软件生态方面,国产操作系统如鸿蒙、麒麟、UOS等正在逐步建立自己的生态系统,但与Windows、Linux等成熟系统相比,应用软件的丰富度和兼容性仍有待提高。此外,国产操作系统在国际认可度和市场份额上相对较低,这影响了开发者和用户的信心。
在安全方面,国产操作系统普遍重视安全性设计,但由于技术积累和经验不足,可能存在未知的安全漏洞。同时,由于全球信息安全环境的复杂性,国产操作系统需要不断提升防御能力,以应对来自网络空间的威胁。
针对上述不足,建议如下:
1. 加大研发投入,提升操作系统的核心技术自主创新能力,减少对外部技术的依赖。
2. 加强与国内外软硬件厂商的合作,丰富应用软件生态,提高系统的兼容性和用户体验。
3. 建立健全的安全机制,定期进行安全评估和漏洞修复,确保操作系统的安全性。
4. 加强宣传教育,提高用户对国产操作系统的认知度和接受度,扩大市场份额。
5. 制定相应的政策和标准,引导和支持国产操作系统的发展,为其创造公平竞争的市场环境。
通过这些措施,可以逐步缩小与国际先进水平的差距,推动我国操作系统产业的健康发展。
8.假设一个操作系统采用轮转调度算法,时间片为10ms。有三个进程P1、P2、P3,它们的执行时间分别为30ms、20ms、40ms,它们的到达时间均为0。请问在这个系统中,进程的执行顺序是什么?请给出解析。
答案:
轮转调度算法是一种基于时间片的调度算法。在这个算法中,每个进程被分配一个时间片,当时间片用完后,操作系统会把该进程挂起,然后将CPU分配给下一个进程。如果一个进程在时间片结束前完成了执行,那么它会被移出队列,而其他进程会继续执行。
根据题目中的条件,三个进程的到达时间均为0,因此它们会在同一时刻被放入就绪队列中。根据轮转调度算法,每个进程被分配一个时间片,
因此在第一次调度中,P1会被分配10ms的时间片,P2和P3也会被分配10ms的时间片。
在第二次调度中,P1会被重新放入就绪队列,P2会继续执行。由于P2的执行时间为20ms,因此它会在第二次调度结束后完成执行。在第三次调度中,P1会被分配10ms的时间片,P3会被分配10ms的时间片。
在第四次调度中,P1会被重新放入就绪队列,P3会继续执行。由于P3的执行时间为40ms,因此它会在第五次调度结束后完成执行。在第六次调度中,P1会被分配10ms的时间片。
因此,进程的执行顺序是:P2 → P1 → P3。
9.给出信号量的数据结构和pv函数功能。
答案:
信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
10.假设有一个页面序列:2, 3, 4, 2, 1, 5, 6, 2, 1, 2,物理块数为3。 请用FIFO和LRU算法,计算缺页次数。
答案:
FIFO算法: | 序号 | 页面 | 页框 | 是否缺页 | 缺页次数 | | ---- | ---- | ---- | -------- | -------- | | 1 | 2 | 2 | 是 | 1 | | 2 | 3 | 2,3 | 是 | 2 | | 3 | 4 | 2,3,4 | 是 | 3 | | 4 | 2 | 3,4,2 | n | 4 | | 5 | 1 | 4,2,1 | 是 | 5 | | 6 | 5 | 2,1,5 | 是 | 6 | | 7 | 6 | 1,5,6 | 是 | 7 | | 8 | 2 | 5,6,2 | 是 | 8 | | 9 | 1 | 6,2,1 | 是 | 9 | | 10 | 2 | 2,1,2 | n | 10 | 缺页次数为8。 LRU算法: | 序号 | 页面 | 页框 | 是否缺页 | 缺页次数 | | ---- | ---- | ---- | -------- | -------- | | 1 | 2 | 2 | 是 | 1 | | 2 | 3 | 2,3 | 是 | 2 | | 3 | 4 | 2,3,4 | 是 | 3 | | 4 | 2 | 3,4,2 | n | 4 | | 5 | 1 | 4,2,1 | 是 | 5 | | 6 | 5 | 2,1,5 | 是 | 6 | | 7 | 6 | 1,5,6 | 是 | 7 | | 8 | 2 | 5,6,2 | 是 | 8 | | 9 | 1 | 6,2,1 | 是 | 9 | | 10 | 2 | 2,1,2 | n | 10 | 缺页次数为8。
11.某同学购买的笔记本电脑,其磁盘空间共有 100 块,若该同学用字长为 16 位的位示图管理磁盘空间,试问:
1)位示图需要多少个字?第i 字第 j 位对应的页面号是多少? (4分)
2)简述位示图磁盘空间管理方式下,空间分配和回收的算法。(4分)
答案:
1)位示图需要的字数=100/16≈7(向上取整)个字。
对应的页面号为16*i+j。
2) 当文件申请空间时,扫描位示图找出0对应的行列,计算对应的磁盘块数进行分配,同时修改为1。回收空间时,根据盘块号计算出位示图的行列赋值为0.
12. 设系统中有 3 种类型的资源( A, B, C)和 5 个进程( P1, P2, P3, P4, P5), A 资源的数量为 17, B 资源的数量为 5, C 资源的数量为 20。在 T0 时刻系统状态表如下表3-10所示。
表3-10 T0 时刻系统状态表
系统采用银行家算法试试死锁避免策略。
① T0 时刻是否为安全状态?若是,请给出安全序列。(5分)
② 在 T0 时刻若进程 P2 请求资源( 0,3,4),是否能实施资源分配?为什么? (2分)
答案:
①T0 时刻是安全状态?从T0 时刻的安全分析中可以看出,存在一个安全序列{P5,P4,P3,P2,P1}
13.某同学购买了一台电脑,其内存采用页式虚拟存储管理方案,该管理方案采取部分调入、页面置换的策略。考虑如下的页面访问序列:7,0,1,2,0,3,0,4,2,3,0,3,2,系统为期分配了三个物理页框(开始已调入前三个页面)。请基于以下两种算法计算缺页次数和缺页率。(要求写出步骤,否则不得分)
a. FIFO(先进先出)算法。(7分)
b. LRU(最近最少便用)算法。(8分)
14.打开一个文件系统调用具体实现过程。
(1)给出打开文件实现过程的文字描述。
(2)根据文字描述绘制打开一个文件的示意图。
答案:
根据文件路径名一层层地去查找各级目录结构,找到该文件所在的目录项;
根据打开方式、共享说明等信息检查访问合法性;
查找系统内打开文件表,看文件是否已经被其他进程打开,若是,将文件的共享计数值加1,转S4;若否,将该文件的FCB从外存读入内存,保存在系统打开文件表的某个空表项中,共享计数置为1;
在进程打开文件表中增加一项,填写访问方式、当前读写指针等,并指向系统打开文件表对应表项;
返回一个指针给fd,指向打开文件表中的相应表项,以后的文件操作均通过该指针来完成。
15.(1)CPU和设备并行工作能够提高整个系统的效率和响应速度。请具体论述设备管理可以通过哪几方面来实现cpu和设备之间的并行工作。
(2)基于进程切换原理,给出下图文字描述。
答案:
首先,设备控制器可以负责一些简单的硬件操作,例如直接将数据从设备传输到内存,而不需要cpu干预。这样做可以减少cpu的工作量,使其更加专注于处理复杂的任务。同时,设备控制器还可以发出中断信号通知cpu已完成的任务,以告诉cpu可以进行后续的工作。
其次,操作系统可以利用异步i/o技术,使得cpu在等待设备响应的同时可以处理其他任务。简单来说,异步i/o就是在请求i/o操作时,操作系统会立即返回而不会等待操作结束,这样cpu就能够去处理其他事情了。当设备响应完成时,操作系统会向相应的进程发送信号通知它已经可以去取回i/o操作的结果了。
再者,操作系统可以使用多进程来实现cpu和设备间的并行操作。为了避免一个进程长时间占有cpu或设备,操作系统可以把不同的进程分配到不同的cpu核心上,并在它们之间切换。这样,每个进程都能消耗自己的cpu时间片,也能够并发地进行i/o操作。
最后,操作系统中还有一种叫做“中断驱动”方式的设备管理模式。当一个设备需要处理任务时,它会向cpu发送中断请求,这样cpu就可以暂停当前正在运行的进程,执行中断服务程序,从而完成设备管理的相关操作。通过中断驱动,cpu在等待设备响应时不需要轮询,可以更高效地利用资源和响应设备请求
16.在多道程序系统中,一组进程中的每一个进程均无限期的等待被该组进程中的另一进程所占有、且永远不会释放的资源,这种现象将导致系统处于死锁状态,如何避免死锁保证系统状态安全性。试述:
(1)产生死锁的原因是什么?
(2)产生死锁的必要条件是什么?
(3)如何处理死锁?死锁避免方法?
答案:
(1).产生死锁的原因:
一是系统提供的资源数量有限,不能满足每个进程的使用(5分);
二是多道程序运行时,进程推进顺序不合理(5分).
(2)产生死锁的必要条件是:
1.互斥条件(2.5分)
2.不剥夺条件(不可抢占)(2.5分)
3.部分分配(2.5分)
4.循环等待(2.5分)
(3)死锁的处理:
1.死锁的预防
2.死锁的避免
3.死锁的检测
4.死锁的解除
5.不做任何处理
6。通过银行家算法避免死锁,保证系统状态安全性。
17.多道程序系统中中断机制无处不在,如何理解中断是多道程序得以实现的基础。
答案:
中断是操作系统中实现多道程序的基础之一,因为中断机制允许CPU在执行一个程序时,可以响应外部事件的请求,而不必等待当前程序执行完毕。这就允许了多个程序同时运行,并且可以共享CPU的时间片,从而实现了多道程序的并发执行。
当一个中断事件发生时,操作系统会暂停当前正在执行的程序,保存它的上下文信息,并切换到处理中断的代码。在处理完中断事件后,操作系统会恢复被中断的程序的上下文信息,继续执行它。这个过程是透明的,被中断的程序并不知道中断事件的发生和处理过程。
通过中断机制,操作系统可以实现多种功能,例如实现进程调度、实现设备驱动程序、处理异常情况等。中断机制的实现需要硬件和操作系统的配合,硬件需要提供中断控制器和中断向量表等支持,操作系统需要编写中断处理程序和中断服务例程等。
因此,中断机制是操作系统中实现多道程序的基础之一,它允许多个程序同时运行,并且可以共享CPU的时间片,从而实现了多道程序的并发执行。
18.论述操作系统进程的三级调度。
答案:
1.高级调度(High Level Scheduling)
高级调度,称作业调度或长程调度(Long-term Scheduling)。在批处理操作系统中,作业首先进入系统在辅存上的后备作业队列等候调度,因此,作业调度是必须的。它将按照系统预定的调度策略, 决定把后备队列作业中的哪些作业调入主存,为它们创建进程、分配资源,并将它们排在进程就绪队列外,使得这些作业的进程获得竞争处理机的权利,准备执行。 当作业运行结束后,作业调度程序还将为作业做善后工作。而在纯粹的分时或实时操作系统中,作业是联机的。为了缩短响应时间,作业不是建立在外存,而是直接 建立在内存中。用户以通过键盘直接将命令或数据送入内存,所以在分时和实时系统中,不需要配备作业调度。
2.低级调度(Low Level Scheduling)
低级凋度,又称进程调度或短程调度(Short-term Scheduling)。在进程状态的变化中,从就绪到运行的转变是由低级调度完成的。由于在多道程序环境下,进程(线程)的数目往往多于处理机数目,致使它们争用处理机。低级调度将按照某种原则决定就绪队列中的哪个进程或内核级线程能获得处理器。低级调度是最基本的调度,任何类型的操作系统都必须配置低级调度。
3.中级调度(Medium Level Scheduling)
中级调度,又称平衡负载调度、中程调度(Medium-term Scheduling)。很多操作系统为了提高内存利用率和作业吞吐量,专门引进了中级调度。中级调度决定主存储器中所能容纳的进程数,即决定哪些进程被允许参与竞争处理器资源,将一些皙时不能运行的进程调至外存上去等待,而不再占用宝贵的内存资源,腾出内存空间以便将外存上已具备执行条件的进程换如内存执行。此时这些被换出内存的进程处于挂起状态。当进程具备了运行条件,且主存又有空闲区域时,再由中级调度决定把一部分这样的进程重新调回主存工作。这样,中级调度根据存储资源量和进程的当前状态来决定辅存和主存中的进程的对换,进程在运行期间,可能要经历多次换进换出,起到短期调整系统负荷的作用。中级调度实际上就是存储器管理中的对换功能。
19.编程题:使用 pipe() 函数创建了一个匿名管道,然后通过 fork() 函数创建了一个子进程。子进程向管道中写入字符串 "Hello, world!",而父进程从管道中读取数据并输出
#define BUFFER_SIZE 25
int main()
{
int fd[2];
char write_msg[BUFFER_SIZE] = "Hello, world!";
char read_msg[BUFFER_SIZE];
pid_t pid;
if (pipe(fd) == -1) { // 创建匿名管道 fprintf(stderr, "Pipe failed");
return 1; }
pid = fork(); // 创建子进程
if (pid < 0) { // 创建子进程失败
fprintf(stderr, "Fork failed");
return 1;
} else (8分)
if (pid > 0) { // fu进程
close(fd[1]); // 关闭写端口
read(fd[0], read_msg, BUFFER_SIZE); // 从管道中读取数据
printf("Child process received message: %s\n", read_msg); }
else
{ // zi进程
close(fd[0]); // 关闭读端口
write(fd[1], write_msg, BUFFER_SIZE); // 向管道中写入数据
printf("Parent process sent message: %s\n", write_msg); }
return 0;
} (12分)