本文参考于《2021年操作系统考研复习指导》(王道考研),《计算机操作系统教程》
思维导图:
在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process)的概念,以便更好地描述和控制程序的并发执行,实现OS的并发性和共享性(最基本的两个特性)
为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block PCB)。系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。 相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)。 所谓创建进程,实质上是创建进程映像中的PCB;而撤销进程,实质上是撤销进程的PCB。 需注意:进程映像是静态的,而进程是动态的。
PCB是进程存在的唯一标志
可把传统操作系统中的进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
这里所说的系统资源指的是处理机、存储器和其他设备服务于某个进程的“时间”,例如把处理机资源理解为处理机的时间片才是准确的。因为进程是这些资源分配和调度的独立单位,即“时间片”分配的独立单位,这就决定了进程一定是一个动态的、过程性的概念。
进程与作业的关系:
进程是系统资源的使用者,系统的资源大部分都是以进程为单位分配的。而用户使用计算机是为了实现一串相关的任务,通常把用户要求计算机完成的这一串任务称为作业。
(1)批处理系统中作业与进程的关系(进程组织)
批处理系统可以通过磁记录设备或卡片机向系统提交批作业,由系统的SPOOLing输入进程将作业放入磁盘的输入井,作为后备作业。作业调度程序(一般也作为独立的进程运行)每当选择一道后备作业运行时,首先为该作业创建一个进程(称为该作业的根进程)。该进程将执行作业控制语言解释程序,解释该作业的作业说明书。父进程在运行过程中可以动态地创建一个或多个子进程,执行说明书中的语句。例如,对一条编译的语句,该进程可以创建一个子进程执行编译程序对用户源程序进行编译。类似地,子进程也可继续创建子进程去完成指定的功能。因此,一个作业就动态地转换成了一组运行实体——进程族。 当父进程遇到作业说明书中的撤出作业语句时,将该作业从运行态改变为完成态,将作业及相关结果送入磁盘上的输出井。作业终止进程负责将输出井中的作业利用打印机输出,回收作业所占用的资源,删除作业有关的数据结构,删除作业在磁盘输出井中的信息等。作业终止进程撤除一道作业后,可向作业调度进程请求进行新的作业调度。至此,一道进入系统运行的作业全部结束。
(2)分时系统中作业与进程的关系
在分时系统中,作业的提交方法、组织形式均与批处理作业有很大差异。分时系统的用户通过命令语言逐条与系统应答式地输入命令,提交作业。每输入一条(或一组)命令,便直接在系统内部对应一个(或若干)进程。在系统启动时,系统为每个终端设备建立一个进程(称为终端进程),该进程执行命令解释程序,命令解释程序从终端设备读入命令,解释执行用户输入的每条命令。对于每条终端命令,可以创建一个子进程去具体执行。若当前的终端命令是一条后台命令,则可以和下一条终端命令并行处理。各子进程在运行过程中完全可以根据需要创建子孙进程。终端命令所对应的进程结束后,命令的功能也相应处理完毕。用户本次上机完毕,用户通过一条登出命令结束上机过程。
分时系统的作业就是用户的一次上机交互过程,可以认为终端进程的创建是一个交互作业的开始,登出命令运行结束代表用户交互作业的终止。
命令解释程序流程扮演着批处理系统中作业控制语言解释程序的角色,只不过命令解释程序是从用户终端接收命令
(3)交互地提交批作业
在同时支持交互和批处理的OS中,人们可以用交互的方式准备好批作业的有关程序、数据及作业控制说明书。比如,可用交互式系统提供的全屏幕编辑命令编辑好自编的一个天气预报程序,用编译及装配命令将程序变成可执行文件,用调试命令进行程序调试。调试成功后,用户每天都要做如下工作:准备原始天气数据,运行天气预报执行文件处理原始数据,把结果打印出来等。这时,用交互系统提供的全屏幕编辑命令编辑好将要提交的作业控制说明书文件,如Windows系统的bat文件和Linux系统的sh文件。然后用一条作业提交命令将作业提交到系统作业队列中。系统有专门的作业调度进程负责从作业队列中选择作业,为被选取的作业创建一个父进程运行命令解释程序,解释执行作业控制说明书文件中的命令。
进程是由多道程序的并发执行而引出的,它和程序是两个截然不同的概念。进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求
(1)动态性
进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
(2)并发性
指多个进程实体同时存于内存中,能在一段时间内同时运行。并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
(3)独立性
指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序,都不能作为一个独立的单位参与运行。
(4)异步性
由于进程的相互制约,使得进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性, 为此在OS中必须配置相应的进程同步机制
(5)结构性
每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和PCB三部分组成的。
进程与程序的区别与联系:
(1)进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块(PCB)三部分组成的。而程序是一组有序的指令集合,是一种静态的概念。
(2)进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命周期,是暂时存在的;而程序则是一组代码的集合,是永久存在的,可长期保存。
(3)一个进程可以执行一个或几个程序,一个程序也可构成多个进程。程序的每次运行都构成不同的进程,通过多次执行,一个程序可对应多个进程,通过调用关系,一个进程可包括多个程序。进程可创建进程,而程序不可能形成新的程序
(4)进程与程序的组成不同。进程的组成包括程序、数据和PCB
进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断地发生变化(一个进程会经历若干不同状态)。通常进程有以下5种状态,前三种是进程的基本状态。
(1)运行态
进程正在处理机上运行。在单处理机环境下,每个时刻最多只有一个进程处于运行态
(2)就绪态
进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即执行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
(3)阻塞态
又称等待态。进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
(4)创建态
进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所必须的资源;最后把该进程转入就绪态。
(5)结束态
进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。进程需要结束运行时,系统首先必须置该进程为结束态,然后再进一步处理资源释放和回收等工作。
注意区分就绪态和等待态:就绪态是指进程仅缺少处理机,只要获得处理机资源就立即运行;而等待态是指进程需要其他资源(除处理机外)或等待某一事件。 之所以把处理机和其他资源划分开,是因为在分时系统的时间片轮转机制中,每个进程分到的时间片是若干毫秒。即进程得到处理机的时间很短且非常频繁,进程在运行过程中实际上是频繁地转换到就绪态的;而其他资源(如外设)的使用和分配或某一事件的发生(如I/O操作的完成)对应的时间相对来说很长,进程转换到等待态的次数也相对较少。这样看来,就绪态和等待态是进程生命周期中两个完全不同的状态,显然要加以区分。
三种基本状态之间的转换如下:
(1)就绪态——>运行态
处于就绪态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪态转换为运行态
(2)运行态——>就绪态
处于运行态的进程在时间片用完后,不得不让出处理机,从而进程由运行态变为就绪态。此外,在可剥夺的OS中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行。
(3)运行态——>阻塞态
进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转换为阻塞态。进程以系统调用的形式请求OS提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。
(4)阻塞态——>就绪态
进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转换为就绪态
一个进程从运行态变为阻塞态是主动的行为,而从阻塞态变成就绪态是被动的行为,需要其他相关进程的协助。
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在OS中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。 子进程可继承父进程所拥有的资源。 当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,必须同时撤销其所有的子进程。
在OS中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。OS创建一个新进程的过程如下(创建原语):
(1)为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败,则创建失败
(2)为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间(在PCB中体现)。若资源不足(如内存空间),则并非创建失败,而是处于阻塞态,等待内存资源
(3)初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
(4)若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行
引起进程终止的事件主要有:
(1)正常结束:表示进程的任务已完成并准备退出运行
(2)异常结束:表示进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算错、I/O故障等。
(3)外界干预:指进程应外界的请求而终止运行,如操作员或OS干预、父进程请求和父进程终止
OS终止进程的过程如下(撤销原语):
(1)根据被终止进程的标识符,检索PCB,从中读出该进程的状态
(2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程
(3)若该进程还有子孙进程,则应将其所有子孙进程终止
(4)将该进程所拥有的全部资源,或归还给其父进程,或归还给OS
(5)将该PCB从所在队列(链表)中删除
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作可做等,由系统自动执行阻塞原语(Block),使自己由运行态变为阻塞态。 进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞态。 阻塞原语的执行过程如下:
(1)找到将要被阻塞进程的标识号对应的PCB
(2)若该进程为运行态,则保护其现场,将其状态转为阻塞态,停止运行
(3)把该PCB插入相应事件的等待队列,将处理机资源调度给其他就绪进程
当被阻塞进程所期待的事件出现时,如它所启动的I/O操作已完成或其所期待的数据已到达,由相关进程(如,释放该I/O设备的进程,或提供数据的进程)调用唤醒原语,将等待该事件的进程唤醒。 唤醒原语的执行过程如下:
(1)在该事件的等待队列中找到相应进程的PCB
(2)将其从等待队列中移出,并置其状态为就绪态
(3)把该PCB插入就绪队列,等待调度程序调度
Block原语和Wakeup原语是一对作用刚好相反的原语,必须成对使用。Block原语是由被阻塞进程自我调用实现的,而Wakeup原语则是由一个与被唤醒进程合作或被其他相关的进程调用实现的
对于通常的进程而言,其创建、撤销及要求由系统设备完成的I/O操作,都是利用系统调用而进入内核,再由内核中的相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在OS内核的支持下运行的,是与内核紧密相关的。
进程切换是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。进程切换的过程如下:
(1)保存处理机上下文,包括PC和其他寄存器
(2)更新PCB信息
(3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列
(4)选择另一个进程执行,并更新其PCB
(5)更新内存管理的数据结构
(6)恢复处理机的上下文
注意进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的程序运行,则OS只需恢复进程进入内核时所保存的CPU现场,而无须改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变
“调度”和“切换”:
调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般,先有资源的调度,然后才有进程的切换
进程是一个独立的运行单位,也是OS进行资源分配和调度的基本单位。它由以下三部分组成,其中最核心的是进程控制块(PCB)
进程创建时,OS为它新建一个PCB,该结构之后常驻内存, 任意时刻都可以存取,并在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。
进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制和管理;进程结束时,系统收回其PCB,该进程随之消亡。操作系统通过PCB表来管理和控制进程。
当操作系统欲调度某进程运行时,要从该进程的PCB中查出其现行状态及优先级;在调度到某进程后,要根据其PCB中保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存始址,找到其程序和数据; 进程在运行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也需要访问PCB;当进程由于某种原因而暂停运行时,又需将其断点的处理机环境保存在PCB中。可见,在进程的整个生命周期中,系统总是通过PCB对进程进行控制的,亦即系统唯有通过进程的PCB才能感知到该进程的存在。
PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息等
(1)进程描述信息
进程标识符:标志各个进程,每个进程都有一个唯一的标识号
用户标识符:进程归属的用户,用户标识符主要为共享和保护服务
(2)进程控制和管理信息
进程当前状态:描述进程的状态信息,作为处理机分配调度的依据。
进程优先级:描述进程抢占处理机的优先级,优先级高的进程可优先获得处理机
(3)资源分配清单
用于说明有关内存地址空间或虚拟地址空间的状况,所打开文件的列表和所使用的输入/输出设备信息
(4)处理机相关信息
主要指处理机中各寄存器的值,当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程重新执行时,能从断点继续执行
在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各进程的PCB用适当的方法组织起来。目前,常用的组织方式有链接方式 和索引方式 两种。链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可把处于阻塞态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。 索引方式将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。
程序段就是能被进程调度程序调度到CPU执行的程序代码段。 程序可被多个进程共享,即多个进程可以运行同一个程序。
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果
进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类:
在通信的进程之间存在一块可以直接访问的共享空间,通过对这片共享空间进行读/写操作实现进程间的信息交换。
在对共享空间进行读/写操作时,需要使用同步互斥工具(如P操作、V操作),对共享空间的读/写进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享则是基于存储区的共享。OS只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读/写指令完成。
用户进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,要想让两个用户进程共享空间,必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的。
简单理解就是,甲和乙中间有一个大布袋,甲和乙交换物品是通过大布袋进行的,甲把物品放在大布袋里,乙拿走。但乙不能直接到甲的手中拿东西,甲也不能直接到乙的手中拿东西。
在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的。 若通信的进程之间不存在可直接访问的共享空间,则必须利用OS提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
(1)直接通信方式
发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。如图:
(2)间接通信方式
发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱,这种通信方式又称为信箱通信方式。 该通信方式广泛应用于计算机网络中,如电子邮件系统
简单理解就是,甲要告诉乙某些事情,就要写信,然后通过邮差送给乙。直接通信就是邮差把信直接送到乙的手上;间接通信就是乙家门口有一个邮箱,邮差把信放到邮箱里。
管道通信是消息传递的一种特殊方式。所谓管道,是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件。 向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道;而接收管道输出的接收进程(即读进程)则从管道中接收(读)数据。 为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥、同步和确定对方的存在
在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现如下:
(1)限制管道的大小
实际上,管道是一个固定大小的缓冲区。 在Linux中,该缓冲区的大小为4KB,这使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,如在写管道时可能变满,这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
(2)读进程也可能工作得比写进程快
当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题
从管道读数据是一次性操作,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。管道只能采用半双工通信,即某一时刻只能单向传输。 要实现父子进程双方互动通信,需要定义两个管道
管道可以理解为共享存储的优化和发展,因为在共享存储中,若某进程要访问共享存储空间,则必须没有其他进程在该共享存储空间中进行写操作,否则访问行为就会被阻塞。而管道通信中,存储空间进化成了缓冲区,缓冲区只允许一边写入,另一边读出,因此只要缓冲区中有数据,进程就能从缓冲区中读出,而不必担心会因为其他进程在其中进行写操作而遭到阻塞,因为写进程会先把缓冲区写满,然后才让读进程读,当缓冲区中还有数据时,写进程不会往缓冲区写数据。 这也决定了管道通信必然是半双工通信。
引入进程的目的是为了更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是为了减小程序在并发执行时所付出的时空开销,提高OS的并发性能。
线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、PC、寄存器集合和堆栈组成。 线程是进程中的一个实体,是被系统独立调度和分派的基本单位, 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。 一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。 由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
引入线程后,进程的内涵发生了改变,进程只作为除CPU外的系统资源的分配单元,而线程则作为处理机的分配单元。 由于一个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。
可简单理解为:线程是进程当中的一条执行流程;线程=进程-共享资源
(1)调度
在传统的OS中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。 在同一进程中,线程的切换不会引起进程切换。 在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
(2)拥有资源
不论是传统OS还是设有线程的OS,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有一点儿必不可少的资源),但线程可以访问其隶属进程的系统资源。 若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义
(3)并发性
在引入线程的OS中,不仅进程之间可以并发执行,而且多个线程之间也可以并发执行, 从而使OS具有更好的并发性,提高了系统的吞吐量
(4)系统开销
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,因此OS所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程CPU环境的保存及新调度的进程CPU环境的设置,而线程切换时只需要保存和设置少量寄存器内容,开销很小。 此外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须OS的干预。
(5)地址空间和其他资源(如打开的文件)
进程的地址空间之间互相独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
(6)通信方面
进程间通信(IPC)需要进程同步和互斥手段的辅助,以保证数据的一致性,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。
多线程操作系统把线程作为独立运行(或调度)的基本单位,此时的进程已不再是一个基本的可执行实体,但它仍具有与执行相关的状态。 所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。 线程的主要属性如下:
(1)线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块 ,线程控制块记录了线程执行的寄存器和栈等现场状态。
(2)不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,OS把它们创建成不同的线程。
(3)同一进程中的各个线程共享该进程所拥有的资源
(4)线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。
(5)一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化
为什么线程的提出有利于提高系统并发性?可以这样理解:由于有了线程,线程切换时,有可能会发生进程切换,也有可能不发生进程切换,平均而言每次切换所需的开销就变小了,因此能让更多的线程参与并发,而不会影响到响应时间等问题。
线程的实现可以分为两类:用户级线程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)。 内核级线程又称内核支持的线程
在用户级线程中,有关线程管理(线程的创建、撤销和切换等)的所有工作都由应用程序完成,内核意识不到线程的存在。 应用程序可以通过使用线程库设计成多线程程序。 通常,应用程序从单线程开始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。
在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。 内核为进程及其内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。
有些系统中使用组合方式的多进程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于等于用户级线程的数目)内核级线程上。
有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式。
(1)多对一模型
将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。 此模式中,用户级线程对OS不可见(即透明)
优点:线程管理在用户空间进行,效率较高
缺点:一个线程在使用内核服务时被阻塞,整个进程都会被阻塞;多个线程不能并行地运行在多处理机上。
(2)一对一模型
将每个用户级线程映射到一个内核级线程
优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。
缺点:每创建一个用户级线程就需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能。
(3)多对多模型
将n个用户级线程映射到m个内核级线程上,要求m<=n
特点:多对多模型是多对一模型和一对一模型的折中,既克服了多对一模型并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。此外,还拥有多对一模型和一对一模型各自的优点,可谓集两者之所长
例题:在单处理器系统中,若同时存在10个进程,则处于就绪队列中的进程最多有()个
答案:9;
例题:若一个进程实体由PCB、共享正文段、数据堆段和数据栈段组成,请指出下列C语言程序中的内容及相关数据结构各位于哪一段中
1.全局赋值变量 2.未赋值的局部变量
3.函数调用实参传递值 4.用malloc()要求动态分配的存储区
5.常量值(如1995、“string”) 6.进程的优先级
A.PCB B.正文段 C.堆段 D.栈段
答案:BDDCBA;C语言编写的程序在使用内存时一般分为3个段,它们一般是正文段(即代码和赋值数据段)、数据堆段和数据栈段。二进制代码和常量存放在正文段,动态分配的存储区在数据堆段,临时变量在数据栈段。 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
例题:同一程序经过多次创建,运行在不同的数据集上,形成了()的进程
A.不同 B.相同 C.同步 D.互斥
答案:A;一个进程是程序在一个数据集上的一次运行过程。运行于不同的数据集,将会形成不同的进程
例题:系统动态DLL库中的系统线程,被不同的进程所调用,它们是()的线程
A.不同 B.相同 C.可能不同,也可能相同 D.不能被调用
答案:B;系统线程被不同的进程所调用,该系统线程并不会被改变,还是属于相同的线程
例题:PCB是进程存在的唯一标志,下列()不属于PCB
A.进程ID B.CPU状态 C.堆栈指针 D.全部变量
答案:D;全局变量与PCB无关
例题:在一个多道系统中,若就绪队列不空,就绪的进程数目越多,处理器的效率()
A.越高 B.越低 C.不变 D.不确定
答案:C;只要就绪队列不空,CPU总是可以调度进程运行,保持繁忙
例题:下面的叙述中,正确的是()
A.同一进程内的线程可并发执行,不同进程的线程只能串行执行
B.同一进程内的线程只能串行执行,不同进程的线程可并发执行
C.同一进程或不同进程内的线程都只能串行执行
D.同一进程或不同进程内的线程都可以并发执行
答案:D;
例题:在以下描述中,()不是多线程系统的特长
A.利用线程并行地执行矩阵乘法运算
B.Web服务器利用线程响应HTTP请求
C.键盘驱动程序为每个正在运行的应用配备一个线程,用以响应该应用的键盘输入
D.基于GUI的调试程序用不同的线程分别处理用户输入、计算和跟踪等操作
答案:C;整个系统只有一个键盘,而且键盘输入是人的操作,速度比较慢,完全可以使用一个线程来处理整个系统的键盘输入
例题:进程和程序之间可以形成一对一、一对多、多对一、多对多的关系,请分别举例说明在什么情况下会形成这样的关系
答案:对单个进程在某个时刻而言,一个进程只能执行一个程序,进程与程序之间是一对一的关系。但对整个系统中的进程集合及进程的生命周期而言,进程与程序之间可以形成一对一、多对一、一对多、多对多的关系。
执行一条命令或运行一个应用程序时,进程和程序之间构成一对一的关系。 进程在执行过程中可以加载执行不同的应用程序,从而形成一对多的关系(一个进程可以对应多个程序,是指有的进程需要别的进程为它提供服务,这样就对应了多个程序。);以不同的参数或数据多次执行同一个应用程序时,形成多对一的关系; 并发地执行不同的应用程序时,形成多对多的关系。
例题:父进程创建子进程和主程序调用子程序有何不同
答案:父进程创建子进程后,父进程与子进程同时执行(并发)。主程序调用子程序后,主程序暂停在调用点,子程序开始执行,直到子程序返回,主程序才开始执行。
例题:为什么进程之间的通信必须借助于OS内核功能?简单说明进程通信的几种主要方式
答案:每个进程有自己独立的地址空间。在OS和硬件的地址保护机制下,进程无法访问其他进程的地址空间,所以必须借助于操作系统的系统调用函数实现进程之间的通信。 进程通信的主要方式有:
(1)共享内存区
通过系统调用创建共享内存区。多个进程可以(通过系统调用)连接同一个共享内存区,通过访问共享内存区实现进程之间的数据交换。使用共享内存区时需要利用信号量解决同步互斥问题
(2)消息传递
通过发送/接收消息,系统调用实现进程间的通信。当进程发送消息时,系统将消息从用户缓冲区复制到内核中的消息缓冲区,然后将消息缓冲区挂入消息队列。进程发送的消息保持在消息队列中,直到被另一进程接收。当进程接收消息时,系统从消息队列中解挂消息缓冲区,将消息从内核的消息缓冲区中复制到用户缓冲区,然后释放消息缓冲区。
(3)管道系统
管道是先进先出的信息流,允许多个进程向管道写入数据,允许多个进程从管道读出数据。在读/写过程中,OS保证数据的写入顺序和读出顺序是一致的。进程通过读/写管道文件或管道设备实现彼此之间的通信。
(4)共享文件
利用OS提供的文件共享功能实现进程之间的通信。这时,也需要信号量来解决文件共享操作中的同步和互斥问题
例题:什么是多线程?多线程与多任务有什么区别
答案:多线程是指在一个程序中可定义多个线程并同时运行它们,每个线程可执行不同的任务。
多线程与多任务的区别:多任务是针对OS而言的,代表OS可同时执行的程序个数;多线程是针对一个程序而言的,代表一个程序可以同时执行的线程个数,而每个线程可以完成不同的任务
回答下列问题:
(1)若系统中没有运行进程,是否一定没有就绪进程?为什么
(2)若系统中既没有运行进程,又没有就绪进程,系统中是否就没有进程?为什么?
(3)在采用优先级进程调度时,运行进程是否一定是系统中优先级最高的进程
答案:(1)是。若系统中未运行进程,则系统很快会选择一个就绪进程运行。只有就绪队列中无进程时,CPU才可能处于空闲状态
(2)不一定。系统中的所有进程可能都处于等待态,可能处于死锁状态,也有可能因为等待的事件未发生而进入循环等待态
(3)不一定。高优先级的进程可能正处于等待队列中,进程调度会从就绪队列中选择一个进程占用CPU,这个被选中的进程可能优先级较低
例题:现代OS一般都提供多进程(或称多任务)运行环境,回答以下问题
(1)为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构
(2)为支持进程状态的变迁,系统至少应提供哪些进程控制原语
(3)执行每个进程控制原语时,进程状态发生什么变化?相应的数据结构发生什么变化
答案:(1)为支持多进程的并发执行,系统为每个进程建立了一个数据结构:进程控制块PCB,用于进程的管理和控制。PCB中记录了有关进程的一些描述信息和控制信息,包括进程标识符、进程当前的状态、优先级、进程放弃CPU时的现场信息,以及指示组成进程的程序和数据在存储器中存放位置的信息、资源使用信息、进程各种队列的连接指针和反映进程之间的隶属关系的信息等。
(2)在进程的整个生命周期中,会经历多种状态。进程控制的主要职能是对系统中所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程的状态转换等功能。在OS内核中,有一组程序专门用于完成对进程的控制,这些原语至少需要包括创建新进程原语、阻塞进程原语、唤醒进程原语、终止进程原语等操作。系统服务对用户开放,即用户可以通过相应的接口来使用它们。
(3)进程创建原语:从PCB集合中申请一个空白的PCB,将调用者参数(如进程外部标识符、初始CPU状态、进程优先数、初始内存及申请资源清单等)添入该PCB,设置记账数据。置新进程为就绪态。
终止进程原语:用于终止完成的进程,回收其所占资源。包括消去其资源描述块,消去进程的PCB
阻塞原语:将进程从运行态变为阻塞态。进程被插入等待事件的队列,同时修改PCB中相应的表项,如进程状态和等待队列指针等
唤醒原语:将进程从阻塞态变为就绪态。进程从阻塞队列中移出,插入就绪队列,等待调度,同时修改PCB中相应的表项,如进程状态等。
例题:某分时系统中的进程可能出现如下图所示的状态变化
(1)根据图示,该系统应采用什么进程调度策略
(2)把图中每个状态变化的可能原因填写在下表中
答案:(1)时间片轮转调度策略
(2)
引进处理机调度后,可在运行进程等待外部设备时,把处理机调度给其他进程,从而提高处理机的利用率。引进处理机调度就是为了合理地处理计算机的软/硬件资源
处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行, 以实现进程并发地执行
(1)作业调度
又称高级调度,其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。 简言之,作业调度就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次。
多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。 作业调度的执行频率较低,通常为几分钟一次
(2)中级调度
又称内存调度,其作用是提高内存利用率和系统吞吐量。为此,应将那些暂时不能运行的进程调至外存等待,把此时的进程状态称为挂起态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定把外存上的那些已具备运行条件的就绪进程,再重新调入内存,并修改其状态为就绪态,挂在就绪队列上等待。
(3)进程调度
又称低级调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。 进程调度是OS中最基本的一种调度,在一般的OS中都必须配置进程调度。进程调度的频率很高,一般几十ms一次
作业调度从外存的后备队列中选择一批作业进入内存,为它们建立进程,这些进程被送入就绪队列,进程调度从就绪队列中选出一个进程,并把其状态改为运行态,把CPU分配给它。中级调度是为了提高内存的利用率,系统将那些暂时不能运行的进程挂起来。当内存空间宽松时,通过中级调度选择具备运行条件的进程,将其唤醒。
(1)作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将暂时不能运行的进程挂起,中级调度处于作业调度和进程调度之间。
(2)作业调度次数少,中级调度次数略多,进程调度频率最高
(3)进程调度是最基本的,不可或缺
进程调度和切换程序是OS内核程序。请求调度的事件发生后,才可能运行进程调度程序,调度了新的就绪进程后,才会进行进程间的切换。理论上这三件事情应该顺序执行,但在实际设计中,OS内核程序运行时,若某时发生了引起进程调度的因素,则不一定能够马上进行调度与切换。
现代OS中,不能进行进程的调度与切换的情况有以下几种:
(1)在处理中断的过程中
中断处理过程复杂,在实现上很难做到进程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源
(2)进程在OS内核程序临界区中
进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放
(3)其他需要完全屏蔽中断的原子操作过程中
如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换
若在上述过程中发生了引起调度的条件,则不能马上进行调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换
应该进行进程调度与切换的情况如下:
(1)发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度与切换。若OS只在这种情况下进行进程调度,则是非剥夺调度
(2)中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度与切换。若OS支持这种情况下的运行调度程序,则实现了剥夺方式的调度。
进程切换往往在调度完成后立刻发生,它要求保存原进程当前切换点的现场信息,恢复被调度进程的现场信息。 现场切换时,OS内核将原进程的现场信息推入当前进程的内核堆栈来保存它们,并更新堆栈指针。内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设PC寄存器等相关工作之后,开始运行新的进程。
所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。
通常有以下两种进程调度方式:
(1)非剥夺调度方式
又称非抢占方式。非剥夺调度方式是指当一个进程正在处理机上执行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程完成或发生某种事件而进入阻塞态时,才把处理机分配给更为重要或紧迫的进程。
在非剥夺调度方式下,一旦把CPU分配给一个进程,该进程就会保持CPU直到终止或转换到等待态。 这种方式的优点是实现简单、系统开销小,适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统。
(2)剥夺调度方式
又称抢占方式。剥夺调度方式是指当一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给这个更为重要或紧迫的进程
采用剥夺式的调度,对提高系统吞吐率和响应效率都有明显好处。但“剥夺”不是一种任意性行为,必须遵循一定的原则,主要有优先权、短进程优先和时间片原则等。
为了比较处理机调度算法的性能,人们提出了很多评价准则:
(1)CPU利用率
(2)系统吞吐量
表示单位时间内CPU完成作业的数量。 长作业需要消耗较长的处理机时间,因此会降低系统的吞吐量。而对于短作业,它们所需要消耗的处理机时间较短,因此能提高系统的吞吐量。调度算法和方式的不同,也会对系统的吞吐量造成较大的影响。
(3)周转时间
周转时间是指从作业提交到作业完成所经历的时间, 是作业等待、在就绪队列中排队、在处理机上运行及进行输入/输出操作所花费时间的总和。
周转时间=作业完成时间-作业提交时间
平均周转时间是指多个作业周转时间的平均值:
平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
带权周转时间是指作业周转时间与作业实际运行时间的比值:
带权周转时间=作业周转时间/作业实际运行时间
平均带权周转时间是指多个作业带权周转时间的平均值:
平均带权周转时间=(作业1的带权周转时间+…+作业n的带权周转时间)/n
(4)等待时间
等待时间指进程处于等处理机状态的时间之和,。处理机调度算法实际上并不影响作业执行或输入/输出操作的时间,只影响作业在就绪队列中等待所花的时间。 因此,衡量一个调度算法的优劣,常常只需简单地考察等待时间
(5)响应时间
响应时间指从用户提交请求到系统首次产生响应所用的时间。 在交互式系统中,周转时间不可能是最好的评价准则,一般采用响应时间作为衡量调度算法的重要准则之一。
OS中存在多种调度算法,有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。
FCFS调度算法既可以用于作业调度,又可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列
在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机
假设系统中有4个作业,它们的提交时间分别是8,8.4,8.8,9,运行时间依次是2,1,0.5,0.2,系统采用FCFS调度算法,这组作业的平均等待时间、平均周转时间和平均带权周转时间如下:
FCFS调度算法属于不可剥夺算法。 从表面上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面的许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。但它常被结合在其他调度算法中使用。 例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理
FCFS调度算法的特点是算法简单,但效率低;对长作业比较有利,但对短作业不利(相对于SJF和高响应比); 有利于CPU繁忙型作业,不利于I/O繁忙型作业
短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。短作业优先(SJF)调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行;短进程优先(SPF)调度算法从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。
假设系统中有4个作业,它们的提交时间分别是8,8.4,8.8,9,运行时间依次是2,1,0.5,0.2,系统采用SJF调度算法,这组作业的平均等待时间、平均周转时间和平均带权周转时间如下:
SJF调度算法的缺点有:
(1)算法对长作业不利;SJF调度算法中长作业的周转时间会增加。更严重的是,若有一长作业进入系统的后备队列,由于调度程序总是优先调度那些(即使是后进来的)短作业,将导致长作业长期不被调度(饥饿现象,饥饿与死锁不同,前者是调度策略问题,后者是系统环形等待)
(2)该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理
(3)由于作业的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度
SJF调度算法的平均等待时间、平均周转时间最少
优先级调度算法(优先权调度算法)既可用于作业调度,又可用于进程调度。该算法中的优先级用于描述作业运行的紧迫程度
在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行
根据新的更高优先级进程能否抢占正在执行的进程,可将该调度算法分为如下两种:
(1)非剥夺式优先级调度算法
当一个进程正在处理机上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在运行的进程继续运行,直到由于其自身的原因而主动让出处理机时(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
(2)剥夺式优先级调度算法
当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程
根据进程创建后其优先级是否可以改变,可以将进程优先级分为以下两种:
(1)静态优先级:
优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。 确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求
(2)动态优先级
在进程运行过程中,根据进程情况的变化动态调整优先级。 动态调整优先级的主要依据有进程占用CPU时间的长短、就绪进程等待CPU时间的长短
一般来说,进程优先级的设置可以参照以下原则:
(1)系统进程>用户进程
(2)交互性进程>非交互性进程(或前台进程>后台进程)
(3)I/O型进程>计算型进程
所谓I/O型进程,是指那些会频繁使用I/O设备的进程,而计算型进程是那些频繁使用CPU的进程(很少使用I/O设备)。若将I/O型进程的优先级设置得更高,就更有可能让I/O设备尽早开始工作,进而提高系统的整体效率
优先级调度算法按照任务的优先级进行调度,对于更紧急的任务给予更高的优先级,适合实时操作系统
高响应比优先调度算法主要用于作业调度,是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑了每个作业的等待时间和估计的运行时间。 在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
(1)作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业
(2)要求服务时间相同时,作业的响应比由其等待时间确定,等待时间越长,其响应比越高,因而它实现的是先来先服务
(3)对于长作业,作业的响应比可以随等待时间的增加而提高,等待时间足够长时,其响应比便可升到很高,从而也可获得处理机。因此,克服了饥饿状态, 兼顾了长作业
时间片轮转调度算法主要适用于分时系统。 在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。
在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。若时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算法。 若时间片很小,则处理机将在进程间过于频繁地切换,使处理机的开销增大,而真正用于运行用户进程的时间将减少。因此,时间片的大小应选择适当。
时间片的长短通常由以下因素确定:系统的响应时间、就绪队列中的进程数目和系统的处理能力
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合与发展。
通过动态调整进程优先级和时间片大小, 多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为提高系统吞吐量和缩短平均周转时间而照顾短进程;为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;同时,也不必事先估计进程的执行时间
多级反馈队列调度算法的实现思想如下:
(1)设置多个就绪队列,并为各个队列赋予不同的优先级, 第1级队列的优先级最高,第2级队列次之,其余队列的优先级逐次降低
(2)赋予各个队列中进程执行的时间片大小各不相同。在优先级越高的队列中,每个进程的运行时间片越小。 例如,第2级队列的时间片要比第1级队列的时间片长1倍… …第i+1级队列的时间片要比第i级队列的时间片长1倍
(3)一个新进程进入内存后,首先将它放入第1级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;若它在一个时间片结束时尚未完成,调度程序便将该进程转入第2级队列的末尾,再同样按FCFS原则等待调度执行;若它在第2级队列中运行一个时间片后仍未完成,再以同样的方法放入第3级队列… … 如此下去,当一个长进程从第1级队列依次降到第n级队列后,在第n级队列中便采用时间片轮转的方式运行。
(4)仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;仅当第1~(i-1)级队列均为空时,才会调度第i级队列中的进程运行。 若处理机正在执行第i级队列中的某进程,这时又有新进程进入优先级较高的队列( 第1~i-1中的任何一个队列 ),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回第i级队列的末尾,把处理机分配给新到的更高优先级的进程。
多级反馈队列的优势有以下几点:
(1)终端型作业用户:短作业优先
(2)短批处理作业用户:周转时间较短
(3)长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理
高响应比优先调度算法、时间片轮转调度算法、多级反馈队列调度算法都能保证每个任务在一定时间内分配到时间片,并轮流占用CPU,适合分时操作系统
例题:时间片轮转调度算法是为了()
A.多个用户能及时干预系统 B.使系统变得高效
C.优先级较高的进程及时得到响应 D.需要CPU时间最少的进程最先做
答案:A;时间片轮转的主要目的是,使得多个交互的用户能够得到及时响应,使得用户以为独占计算机的使用,因此它并没有偏好,也不会对特殊进程做特殊服务。 时间片轮转增加了系统开销,所以不会使得系统高效运转,吞吐量和周转时间均不如批处理。但其较快速的响应时间使得用户能够与计算机进行交互, 改善了人机环境,满足用户需求
例题:()有利于CPU繁忙型的作业,而不利于I/O繁忙型的作业
A.时间片轮转调度算法 B.FCFS调度算法
C.SJF调度算法 D.优先权调度算法
答案:B;
例题:若每个作业只能建立一个进程,为了照顾短作业用户,应采用();为了照顾紧急作业用户,应采用();为了能实现人机交互,应采用();而能使短作业、长作业和交互作业用户都满意,应采用()
A.FCFS调度算法 B.短作业优先调度算法
C.时间片轮转调度算法 D.多级反馈队列调度算法
E.剥夺式优先级调度算法
答案:BECD
例题:设有三个作业,其运行时间分别是2h,5h,3h,假定它们同时到达,并在同一台处理器上以单道方式运行,则平均周转时间最小的执行顺序是()
答案:1,3,2
例题:作业是用户提交的,进程是由系统自动生成的,除此之外,两者的区别是()
A.两者执行不同的程序段
B.前者以用户任务为单位,后者以OS控制为单位
C.前者是批处理的,后者是分时的
D.后者是可并发执行的,前者则不同
答案:B;作业是从用户角度出发的,它由用户提交,以用户任务为单位;进程是从操作系统出发的,由系统生成,是操作系统的资源分配和独立运行的基本单位。
答案:D;
答案:D;
例题:下列说法中,正确的是()
1.分时系统的时间片固定,因此用户数越多,响应时间越长
2.UNIX是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照OS分类,属于分时OS
3.中断向量地址是中断服务例行程序的入口地址
4.中断发生时,由硬件保护并更新PC,而不是由软件完成,主要是为了提高处理速度
答案:A;
例题:若某单处理器多进程系统中有多个就绪态进程,则下列关于处理机调度的叙述中,错误的是()
A.在进程结束时能进行处理机调度
B.创建新进程后能进行处理机调度
C.在进程处于临界区时不能进行处理机调度
D.在系统调用完成并返回用户态时能进行处理机调度
答案:C;当进程处于临界区时,说明进程正在占用处理机,只要不破坏临界资源的使用规则,就不会影响处理机的调度。比如,通常访问的临界资源可能是慢速的外设(如打印机),若在进程访问打印机时,不能进行处理机调度,则系统的性能将非常差
答案:D;
答案:C;
例题:为什么说多级反馈队列调度算法能较好地满足各类用户的需要
答案:多级反馈队列调度算法能较好地满足各种类型用户的需要。对终端型作业用户而言,由于它们提交的作业大多属于交互型作业,作业通常比较短小,系统只要能使这些作业在第一级队列所规定的时间片内完成,便可使终端型作业用户感到满意;对于短批处理作业用户而言,它们的作业开始时像终端型作业一样,若仅在第一级队列中执行一个时间片即可完成,便可获得与终端型作业一样的响应时间,对于稍长的作业,通常也只需要在第二级队列和第三级队列中各执行一个时间片即可完成,其周转时间仍然较短;对于长批处理作业用户而言,它们的长作业将依次在第1,2,…,n级队列中运行,然后再按时间片轮转方式运行,用户不必担心其作业长期得不到处理
例题:
答案:系统首先对优先级为4的进程P1,P2,P3采用时间片轮转调度算法运行;当P1、P2、P3均运行结束或没有可运行的进程(即P1、P2、P3都处于等待态;或其中部分进程已运行结束,其余进程处于等待态)时,对优先级为3的进程P4、P5采用时间片轮转调度算法运行。在此期间,若未结束的P1、P2、P3有一个转为就绪态,则当前时间片用完后又回到优先级4进行调度。类似地,当P1~P5均运行结束或没有可运行的进程(即P1 ~ P5都处于等待态;或其中部分进程已运行结束,其余进程处于等待态)时,对优先级为2的进程P6、P7、P8采用时间片轮转调度算法运行,一旦P1 ~ P5中有一个转为就绪态,当前时间片用完后立即回到相应的优先级进行时间片轮转调度
答案:(1)具有两道作业的批处理系统,内存只存放两道作业,它们采用抢占式优先级调度算法竞争CPU,而将作业调入内存采用的是短作业优先调度。 8:00,作业1到来,此时内存和处理机空闲,作业1进入内存并占用处理机;8:20,作业2到来,内存仍有一个位置空闲,因此将作业2调入内存,又由于作业2优先数高,相应的进程抢占处理机,在此期间8:30作业3到来,但内存此时无空闲,因此等待。直至8:50,作业2执行完毕,此时作业3、4竞争空出的一道内存空间,作业4的运行时间短,因此先调入,但它的优先级低于作业1,因此作业1先执行。到9:10时,作业1执行完毕,再将作业3调入内存,且由于作业3优先数高而占用CPU
(2)70min
(2)在时刻2,P1被挂到就绪队列队尾,队列顺序为P2、P3、P1,此时P4还未到达。
例题:假设一个计算机系统具有如下性能特征:处理一次中断平均需要500μs,一次进程调度平均需要花费1ms,进程的切换平均需要花费2ms。若该计算机系统的定时器每秒发出120次时钟中断,忽略其他I/O中断的影响
(1)OS将百分之几的CPU时间分配给时钟中断处理程序
(2)若系统采用时间片轮转调度算法,24个时钟中断为一个时间片,OS每进行一次进程的切换,需要花费百分之几的CPU时间
(3)根据上述结果,说明为了提高CPU的使用效率,可以采用什么对策
答案:(1) 6%;(2)每次进程切换需一次调度、一次切换, 3/200=1.5%;(3)为提高CPU的效率,一般情况下要尽量减少时钟中断的次数,如由每秒120次降低到100次,以延长中断的时间间隔。或将每个时间片的中断数量(时钟数)加大,如由24个中断加大到36个。也可优化中断处理程序,减少中断处理开销,如将每次500μs的时间降低到400μs。
例题:某进程调度程序采用基于优先数(priority)的调度策略,即选择优先数最小的进程运行,进程创建时由用户指定一个nice作为静态优先数。为了动态调整优先数,引入运行时间cpuTime和等待时间waitTime,初值均为0。进程处于执行态时,cpuTime定时加1,且waitTime置0;进程处于就绪态时,cpuTime置0,waitTime定时加1
(1)若调度程序只将nice的值作为进程的优先数,即priority=nice,则可能会出饥饿现象,为什么
(2)使用nice,cpuTime和waitTime设计一种动态优先数计算方法,以避免产生饥饿现象,并说明waitTime的作用
答案:(1)由于采用了静态优先数,当就绪队列中总有优先数较小的进程时,优先数较大的进程一直没有机会运行,因而会出现饥饿现象
(2)priority=nice+k1 x cputime-k2 x waittime,k1,k2>0,用于分别调整cputime和waittime在priority中所占的比例。waittime可使长时间等待的进程优先数减少,从而避免产生饥饿现象
例题:在一个有两道作业的批处理系统中,有一作业序列,其到达时间及估计运行时间见下表。系统作业采用最高响应比优先调度算法。进程的调度采用SJF的抢占式调度算法
(1)列出各作业的执行时间(即列出每个作业运行的时间片段,如作业i的运行时间序列为10:00~10:40,11:00~11:20,11:30~11:50结束)
(2)计算这批作业的平均周转时间