【操作系统原理与实践】期中考试考点整理与复习(OS引论,进程管理,处理机调度与死锁)——电子科技大学2023期中考试

考试时间:4.19 13:00-14:00

考试范围:操作系统前三章(引论,进程管理,处理机调度与死锁)

考试题型:5简答+2计算+1编程

以下所有内容均为题目预测,如有雷同,纯属巧合

简答题

  1. 设计现代OS的主要目标是什么?OS的作用可以表现在哪三个方面?

  2. OS有哪几大特征,其最基本的特征是什么?

  3. 简述OS应具有的五大功能。

  4. 简述批处理系统、分时系统以及实时系统各自的特点。

  5. 试说明推动批处理系统和分时系统形成和发展的主要动力是什么?

  6. 为什么要引入实时操作系统?

  7. 试从交互性、及时性以及可靠性方面,将分时系统与实时系统进行比较。

  8. 在操作系统中为什么要引入进程的概念?它会产生什么样的影响?

  9. 进程由哪三部分组成?进程控制块的组织方式有哪几种?它提供了进程管理和进程调度所需要的哪些信息?

  10. 进程在三个基本状态之间转换的典型原因?

  11. 什么是进程?什么是线程?进程与线程有何区别?

  12. 什么是死锁?产生死锁的原因和必要条件是什么?简述预防死锁方法与必要条件的关系。

  13. 处理机调度分为哪三级?简述三种调度的区别,再描述从装入一个作业开始到执行此作业的整个详细的调度过程。

  14. 按调度方式可将实时调度算法分为哪几种?抢占调度方式中,抢占的原则是什么?

计算题1:调度算法

  1. 根据不同的调度算法,给出相应的调度过程,并计算相关的平均周转时间和平均带权周转时间。(先来先服务、最短作业优先、轮转法、高响应比优先算法)

    进程就绪时间服务时间
    P103
    P226
    P344
    P465
    P582

    FCFS:P1->P2->P3->P4->P5

    SJF:P1->P2->P5->P3->P4

    HRN:P1->P2->P3->P5->P4

    轮转法:一个时间片结束后,默认新到达的进程先进入就绪队列,然后时间片结束但还没有完成的进程再加入队列末尾。

    时间片为1时

    进程完成时间周转时间带权周转时间
    P1441.33
    P218162.67
    P317133.25
    P420142.8
    P51573.5

    时间片为4时

    进程完成时间周转时间带权周转时间
    P1331
    P217152.5
    P31171.75
    P420142.8
    P519115.5

    平均时间请自行计算。

  2. 各进程到达就绪队列的时间、需要的运行时间、进程优先数如下表所示。分别使用非抢占式和抢占式的优先级调度算法,分析进程运行情况。(注:优先数越大,优先级越高)

    进程到达时间运行时间优先数
    P1071
    P2242
    P3413
    P4542

    非抢占式:P1->P3->P2->P4

    抢占式:

    0-2:P1

    2-4:P2

    4-5:P3

    5-7:P2(P2比P4先到达)

    7-11:P4

    11-16:P1

  3. 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用多级反馈队列调度算法,分析进程运行的过程。第1级队列时间片为1,第2级队列时间片为2,第3级队列时间片为4,以此类推。

    进程到达时间运行时间
    P108
    P214
    P351

    答案:P1(1)->P2(1)->P1(2)->P2(1)->P3(1)->P2(2)->P1(4)->P1(1)

    重要提醒:在5时刻P3到达,P2必须立刻被放入第二队列的末尾,然后让P3先运行!

  4. 最早截止时间优先算法EDF:

    根据任务的截止时间来确定任务的优先级。截止时间越早,其优先级越高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序,调度程序在选择任务时总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。
    EDF算法既可以用于抢占式调度,也可用于非抢占式调度。

  5. 最低松弛度优先算法LLF:该算法是根据任务紧急(或松弛)的程度,来确定任务的先级。任务的紧急程度越高,为之赋予的优先级就越高。

    该算法主要用于抢占调度方式中。

    松弛度 = 完成截止时间 - 需要运行时间 - 当前时刻
    当某一时刻算出某一进程的松弛度为0,代表着这个进程必须马上执行!

计算题2:银行家算法

  1. 在银行家算法中,若出现下述资源分配情况,试问:
    (1)该状态是否安全?
    (2)若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?

    ProcessAllocationNeedAvailable
    P0003200121622
    P110001750
    P213542356
    P303320652
    P400140656

    (1)对该状态进行安全性检查:

    ProcessWorkNeedAllocationWork+AllocationFinish
    P01 6 2 20 0 1 20 0 3 21 6 5 4true
    P31 6 5 40 6 5 20 3 3 21 9 8 6true
    P11 9 8 61 7 5 01 0 0 02 9 8 6true
    P22 9 8 62 3 5 61 3 5 43 12 13 10true
    P43 12 13 100 6 5 60 0 1 43 12 14 14true

    由安全性检查得知,可以找到一个安全序列{P0、P3、P1、P2、P4},因此系统是安全的。
    (2)P2提出Request(1,2,2,2),系统按银行家算法进行检查:Request(1,2,2,2) ≤ Need(2,3,5,6),P2请求是合理的;
    Request(1,2,2,2)≤Available(1,6,2,2),P2请求是可以满足的;
    系统暂时先为进程P2试行分配资源,并修改有关的确数据,如下图所示:

    ProcessAllocationNeedAvailable
    P00 0 3 20 0 1 20 4 0 0
    P11 0 0 01 7 5 0
    P22 5 7 61 1 3 4
    P30 3 3 20 6 5 2
    P40 0 1 40 6 5 6

    再利用安全性算法检查系统是否安全,可利用资源Available(0,4,0,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不能将资源分配给P2。

    注意事项:需求矩阵是尚需的各类资源数,最大需求矩阵是对资源的最大需求数。

    工作向量WORK表示系统可提供给进程继续运行所需的各类资源数目

    当进程i获得资源后,应执行:work[j] = work[i] + allocation[i, j]

    要必须会填安全性检查表!

  2. 设系统中有 3 种类型的资源( A , B , C )和 5 个进程 P1、P2、P3、P4 、P5 ,初始时A资源的数量为 17 ,B 资源的数量为 5 ,C 资源的数量为 20 。在T0时刻系统资源状态如下表所示。系统采用银行家算法实施死锁避免策略。

    img

    问:(1)T0时刻是否为安全状态?若是,请给出安全序列。

    (2)在T0时刻若进程P2请求资源(0,3,4),是否能实施资源分配?为什么?

    (3)在(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?为什么?

    答案:(1)安全,一个安全序列是:P4,P2,P3,P5,P1

    ​ (2)不能分配,因为 request2>available

    ​ (3)可以分配,安全序列是:P4,P2,P3,P5,P1

    在答题时最好画出表格,像上题一样

编程题:信号量机制

  1. 有一单车道隧道实施单向放行,隧道长度最多能容纳N辆车,在两边端口A和B各设置一个红绿灯控制车流。当隧道内车辆全部开出后,反方向车辆才能进入,否则会死锁。在无车时两边均为绿灯。假设每辆车到达隧道口时都会触发管理这2个红绿灯的控制器主机产生一个子进程,实现灯光控制管理。请使用信号量写出控制器程序(伪代码),能够避免隧道内死锁的发生。(20分)

    int leftcount = 0, rightcount = 0; //隧道中车的数量
    semaphore mutex = 1; //公用信号量
    semaphore leftmutex = 1, rightmutex = 1; 
    void left2right() {
        while(true) {
            if(leftcount == 0) {
            	P(mutex);
            	P(rightmutex);
        	}
            P(leftmutex);    
            leftcount++; 
            V(leftmutex); 
            //左至右过洞;
            P(leftmutex);
            leftcount--if(leftcount == 0) {
                V(mutex);
                v(rightmutex);
            }
            V(leftmutex);
        }
    
    }
    
    void right2left() {
        while(true) {
            if(rightcount == 0) {
            	P(mutex);
            	P(leftmutex);
            }
            P(rightmutex);    
            rightcount++; 
            V(rightmutex); 
            //右至左过洞;
            P(rightmutex);
            rightcount--if(rightcount == 0) {
                V(mutex);
                v(leftmutex);
            }
            V(rightmutex);
        }   
    }
    
    void main() {
        left2right();
        right2left();
    }
    
    
  2. 设有4个进程A、B、C、D共享一个缓冲区(大小为1),进程A负责循环地从文件读一个整数并放入缓冲区,进程B从缓冲区循环读入MOD 3为0的整数并累计求和,进程C从缓冲区循环地读入MOD 3为1的整数并累计求和,进程D从缓冲区中循环地读入MOD 3为2的整数并累计求和。请用P、V操作写出能够正确执行的程序。

    Sempty :=1 
    SBSCSD := 0
    
    Process PA
    Begin 
         P(Sempty);
         <写入num至缓冲区>
         if(num MOD 3 = 0)
                V(SB);
         if(num MOD 3 = 1)
                V(SC);
         else
                V(SD);
    end
    
    Process PB
    Begin 
         P(SB);
         <从缓冲区读入num并累计求和>
         V(Sempty);
    end
    
    Process PC
    Begin 
         P(SC);
         <从缓冲区读入num并累计求和>
         V(Sempty);
    end
    
    Process PD
    Begin 
         P(SD);
         <从缓冲区读入num并累计求和>
         V(Sempty);
    end
    
    
  3. 系统中有三个进程 GET、PRO 和 PUT,共用两个缓冲区 BUF1 和 BUF2。

    假设 BUF1 中最多可放 11 个信息,现已放入了两个信息;BUF2 最多可放 5 个信息。

    GET 进程负责不断地将输入信息送入 BUF1 中,

    PRO 进程负责从 BUF1 中取出信息进行处理,并将处理结果送到 BUF2 中,

    PUT 进程负责从 BUF2 中读取结果并输出。

    试写出正确实现 GET、PRO、PUT 的同步与互斥的算法

    (要求:(1)用类 C 语言描述,条理清楚,注释恰当;(2)信号量原语统一使用 wait 和 signal。)

    semaphore
    empty1=9//空 buf1 的数目
    full1=2;	//有数据的 buf1 的数目
    empty2=5; //空 buf2 的数目
    full1=0;	//有数据的 buf2 的数目
    mutex1=mutex2=1; //互斥信号量
    int main(){
    Cobegin	//并发开始
    GET();
    PRO();
    PUT();
    Coend	//并发结束
    return 0;	}	(3)
     
     
    //GET 进程
    void GET(){
    while(1)
    {wait(empty1);
    wait(mutex1);
    将信息送入buf1;
    signal(mutex1);
    signal(full1);}
    }	(3)
     
     
    //PRO 进程
    void PRO(){
    while(1)
    {
    wait(full1);
    wait(mutex1);
    从 buf1 中取出信息;
    signal(mutex1);
    signal (empty1);
    wait(empty2);
    wait(mutex2);
    将信息送入 buf2;
    signal(mutex2);
    signal(full2);
    }
    }	(4)
     
     
    //PUT 进程
    void PUT(){
    while(1)
    {
    wait(full2);
    wait(mutex2);
    从 buf2 中取出信息;
    signal(mutex2);
    signal (empty2);
    }	(3)
        
    
  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月出天山_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值