操作系统·第三章 处理机调度自测题:作业调度+进程调度+中断+Linux调度(含超详细解析)
本文摘要: 文章系统梳理了处理机调度的核心知识,包括三级调度(高级、中级、低级)的功能与必要性,重点强调进程调度是任何系统的必备模块。详细解析了作业生命周期(提交、后备、执行、完成)和进程状态转换,对比了先来先服务、时间片轮转、优先级调度等算法的特点及适用场景。通过典型例题(如周转时间计算、中断处理流程、Linux调度策略等)深化理解,指出CFS调度器通过虚拟运行时间和红黑树实现公平性。最后的应用
第三章 处理机调度 自测习题
一、单项选择题
1.为了使系统中各部分资源得到均衡使用,就必须选择对资源需求不同的作业进行合理搭配,这项工作是由( A )完成的。
A. 作业调度
B. 中级调度
C. 进程调度
D. 对换
2.操作系统中必不可少的调度是( C )。
A. 作业调度
B. 中级调度
C. 进程调度
D. 对换
解析:
进程调度(低级调度)是任何通用操作系统必不可少的核心功能,负责将CPU分配给就绪队列中的进程。
A 作业调度(可选,分时/实时系统可能不需要作业调度)
B 中级调度(可选,用于调节内存负载)
C 进程调度(必须存在)
D 对换(属于内存管理功能,不是必需调度级别)
3.作业生存期共经历四个状态,它们是提交、后备、( D )和完成。
A. 等待
B. 就绪
C. 开始
D. 执行
4.作业调度程序从处于( D )状态的队列中选取适当的作业调入主存运行。
A. 执行
B. 提交
C. 完成
D. 后备
5.放在输入井中的作业处于( A )状态。
A. 后备
B. 提交
C. 执行
D. 完成
解析:
在批处理系统中,作业被提交后,由作业调度(高级调度)将其存入磁盘的输入井中,等待被调入内存。此时作业的状态是后备状态。
B 提交状态:作业刚提交给系统,尚未进入输入井(或严格一些,提交后转后备)
C 执行状态:作业已被调入内存并创建进程
D 完成状态:作业已运行结束
6.在操作系统中,JCB是指( C )。
A. 文件控制块
B. 进程控制块
C. 作业控制块
D. 程序控制块
7.作业调度的关键在于( B )。
A. 选择恰当的进程管理程序
B. 选择恰当的作业调度算法
C. 用户作业准备充分
D. 有一个较好的操作环境
8.作业调度选择一个作业装入主存后,该作业能否占用处理器必须由( C )来决定。
A. 设备管理
B. 作业控制
C. 进程调度
D. 驱动调度
解析:
作业调度只负责将作业从外存调入内存,并为其创建进程(进入就绪态)。该作业的进程能否占用处理器,由进程调度根据调度算法从就绪队列中选出下一个运行的进程来决定。
A 设备管理(负责I/O设备分配)
B 作业控制(作业控制语言或命令解释器)
D 驱动调度(用于磁盘等设备访问顺序优化)
9.在操作系统中,作业处于( C )状态时,已处于进程的管理之下。
A. 后备
B. 阻塞
C. 执行
D. 完成
解析:
当作业被作业调度选中并装入内存后,系统会为该作业创建一个或多个进程,此后该作业便处于“执行”状态(尽管进程可能处于就绪、运行、阻塞等微观状态)。此时作业已处于进程的管理之下,依靠进程控制块(PCB)进行调度和资源分配。
A 后备(作业仍在外存,尚未创建进程)
B 阻塞(进程状态,不是作业状态的宏观名称)
D 完成(作业已结束,进程已撤销)
10.作业一旦进入内存即为执行状态,与之相关的进程在作业进入内存时予以创建,该进程的初始状态为( B )。
A. 运行态
B. 就绪态
C. 阻塞态
D. 提交态
11.进程调度是根据一定的调度算法,从( B )队列中挑选出合适的进程。
A. 阻塞
B. 就绪
C. 运行
D. 等待
12.在批处理系统中,周转时间是( B )。
A. 作业运行时间
B. 作业等待时间和运行时间之和
C. 作业的相对等待时间
D. 作业被调度进入主存到运行完毕的时间
解析:
周转时间是指从作业提交给系统到作业完成所经过的总时间,包括:在外存后备队列等待的时间 + 在内存就绪队列等待的时间 + 实际运行时间。即等待时间与运行时间之和。
A 作业运行时间(仅指CPU执行时间,不包含等待)
B 作业等待时间和运行时间之和(正确)
C 作业的相对等待时间(不是标准定义)
D 作业被调度进入主存到运行完毕的时间(这只是“内存驻留时间”,不包括在外存后备队列的时间,比真正的周转时间要短)
13.从系统的角度出发,希望批处理控制方式下进入输入井的作业( D )尽可能小。
A. 等待装入主存时间
B. 周转时间
C. 执行时间
D. 平均周转时间
14.设某作业进入输入井的时间为S,开始运行的时间为R,得到计算结果的时间为E,则该作业的周转时间T为( A )。
A. T=E-S
B. T=E-(S+R)
C. T=(S+R)+ E
D. T=E-R
15.现有3个作业同时到达,每个作业的计算时间都是1小时,它们在一台CPU上按单道方式运行,则平均周转时间为( B )小时。
A. 1
B. 2
C. 3
D. 6
16.按照作业到达的先后次序调度作业,排队等待时间最长的作业被优先调度,这是指( A )调度算法。
A. 先来先服务法
B. 短作业优先法
C. 时间片轮转法
D. 优先级法
17.为了对紧急进程或重要进程进行调度,调度算法应采用( B )。
A. 先来先服务法
B. 优先级法
C. 短作业优先法
D. 时间片轮转法
18.在作业调度中,若采用优先级调度算法,为了尽可能使CPU和外部设备并行工作,有如下三个作业:J1以计算为主,J2以输入输出为主,J3计算和输入输出兼顾,则它们的优先级从高到低的排列顺序是( C )。
A. J1,J2,J3
B. J2,J3,J1
C. J3,J2,J1
D. J2,J1,J3
解析:
为了使 CPU 和 I/O 设备尽可能并行工作,应优先让 I/O 密集型作业(J2)先运行,因为它会很快进入 I/O 等待,从而释放 CPU 给其他作业,同时 I/O 设备也同时工作;其次是 计算和 I/O 兼顾 的作业(J3),它也能在一定程度上重叠 I/O 与计算;最后是 CPU 密集型作业(J1),它长时间占用 CPU,不利于并行性。
因此,优先级从高到低应为:J2 (I/O为主) → J3 (兼顾) → J1 (计算为主)。对应选项是 B。
如果按“兼顾优先”逻辑:
兼顾型(J3)既能触发 I/O 也能利用 CPU,可以更快释放 CPU 给其他作业,同时 I/O 设备工作,比纯 I/O 型更快产生 I/O 请求并交替执行,因此优先级可能最高。
那么顺序:J3 → J2 → J1,对应 C。
19.为了使计算机在运行过程中能及时处理内部和外部发生的各种突发性事件,现代操作系统采用了( B )机制。
A. 查询
B. 中断
C. 调度
D. 进程
20.下列中断中,可能要人工介入的中断是( D )。
A. 程序性中断
B. 时钟中断
C. 输入输出中断
D. 硬件故障中断
21.下列中断类型中,属于自愿性中断事件的是( C )。
A. 硬件故障中断
B. 程序性中断
C. 访管中断
D. 外部中断
解析:
自愿性中断(也称为软中断、陷阱)是指由当前运行进程主动请求操作系统服务而触发的中断,最典型的就是通过访管指令(如 int 0x80、syscall)引发的访管中断,用于切换到内核态执行系统调用。
A 硬件故障中断(非自愿,由硬件错误引起)
B 程序性中断(如除零、越界,通常是异常,属于被动或错误引起,不是自愿)
C 访管中断(正确,用户程序主动请求)
D 外部中断(由外部设备或时钟引起,非自愿)
22.当硬件中断装置发现有事件发生,就会中断正在占用CPU的程序执行,让操作系统的( B )占用CPU。
A. 系统调用程序
B. 中断处理程序
C. 作业管理程序
D. 文件管理程序
23.Linux系统中的shell是负责( A )的模块。
A. 解释并执行来自终端的命令
B. 解释并执行来自终端的内部命令
C. 解释并执行来自终端的外部命令
D. 进行系统调用
24.Linux系统中的进程调度采用(D )。
A. 先来先服务法
B. 时间片轮转法
C. 短作业优先法
D. 抢占式优先级
解析:
Linux 进程调度是一个结合了多种策略的复杂体系,但其最根本的方式是抢占式优先级调度,并在此基础上实现了完全公平调度器(CFS)作为默认策略
二、判断题
1.处理机调度可分为三级:高级、中级和低级。在所有的系统中,都必须具备这三级调度。( B )
A. 对
B. 错
2.处理机调度的主要目的就是为了分配处理机。( A )
A. 对
B. 错
3.作业调度选中一个作业后,与该作业相关的进程即占有CPU运行。( B )
A. 对
B. 错
解析:
作业调度(高级调度)选中一个作业后,会为该作业创建进程,并将其放入就绪队列。此时该进程只是具备了竞争CPU的资格,但是否立即占有CPU运行,还需要等待进程调度(低级调度) 按照调度算法从就绪队列中选中该进程。两者之间存在时间差(可能很短,但概念上不同)。
4.作业调度往往选择对资源需求不同的作业进行合理搭配,使得系统中个部分资源都得到均衡利用。( A )
A. 对
B. 错
5.处于后备状态的作业已经调入内存中。( B )
A. 对
B. 错
解析:
处于后备状态的作业仍然存放在外存(如磁盘) 的输入井(或后备队列)中,尚未被作业调度调入内存。只有被作业调度选中并分配内存后,作业才进入执行状态(此时其对应的进程可能在就绪、运行、阻塞等状态)。
6.作业的周转时间和平均周转时间与选用的调度算法有关。( A )
A. 对
B. 错
7.通常,为了提高效率,赋予需要大量计算的作业较高优先级,赋予需要大量输入/输出的作业较低的优先级。( B )
A. 对
B. 错
解析:
通常,为了提高系统效率(特别是使 CPU 与 I/O 设备并行工作),应当赋予 I/O 密集型作业较高优先级,因为这类作业会频繁发起 I/O 请求并阻塞,能快速释放 CPU 给其他作业,从而让 CPU 和 I/O 设备都忙碌起来;而 计算密集型作业 由于长时间占用 CPU,通常会被赋予较低优先级,以避免影响交互性和设备并行度。
8.时间片轮转法主要用于分时系统中的进程调度。( A )
A. 对
B. 错
9.动态优先级算法允许进程的优先级在运行期间不断改变。(A )
A. 对
B. 错
10.中断处理一般分为中断响应和中断处理两个步骤,前者由软件实施,后者由硬件实施。( B)
A. 对
B. 错
11.一个进程在执行过程中可以被中断事件打断,当相应的中断处理完成后,就一定恢复该进程被中断时的现场,使它继续执行。(B )
A. 对
B. 错
12.Linux系统中的shell命令语言解释程序属于系统内核部分,实现用户与核心的接口。( B)
A. 对
B. 错
解析:
Linux 系统中的 Shell 是一个命令语言解释程序,运行在用户态,不属于系统内核部分。它是用户与操作系统之间的用户接口,负责接收用户输入的命令并将其转换为系统调用,从而请求内核服务。
真正的用户与核心的接口是指系统调用。
Shell 是命令解释器,属于用户程序,而非内核组件。
13.Linux系统针对不同类别的进程提供了3种不同的调度策略。( A )
A. 对
B. 错
三、简答题
1、处理机调度的主要目的是什么?
处理机调度的主要目的是在多道程序环境下,按照一定的算法动态地将CPU分配给就绪队列中的进程(或线程),以达到系统设计的目标。具体来说,主要包括以下几个方面:
提高CPU利用率:尽可能使CPU始终处于忙碌状态,避免因等待I/O或其他事件而空闲。
1.提高系统吞吐量:单位时间内完成尽可能多的进程(作业)。
2.公平性:保证各个进程能够获得合理的CPU时间,避免饥饿现象。
3.响应时间短(对于分时系统):使交互式用户能获得快速响应。
4.满足截止时间(对于实时系统):确保实时任务在限定的时间内完成。
5.平衡系统资源:兼顾I/O密集型与CPU密集型进程,使整体系统效率最优。
不同的操作系统(批处理、分时、实时)对调度目标的侧重点不同,但核心都是管理CPU资源,使系统高效、公平、可靠地运行。
2、高级调度与低级调度的主要功能是什么?为什么要引入中级调度?
1. 高级调度与低级调度的主要功能
高级调度(作业调度、长程调度)
主要功能:从外存(如磁盘)上处于后备队列的作业中选择一个或多个,为它们分配内存、I/O设备等必要资源,然后建立相应的进程(或线程),使其具备竞争CPU的资格。
应用场景:多道批处理系统,常用于进程的“入门”控制。
低级调度(进程/线程调度、短程调度)
主要功能:从就绪队列中选择一个进程(或线程),将CPU分配给该进程,使其运行。
执行频率:很高(毫秒或微秒级),是操作系统中最核心的调度机制。
2. 为什么要引入中级调度?
引入中级调度(中程调度)的主要目的是提高内存利用率和系统吞吐量,并调节系统负载。具体原因如下:
1.内存资源有限:当内存中同时运行的进程过多时,可能导致CPU大部分时间消耗在上下文切换上,系统效率下降(“抖动”现象)。
2.临时性地换出进程:中级调度可以将暂时无法运行(如等待I/O、低优先级)或内存压力大的进程从内存换出到外存(挂起状态),释放内存空间给其他进程。当这些进程的条件满足(如I/O完成、内存空闲)时,再换入内存继续执行。
3.综合调度需求:高级调度负责作业进入内存,低级调度负责CPU分配,而中级调度用于在运行过程中动态调整内存中的进程数量,平衡系统负载。
总结:高级调度决定哪些程序进入内存竞争CPU,低级调度决定下一个占用CPU的进程,中级调度则在内存与外存之间交换进程,以缓解内存压力并优化系统性能。
3、处理机调度一般可分为哪三级?其中哪一级调度必不可少?为什么?
处理机调度一般可分为以下三级:
1.高级调度(作业调度、长程调度)
2.中级调度(中程调度、挂起/解挂调度)
3.低级调度(进程/线程调度、短程调度)
哪一级调度必不可少?
低级调度(进程/线程调度)必不可少。
为什么?
任何一个通用操作系统(无论批处理、分时、实时)都必须能够将CPU资源动态分配给就绪的进程或线程,否则系统无法并发或并行运行多个任务。
高级调度并非所有系统都需要(例如分时系统或实时系统可能直接创建进程,无需作业调度)。
中级调度用于缓解内存压力、提高系统性能,但不是最低必需功能(小型或专用系统可以不实现)。
而低级调度是操作系统内核最基础的功能,即使只有一个进程,也需要调度器启动它并处理切换(如时间片耗尽、I/O阻塞后重新调度)。没有低级调度,CPU将无法在不同进程间切换,多道程序设计就无法实现。
因此,低级调度是必不可少的核心调度级。
4、作业在其存在过程中分为哪四种状态?
作业在其存在过程中通常分为以下四种状态(主要出现在批处理系统中):
1.提交状态:用户将作业通过输入设备(如读卡机、终端)提交给系统,但尚未被系统接收(如未进入磁盘的作业队列)。
2.后备状态:作业已被系统接收并存入外存(如磁盘)的作业后备队列中,等待高级调度(作业调度)为其分配内存和资源。
3.运行状态:作业被高级调度选中,分配了内存和必要资源,并建立了相应的进程。在进程运行过程中,作业处于运行状态(可能包含进程的就绪、运行、阻塞等子状态)。
4.完成状态:作业运行结束(正常结束或异常终止),系统回收资源并输出结果,此时作业已脱离系统。
注意:这与进程的三态(就绪、运行、阻塞)不同,作业状态是从提交到完成的宏观视角,更侧重于批处理系统中的作业生命周期。在现代分时系统和实时系统中,通常不严格区分作业的这四种状态,而是直接以进程/线程管理。
5、作业提交后是否马上放在内存中?为什么?
作业提交后并不是马上放在内存中。原因如下:
1.内存资源有限:内存的容量通常远小于外存(磁盘),不可能同时将所有提交的作业都装入内存。操作系统需要根据内存空闲情况、系统负载等条件,有选择地将作业调入。
2.作业调度的存在:作业提交后首先进入外存中的后备队列(后备状态),由高级调度(作业调度)按照某种算法(如先来先服务、短作业优先等)选择一部分作业,为其分配内存、I/O设备等资源,然后才将其调入内存并建立进程。
3.提高系统吞吐量:如果所有作业一提交就全部装入内存,会导致内存瞬间被占满,多道程序道数过少,甚至造成系统抖动;通过后备队列控制内存中的进程数量,可以平衡系统负载,提高整体效率。
4.对交互式系统(分时、实时):这类系统通常没有严格的作业提交到内存的延迟,用户请求直接创建进程或线程,但资源不足时仍可能发生换入换出(由中级调度负责)。不过对于批处理系统中的“作业”概念,提交后不会立即进入内存。
6、在操作系统中,引起进程调度的主要因素有哪些?
在操作系统中,引起进程调度(即重新决定下一个应该占用CPU的进程)的主要因素可以归纳为以下几种情况:
1.当前运行进程的时间片用完
在分时系统或采用时间片轮转的系统中,时钟中断产生后,系统发现当前进程已用完规定的时间片,则将其放入就绪队列末尾,并触发调度。
2.当前运行进程主动放弃CPU
例如进程执行了阻塞操作(如等待I/O、等待信号量、调用sleep()等),主动进入阻塞态,此时需要调度新的进程运行。
3.当前运行进程正常或异常结束
进程完成任务或发生错误终止时,释放CPU,系统立即调度下一个就绪进程。
4.有更高优先级的进程变为就绪态
在抢占式优先级调度中,当高优先级进程(如被唤醒的中断处理相关进程)进入就绪队列时,系统会剥夺当前低优先级进程的CPU,并调度高优先级进程运行。
5.当前进程被中断处理后,不再适合继续运行
例如I/O中断发生后,原本等待该I/O的进程被唤醒,但当前正在运行的进程可能仍继续;但在某些情况下(如实时任务或特殊策略),中断返回时可能触发重新调度。
6.系统调用或异常处理后的重新评估
执行系统调用(如sleep、wait、exit)或处理异常(如缺页中断)后,当前进程的状态可能改变(变为阻塞或终止),需要调度。
7.多处理器系统中的负载均衡(间接因素)
在某些多核系统中,可能会周期性触发调度以平衡各核任务,或者通过处理器亲和性调整。
总结:凡是导致当前进程无法继续占用CPU的事件(主动放弃、被抢占、结束),或者需要重新分配CPU以实现系统策略的事件(时间片用完、优先级变化、中断返回),都会引发进程调度。
7、作业调度与进程调度二者间如何协调工作?
作业调度(高级调度)与进程调度(低级调度)是操作系统调度体系中的两个不同层次,它们通过状态衔接、资源分配与队列管理来协调工作。具体协调方式如下:
1. 作业调度为进程调度“准备原材料”
作业调度从外存的后备队列中选取作业,为该作业创建进程(通常一个作业对应一个或多个进程),并分配初始资源(如内存、I/O表项)。
这些新创建的进程被放入就绪队列,等待进程调度。
2. 进程调度负责CPU的动态分配
进程调度从就绪队列中选择一个进程,将CPU分配给该进程执行。
当进程因时间片用完、等待事件、终止等原因放弃CPU时,进程调度再次选择下一个就绪进程。
3. 协调的关键点:作业调度必须考虑系统负载
作业调度不能无限制地往内存中放入进程,否则会造成内存不足或系统抖动。它需要根据当前内存中活跃进程的数量、CPU利用率、资源使用情况来决定是否接纳新作业。
在支持中级调度的系统中,如果内存压力过大,可能先换出一些进程(挂起),再接受新作业。
4. 通过状态传递实现闭环
作业状态 → 进程状态:作业被调度后进入“运行状态”(宏观),此时其对应的进程处于“就绪/运行”等微观状态。
进程终止 → 作业完成:当作业对应的所有进程都结束时,作业转为完成状态,系统回收资源并输出结果。
5. 一个典型的协调流程示例(批处理系统)
1.作业调度选择一个作业,为其创建进程,放入就绪队列。
2.进程调度从就绪队列中选中该进程,使其运行。
3.若进程主动等待I/O,则阻塞并让出CPU;I/O完成后唤醒,重新进入就绪队列。
4.作业调度不断接纳新作业(若内存有空闲且道数未满),从而维持多道程序并发度。
5.当作业的最后一个进程结束时,通知作业调度该作业已完成。
6. 为什么需要分开设计?
时间尺度不同:作业调度执行频率低(秒/分钟级),进程调度频率高(毫秒/微秒级)。
职责分离:作业调度管理“哪些程序可进入内存竞争CPU”,进程调度管理“下一个谁用CPU”,二者配合可使系统既控制并发度,又保证低延迟。
总结:作业调度负责把程序变成可运行的进程并加入就绪队列,进程调度负责从就绪队列中挑选进程运行。二者通过就绪队列、内存管理信息和系统负载控制相互协调。
8、在确定调度方式和调度算法时,常用的评价准则有哪些?
在确定调度方式和调度算法时,常用的评价准则可以分为面向用户和面向系统两类,具体如下:
一、面向用户的准则(从用户角度)
1.周转时间短
作业从提交到完成所经过的时间(包括等待、就绪、运行、I/O等)越短越好。平均周转时间、带权周转时间(周转时间/实际运行时间)是常用指标。
2.响应时间快
从用户发出请求到系统首次产生响应的时间。分时系统和实时系统尤其看重此指标。
3.截止时间保证
实时系统要求任务必须在规定的截止时间前完成。
4.公平性
所有进程应获得合理的CPU时间份额,避免饥饿现象。
5.可预测性
调度行为应相对稳定,用户能大致预估作业的运行规律。
二、面向系统的准则(从系统角度)
1.CPU利用率高
CPU尽可能保持忙碌状态,避免空闲等待。
2.系统吞吐量大
单位时间内完成的作业(或进程)数量越多越好。批处理系统最看重此指标。
3.资源利用率均衡
避免CPU、I/O、内存等资源的“偏科”,使各类设备忙碌程度合理。
4.调度开销小
调度算法本身的执行时间(上下文切换、队列操作等)应尽可能小,不占用过多系统资源。
5.可扩展性与可控性
算法应能适应不同系统负载(轻载/重载)和硬件配置。
三、特殊场景下的准则
实时系统:强调查截止时间满足率、中断响应延迟。
嵌入式系统:强调可确定性和低内存占用。
服务器系统:可能额外关注并发连接处理能力、公平分享等。
总结:没有一种调度算法能同时最优满足所有准则,设计调度器时需要根据系统类型(批处理、分时、实时)在吞吐量、响应时间、公平性、资源利用率之间作出权衡。
9、简述先来先服务法、时间片轮转法和优先级调度算法的实现思想。
下面是三种经典调度算法的实现思想简述:
1. 先来先服务法(FCFS, First Come First Served)
实现思想:按照进程(或作业)到达就绪队列的先后顺序进行调度。先请求CPU的进程先被分配CPU,直到该进程主动释放CPU(如运行结束或阻塞)后,才调度下一个进程。
特点:非抢占式,实现简单、公平;但短进程可能排在长进程之后,导致平均周转时间长,交互性差。
2. 时间片轮转法(RR, Round Robin)
实现思想:系统将所有就绪进程排成一个先进先出的队列。调度程序每次将CPU分配给队首进程,并设置一个时间片(如10~100ms)。若进程在时间片内运行结束,则立即调度下一个;若时间片用完而进程未完成,则将其移到队尾,再调度新的队首进程。
特点:抢占式(由时钟中断驱动),响应时间快,适合分时系统;但时间片设置要合理:太短导致上下文切换开销大,太长则退化为FCFS。
3. 优先级调度算法
实现思想:为每个进程赋予一个优先级(数值可高可低,看具体定义),调度时从就绪队列中选择优先级最高的进程分配CPU。
两种方式:
非抢占式:高优先级进程进入就绪队列时,若当前进程正在运行,则等待其主动让出CPU。
抢占式:一旦出现优先级更高的就绪进程,立即剥夺当前进程的CPU,分配给高优先级进程。
特点:可用于批处理、分时、实时系统,能区分任务重要性;但低优先级进程可能产生饥饿(无限等待)。通常结合动态优先级(如随时间提升或下降)或老化技术来避免饥饿。
总结对比:
FCFS:简单公平,但短作业吃亏。
RR:保证公平响应,适合交互式系统。
优先级调度:灵活区分任务紧急程度,需处理饥饿问题。
10、中断响应主要做哪些工作?由谁来做?
中断响应是硬件和软件协同完成的关键过程,主要工作是保存当前CPU状态、识别中断源、转入对应的中断处理程序。具体工作与执行者如下:
一、中断响应的主要工作(由硬件完成)
1.接收中断信号:CPU检测到中断请求引脚(INTR)或内部异常信号。
2.关中断(自动清除中断允许标志):防止在保存现场过程中被更高优先级中断嵌套。
3.保存断点:将当前程序计数器(PC)或下一条指令地址压入堆栈或保存到特定寄存器,以便中断返回后继续执行。
4.识别中断源:通过中断请求线、中断控制器(如8259A、APIC)或异常类型号获得中断向量(中断号)。
5.转向中断处理程序:根据中断向量查找中断向量表(或中断描述符表IDT),获取中断处理程序的入口地址,并跳转执行。
这部分工作由CPU硬件自动完成,不需要软件指令。
二、进入中断处理程序后的工作(由软件——中断处理程序完成)
1.保存现场:将当前程序状态字(PSW)、通用寄存器、段寄存器等推入系统栈或进程内核栈(由汇编或C代码完成)。
2.中断处理:根据中断类型执行相应服务程序(如键盘读字符、时钟更新系统时间、处理缺页异常)。
3.恢复现场:在中断返回前,从栈中恢复之前保存的寄存器与PSW。
4.开中断并返回:执行中断返回指令(如IRET),恢复断点PC,使CPU回到中断前的执行流。
总结
由硬件做:关中断、保存断点(PC)、识别中断源、找到处理程序入口。
由软件(中断处理程序)做:保存/恢复寄存器现场、具体中断服务、执行中断返回指令。
二者的配合保证了中断响应既快速又灵活。
11、一般中断处理的主要步骤是什么?
一般中断处理的主要步骤可以分为以下几个阶段(以典型的单核处理器和通用操作系统为例):1. 中断请求与识别(硬件完成)
外部设备或内部异常发出中断信号。
CPU检测到中断请求,在指令执行周期的结束阶段响应中断。
2. 中断响应(硬件自动完成)
关中断:禁止更高优先级的中断在当前处理过程中打断。
保存断点:将当前程序计数器(PC)和程序状态字(PSW)压入堆栈或保存到特定位置。
获取中断向量:通过中断控制器获得中断类型号,并从中断向量表(或IDT)中找到对应中断处理程序的入口地址。
3. 保护现场(软件/中断处理程序开头部分)
将CPU的通用寄存器、段寄存器、堆栈指针等压入系统栈或进程内核栈,以便后续恢复。
有些系统还会保存当前进程的PCB指针等信息。
4. 中断处理(软件,核心服务)
根据中断原因执行具体操作:
时钟中断:更新系统时间、递减时间片、触发调度标志。
I/O中断:读取设备状态、将数据从设备缓冲区拷贝到内存、唤醒等待该I/O的进程。
异常(缺页、除零等):执行内核修复或终止进程。
5. 恢复现场(软件)
从栈中弹出之前保存的寄存器、PSW等数据,恢复CPU状态。
6. 开中断与中断返回(硬件+软件指令)
开中断(允许响应新的中断)。
执行中断返回指令(如IRET),从堆栈中恢复PC和PSW,使CPU返回到中断前的程序继续执行。
12、简述一条shell命令在Linux系统中的实现过程。
一条 Shell 命令(如 ls -l)在 Linux 系统中的实现过程大致可以分为以下几个步骤:
1. 用户在终端输入命令并回车
Shell 程序(如 bash)捕获用户输入的命令行字符串。
2. Shell 解析命令
Shell 对输入进行词法分析与语法解析,识别出命令名(ls)和参数(-l)。
同时检查是否有重定向(>、<)、管道(|)、后台运行(&)等特殊符号。
3. 查找命令对应的可执行文件
如果命令是内部命令(如 cd、exit),Shell 直接调用内部函数执行,不创建新进程。
如果是外部命令,Shell 根据 PATH 环境变量指定的目录顺序,依次查找是否存在名为 ls 的可执行文件(通常是 /bin/ls 或 /usr/bin/ls)。
4. 创建子进程(fork)
Shell 调用 fork() 系统调用,创建一个与自身几乎完全相同的子进程。
父进程(Shell)等待子进程结束(前台命令)或继续接收下一条命令(后台命令加 &)。
5. 在子进程中加载并执行命令(exec 族函数)
子进程调用 execve() 或 execlp() 等系统调用,将 ls 可执行文件的内容加载到自己的地址空间,并替换原有的代码、数据、堆栈。
同时将参数 -l 传递给新程序。
6. 运行命令并返回结果
ls 程序开始执行,调用相关系统调用(如 open、readdir、write 等)读取目录内容,格式化输出到标准输出(默认是终端)。
当 ls 执行完毕(正常或异常),子进程调用 exit() 系统调用结束。
7. 父进程回收子进程
Shell(父进程)通过 wait() 或 waitpid() 系统调用获取子进程的退出状态,清理子进程的进程控制块(PCB)。
然后 Shell 重新打印提示符(如 $),等待下一条命令。
总结:一条 Shell 命令的实现本质是 Shell 解析 + fork 创建子进程 + exec 加载新程序 + wait 回收子进程 这四个系统调用的组合。对于内部命令(如 cd),则直接由 Shell 自身执行,不经过 fork/exec 流程。
13、Linux系统中,进程调度的方式和策略是什么?对用户进程和核心进程如何调度?
在 Linux 系统中,进程调度的方式和策略是清晰分层的,并且对用户进程和内核线程采用统一的调度框架进行管理。其中,完全公平调度器(CFS,Completely Fair Scheduler)是现代 Linux 内核的默认调度器。
1. 进程调度的方式:抢占式多任务
Linux 采用抢占式多任务调度方式。这意味着操作系统(调度器)有权强制挂起(即抢占)当前正在运行的进程,即使该进程尚未执行完毕。这种机制确保了没有单个进程能独占 CPU 太久,实现了系统的高响应性和公平性。进程在被抢占前可以运行的时间被称为时间片。
2. 进程调度的策略:调度类与算法
Linux 将调度策略组织为不同的调度类,形成一个优先级体系。内核会优先处理高调度类中的任务。主要分为两大类:
实时调度策略
这类策略用于对响应时间有严格要求的特殊任务,其优先级高于所有普通进程。
SCHED_FIFO:先进先出策略。一个采用此策略的进程一旦获得 CPU,除非它主动让出或被更高优先级的实时进程抢占,否则会一直运行。
SCHED_RR:时间片轮转策略。与 SCHED_FIFO 类似,但同优先级的多个进程会以轮转方式分配时间片,更公平一些。
SCHED_DEADLINE:截止时间调度策略。这是最严格的实时策略,内核会根据任务指定的"运行时间"和"截止时间"来确保任务在期限前完成。
普通调度策略(默认)
SCHED_OTHER 或 SCHED_NORMAL:这是系统默认的调度策略,它由 CFS 完全公平调度器实现。SCHED_BATCH 和 SCHED_IDLE 是用于批处理任务和极低优先级任务的其他普通策略。
3. CFS 的核心机制:公平性的量化
CFS 实现了一种有趣的公平理念:它试图让所有可运行的任务获得"公平"的处理器时间份额,核心在于虚拟运行时间的概念。
虚拟运行时间:每个进程都有一个 vruntime 值,它代表该进程已获得的 CPU 时间的"归一化"度量。
红黑树:CFS 将所有可运行的进程按 vruntime 值组织到一棵红黑树(一种自平衡二叉搜索树)中。
调度决策:CFS 调度器总是选择红黑树中最左侧的节点,即 vruntime 最小的进程来执行。这意味着到目前为止获得 CPU 时间最少的进程将得到下一次运行的机会。
优先级与 vruntime 的关系:进程的优先级(通过 nice 值设置,范围 -20 到 19)会影响其 vruntime 的增长速度。优先级越高(nice 值越小),其 vruntime 增长越慢,因此它会在红黑树中向右移动得更慢,从而有更多机会被选中运行。
4. 对用户进程和核心进程的调度
Linux 对进程和线程不加区分,都用 task_struct 结构表示。用户进程和内核线程都通过同一套调度器进行调度,但它们在资源使用和性质上存在关键差异。
|
类型 |
用户进程 |
内核线程 |
|
运行空间 |
主要运行在用户空间,通过系统调用进入内核空间。 |
始终运行在内核空间。 |
|
地址空间 |
拥有独立的虚拟地址空间。 |
没有自己的虚拟地址空间,只能访问内核的代码和数据。 |
|
调度策略 |
默认使用 SCHED_OTHER(CFS 调度类)。 |
既可设置为普通策略,也可以根据需要设置为高优先级的实时策略(SCHED_FIFO/RR)。 |
|
主要用途 |
运行用户的应用程序(如浏览器、文本编辑器)。 |
处理内核内部任务(如设备驱动、内存管理、文件系统缓存)。 |
虽然两类进程都被调度,但内核线程通常承载着对系统稳定性和实时性要求更高的任务。例如,响应硬件中断的内核线程必须能迅速获得 CPU。因此,虽然调度框架统一,但具体分配的策略和优先级可以截然不同,以满足不同任务的需求。
总结:Linux 通过 CFS 为普通任务提供了基于 vruntime 的公平调度,同时为实时任务保留了 FIFO、RR 等优先级更高的策略。用户进程和内核线程在统一调度器下运行,但内核线程常配置更高优先级以保障系统核心功能。
四、应用题
1、某分时系统的进程出现如图所示的状态变化。

(1)你认为该系统采用的进程调度算法是( A )。
A. 时间片轮转法
B. 先来先服务法
C. 优先级法
D. 最佳置换法
(2)根据以下A-F的提示,标识图中从①到⑥所示的每一个状态变化的原因。
A:进程被选中,变成运行态(①)
B:时间片到,运行的进程排入就绪队列尾部(②)
C:运行的进程启动打印机,等待打印(③)
D:打印工作结束,阻塞的进程排入就绪队列尾部(④)
E:等待磁盘读文件工作(⑤)
F:磁盘传输信息结束,阻塞的进程排入就绪队列尾部(⑥)
2、下表给出了作业1,2,3的提交时间和运行时间,时间单位为小时,以十进制进行计算。
表1 作业1,2,3的提交时间和运行时间

(1)若采用先来先服务调度算法,则调度次序是( A )。
A. l、2、3
B. 2、3、1
C. 3、2、1
D. 1、3、2
(2)计算各个作业的周转时间和平均周转时间。
作业1的周转时间是 8.0 ;
作业2的周转时间是 11.6 ;
作业3的周转时间是 12.0 ;
3个作业的平均周转时间是 31.6 / 3 10.5。
解析:
作业顺序:
作业 0 (0.0 来,运行 8.0) → 作业 1 (0.4 来,等 0 完) → 作业 2 (1.0 来,等 1 完)
作业 0
开始时间 = 0.0
完成时间 = 0.0 + 8.0 = 8.0
周转时间 = 8.0 - 0.0 = 8.0
作业 1
开始时间 = 8.0(等作业 0 完)
完成时间 = 8.0 + 4.0 = 12.0
周转时间 = 12.0 - 0.4 = 11.6
作业 2
开始时间 = 12.0(等作业 1 完)
完成时间 = 12.0 + 1.0 = 13.0
周转时间 = 13.0 - 1.0 = 12.0
平均周转时间
= (8.0 + 11.6 + 12.0) / 3
= 31.6 / 3
≈ 10.533 小时
[注:注意要保留小数位]
3、假定在单CPU条件下有下列要执行的作业:
|
作业 |
运行时间 |
优先数 |
|
1 |
10 |
3 |
|
2 |
1 |
1 |
|
3 |
2 |
3 |
|
4 |
1 |
4 |
|
5 |
5 |
2 |
作业到来的时间是按作业编号顺序进行的(即后面作业依次比前一个作业迟到一个时间单位)。
①用一个执行时间图描述在下列算法时各自执行这些作业的情况:先来先服务法FCFS、时间片轮转法RR(时间片=1)和非抢占式优先级。
②对于上述每种算法,各个作业的周转时间是多少?平均周转时间是多少?
③对于上述每种算法,各个作业的带权周转时间是多少?平均带权周转时间是多少?
答:
① 执行时间图描述
FCFS:作业顺序执行:J1(0→10),J2(10→11),J3(11→13),J4(13→14),J5(14→19)。
RR(时间片=1):按时间片轮转,执行顺序为(每单位时间切换):
0-1:J1,1-2:J1,2-3:J2,3-4:J1,4-5:J3,5-6:J4,6-7:J1,7-8:J5,8-9:J3,9-10:J1,10-11:J5,11-12:J1,12-13:J5,13-14:J1,14-15:J5,15-16:J1,16-17:J5,17-18:J1,18-19:J1。
非抢占式优先级(数小优先):
J1(0-10) → J2(10-11) → J5(11-16) → J3(16-18) → J4(18-19)。
② 周转时间与平均周转时间
FCFS:J1=10,J2=10,J3=11,J4=11,J5=15,平均=11.4。
RR:J1=19,J2=2,J3=7,J4=3,J5=13,平均=8.8。
非抢占优先级:J1=10,J2=10,J3=16,J4=16,J5=12,平均=12.8。
③ 带权周转时间与平均带权周转时间
FCFS:J1=1,J2=10,J3=5.5,J4=11,J5=3,平均=6.1。
RR:J1=1.9,J2=2,J3=3.5,J4=3,J5=2.6,平均=2.6。
非抢占优先级:J1=1,J2=10,J3=8,J4=16,J5=2.4,平均=7.48。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)