操作系统(三)—— 进程和线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alexshi5/article/details/88086010

一、多道程序设计

        一个程序在计算机系统中运行,除了程序本身要是可执行的目标代码外,还要有相应的数据。程序和数据被提前存储在存储器中,在执行该程序前,处理器中的指令计数器必须指向存储器中被执行程序的首地址。如果程序执行过程中还需要其他的资源,那么在申请使用磁盘时,还要知道磁盘的设备编号、文件的名称以及文件在磁盘中的物理位置、文件长度等信息,这些信息均要有存储空间对它们加以保存。如果有多个程序要同时进入内存并运行,那么每个要运行的程序也要准备相关信息或资源的存储空间。

        为了能够从技术上较为准确地描述正在运行、将要运行或者刚刚退出运行的各个程序的执行代码、数据以及所需的资源信息等,人们引进了进程(Process)这个概念。

        采用多道程序设计充分发挥了处理器与外围设备以及外围设备之间的并行工作能力,从而提高了处理器和其他资源的利用率。

1、程序的顺序执行

        我们把一个具有独立功能的程序独占处理器直到得到最终结果的过程称为程序的顺序执行。程序的顺序执行具有以下4个特点:

(1) 顺序性

        程序所规定的动作在机器上是严格地按顺序执行。

(2) 封闭性

        封闭性是指程序执行得到的最终结果是由给定的初始条件决定的,不受外界因素的影响,这些资源的状态只有程序本身的动作才能改变。

(3) 程序执行结果的确定性

        程序的执行结果与时间无关,无论执行多长时间,其结果都是一样的。

(4) 程序执行结果的可再现性

        即便程序是在不同的时间执行,只要输入的初始条件相同,则无论何时再重复执行该程序都会得到相同的结果。

2、程序的并发执行

        所谓并发执行,是指两个或两个以上的程序在计算机系统中,同时处于已开始执行且尚未结束的状态。能够参与并发执行的程序称为并发程序。

(1) 在执行期间并发程序相互制约

        资源的共享和竞争存在于多道程序的并发执行中,从而制约了各道程序的执行速度。

(2) 程序与计算不再一一对应

        在并发执行中,允许多个进程调用一段共享程序,从而形成多个计算。

(3) 并发程序的执行结果不可再现

        并发程序的执行程序与其执行的相对速度以及并发执行的多道程序之间的相互关系有关,导致并发程序的执行结果不可再现。

(4) 程序的并行执行与程序的并发执行

        多道程序的并发执行是指它们在宏观上,即在某一段时间周期内是同时进行的;但从微观上来看,在单处理器系统中,这些程序仍然是顺序执行的。

3、多道程序设计

(1) 多道程序设计技术的引入

        为了提高计算机系统中各种资源的利用效率,缩短进程的周转时间,在现代计算机中广泛采用多道程序技术,使多种硬件资源能够并行工作。

(2) 多道程序设计环境的特点

        所谓多道程序设计,就是允许多个程序同时进入内存并运行,其根本目的是提高整个系统的效率。衡量系统效率的尺度是系统吞吐量。所谓吞吐量是指单位时间内系统所处理进程的道数。引入多道程序设计之后,系统中的各种设备经常处于忙碌状态,提高了内存资源利用率,同时进入系统中的多个程序可以保存于内存的不同区域中,提高了处理器的资源利用率,最终提高了系统吞吐量。

        多道程序改善了各种资源的使用情况,增加了吞吐量,提高系统效率,但也带来了资源竞争。因此,在实现多道程序设计时,必须协调好资源使用者与被使用资源之间的关系,即对处理器资源加以管理。

        多道程序设计的主要特点是:① 独立性;② 随机性;③ 资源共享性。

(3) 多道程序设计的缺陷

 ① 可能延长某些程序的执行时间

        比如,两个程序顺序执行分别要40秒,合计要80秒。采用多道程序设计之后并发执行一起只要50秒了,但第一个程序的执行速度下降了10秒。

② 系统效率的提高是有一定限度的

        比如,内存空间的大小限制了可同时装入的程序数量;外部设备的数量有限;资源竞争需要等待;用户向系统提交程序时间上的随机性;程序执行速度的不确定等因素都会对多道程序的执行效率有一定的影响。

二、进程

1、进程的定义

        进程是具有一定独立功能的程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个单位。从操作系统的角度来看,可将进程分为系统进程和用户进程。系统进程执行操作系统程序,完成操作系统的某些功能。用户进程运行用户程序,直接为用户服务。系统进程的优先级通常高于一般用户进程的优先级。

(1) 进程与程序的联系和区别

        程序是构成进程的一部分,进程是程序的执行过程。程序是静态的,而进程是动态的。从静态的角度看,进程是由程序、数据和进程控制块(PCB)三部分组成的。程序的存在是永久的(不讨论人为删除),而进程只是暂时存在,它有生命周期。一个进程可以包括若干程序的执行,而一个程序也可以产生多个进程。

(2) 可再入程序

        一个能够被多个用户同时调用的程序称作是“可再入”的程序,可再入程序的操作对象,即数据是与程序相分离的。

(3) 进程的特征

        进程具有两个基本属性。首先,进程是一个可拥有资源的独立单位;其次,进程同时又是一个可以独立调度和分派的基本单位。进程具有以下特性:

① 并发性;② 动态性;③ 独立性;④ 交往性;⑤ 异步性;⑥ 结构性。

2、进程的状态与转换

(1) 三状态进程模型

        运行中的进程可以处于以下三种状态之一:运行、就绪、等待。

① 运行状态

        是指进程已经获得处理器,并且在处理器上执行的状态。

② 就绪状态

        是指一个进程已经具备运行条件,但由于没有获得处理器而不能运行的状态。

③ 等待状态

        也称阻塞或封锁状态,是指进程因等待某种事件发生而暂时不能运行的状态。

以上三种状态有四种状态转换情况:

① 就绪 》》运行

② 运行 》》就绪

③ 运行 》》等待

④ 等待 》》就绪

(2) 五状态进程模型

        五态模型中进程被分成下列五种状态。除了就绪、运行、等待之外,还有以下两种状态:

① 创建状态:进程正在创建过程中,还不能开始运行。

② 结束状态:进程已经结束运行,进程控制块(PCB)还没有被回收。

        五态模型的进程状态转换如下:

① 创建新进程

        创建一个新的进程,以运行一个程序。

② 提交

        完成一个新进程的创建过程,新进程进入就绪状态。

③ 调度运行

        从就绪进程表中选择一个进程,进入运行状态。

④ 释放

        由于进程完成或失败而终止进程运行,进入结束状态。

⑤ 超时或被抢占

        由于用完时间片或由于高优先级进程就绪被抢占等原因导致进程暂停运行。

⑥ 事件等待

        进程要求的事件未出现而进入阻塞,如I/O操作。

⑦ 事件出现

        进程等待的事件出现。

(3) 七状态进程模型

        在操作系统引入虚拟存储管理技术后,需要进一步区分进程的地址空间状态,因为进程优先级的问题,一些低优先级的进程可能要等待较长时间,因而会被切换到外存。这种做法可以提高处理器的效率,能够为运行进程提供足够的内存,也有利于调试。

        五态进程模型没有区分进程地址空间位于内存还是外存,与五态进程模型相比,七状态进程模型把原来的就绪状态和阻塞状态进行了细分,增加了就绪挂起和阻塞挂起两个状态。

        就绪与就绪挂起、阻塞与阻塞挂起它们的区别如下:

① 就绪:进程在内存,可进入运行状态;

② 阻塞:进程在内存,等待某个事件出现;

③ 就绪挂起:进程在外存,但只要进入内存就可运行;

④ 阻塞挂起:进程在外存,等待某个事件出现。

        在七态模型中,新引入的状态转换有挂起和激活两种,五态状态转换中出现变化的也有两类,如下:

① 挂起:把一个进程从内存转到外存

● 阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换;

● 就绪到就绪挂起:当有系统认为很快就绪的高优先级阻塞进程和低优先级进程时,系统会选择挂起低优先级就绪进程;

● 运行到就绪挂起:对于抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起,系统可能会把运行进程转到就绪挂起状态;

② 激活:把一个进程从外存转到内存

● 就绪挂起到就绪:就绪挂起进程优先级高于就绪进程或没有就绪进程时,会进行这种转换;

● 阻塞挂起到阻塞:当一个进程释放足够多的内存时,系统会把一个高优先级阻塞挂起进程激活,系统认为会很快出现该进程所等待的事件;

③ 事件出现:进程等待的事件出现

● 阻塞到就绪:针对内存进程的事件出现;

● 阻塞挂起到就绪挂起:针对外存进程的事件出现。

④ 提交:完成一个新进程的创建过程,新进程进入就绪状态或就绪挂起状态

3、进程控制块

        为了便于系统控制和描述进程的活动过程,在操作系统核心中定义了一个专门的数据结构,称为进程控制块(PCB),PCB是进程存在的唯一标志。

(1) PCB的内容

        PCB的内容可以分为调度信息和现场信息两大部分。调度信息供进程调度时使用,它描述了进程当前所处的状况,它包括进程名、进程号、地址空间信息、优先级、当前状态、资源清单、“家族”关系、消息队列指针、进程队列指针和当前打开文件等。

① 进程名、进程号:标识一个进程,一个进程的进程号必须是唯一的,用以说明进程的存在并区分进程;

② 地址空间:记录进程的相关信息;

③ 优先级:确定进程本身的优先级别;

④ 当前状态:指明进程处于进程基本状态的哪一种;

⑤ 资源清单:列出了该进程运行所需的各种资源;

⑥ “家族”关系:指明该进程是一个父进程,还是被别的进程创建的子进程;

⑦ 消息队列指针:指明了进程所属的消息队列所在的地址;

⑧ 进程队列指针:指出进程在队列中的位置;

⑨ 当前打开文件:记录了进程正在使用的文件的情况。

        现场信息刻画了进程的运行情况,由于每个进程都有自己专用的工作存储区,其他进程运行时不会改变它的内容。所以,PCB中的现场信息只记录了那些可能会被其他进程改变的寄存器,如程序状态字、时钟、界地址寄存器等。一旦中断进程的运行,必须把中断时刻的上述内容记入进程控制块的现场信息。

(2) 进程的组成

        进程由程序、数据和进程控制块三部分组成。由于进程控制块中保存有进程的地址信息,通过PCB可以得到进程程序的存储位置,也可以找到整个进程。

(3) PCB组织

① 线性方式:将所有的PCB不分状态组织在一个连续表中;

② 索引方式:对于具有相同状态的进程,分别设置各自的PCB索引表,表目为每个PCB在该PCB表中的地址,于是就构成了就绪索引表和等待索引表。另外,在内存固定单元设置三个指针,分别指示就绪索引表和等待索引表的起始地址以及执行态PCB在PCB表中的地址。

③ 链接方式:对于具有相同状态进程的PCB,通过PCB中的链接字构成一个队列,链接字指出本队列下一PCB在PCB表中的编号,编号为0的表示队尾,队首由内存固定单元中相应的队列指针指示,如此便形成就绪队列和等待队列。

(4) 进程的队列

        系统中的队列分为就绪队列、等待队列、运行队列。

(5) 进程队列的组成

        进程队列可以用进程控制块的链接来形成,常用链接方式有两种:单向链接和双向链接。

        在单向链接中,同一队列中的进程,通过进程控制块中的队列指针联系起来,前一进程的进程控制块中的指针值为它的下一个进程的进程控制块的地址,队列中最后一个进程的进程控制块中的指针值设置为“0”。

        在双向链接中,设置两个指针,称为前向指针和后向指针,分别指出它的前一个或后一个进程的进程控制块地址。另外,系统还为每个队列设置一个队首指针,指出该队列的第一个和最后一个进程的进程控制块地址,以便进行双向搜索。

4、进程控制

        进程有一个从创建到消亡的生命周期,这就需要对进程在整个生命周期中各种状态之间的转换进行有效的控制,称为进程控制。进程控制是通过进程控制原语来实现的。原语,是由若干条指令所组成的一个指令序列,用来实现某个特定的操作功能。原语必须在官态下执行,而且常驻内存。

        原语和系统调用都可以被进程所调用,它们的差别在于原语具有不可中断性,它是通过在其执行过程中关闭中断来实现的。

(1) 进程控制原语

        用于进程控制的原语一般有:创建进程、撤销进程、挂起进程、激活进程、阻塞进程、唤醒进程以及改变进程优先级等。

① 创建原语

        一个进程可以使用创建原语创建一个新的进程,前者称为父进程,后者称为子进程。子进程又可以创建新的子进程,构成新的父子关系,从而整个系统可以形成一个树形结构的进程家族。

        创建一个进程的主要任务是建立进程控制块PCB。

        创建进程的具体操作过程是:先申请一空闲PCB区域,然后将有关信息填入PCB,置该进程为就绪状态,最后把它插入到就绪队列。

② 撤销原语

        撤销进程的实质是撤销PCB,一旦PCB撤销了,进程就消亡了。

        撤销进程的具体操作过程是:找到要被撤销进程的PCB,将它从所在队列中消去,撤销属于该进程的一切子孙进程,释放被撤销进程所占用的全部资源,并消去被撤销进程的PCB。

③ 阻塞原语

        若某个进程的执行过程中,需要执行I/O操作,则由该进程调用阻塞原语把进程从运行状态转换到阻塞状态。

        具体的操作过程是:由于进程正处于运行状态,因此应首先中断处理器的执行,把处理器的当前状态保存在PCB的现场信息中,然后把进程的当前状态置为等待状态,并把它插入到该事件的等待队列中。

④ 唤醒原语

        一个进程因为等待某件事件的发生而处于等待状态,当该事件发生后,就用唤醒原语将其转换为就绪状态。

       具体的操作过程是:在等待队列中找到该进程,将进程的当前状态置为就绪状态,然后将它从等待队列中撤出并插入到就绪队列中排队,等待调度执行。

(2) UNIX操作系统的进程创建操作fork

        在UNIX操作系统中,父进程通过调用fork()函数创建子进程,它的步骤如下:

① 为子进程分配一个空闲的proc结构(进程描述符);

② 赋予子进程唯一的标识PID;

③ 以一次一页的方式复制父进程用户地址空间;

④ 获得子进程继承的共享资源的指针,如打开的文件和当前工作目录等;

⑤ 子进程就绪,加入调度队列;

⑥ 对子进程返回标识符0,向父进程返回子进程的PID。

        fork()函数的特点是:只被调用一次,却会返回两次。一次是在调用父进程中,一次是在新创建的子进程中。在父进程中,fork()函数返回子进程的PID,在子进程中,fork()函数返回0。因为子进程的PID总是非零的,通过返回值就可以区分程序是在父进程还是在子进程中执行。

        fork()函数虽然复制了一个自己,但并非要运行与父进程一样的代码,我们可以通过调用exec()函数来替换原父进程的代码。执行exec()函数的步骤如下:

① 在原进程空间装入新程序的代码、数据、堆和栈;

② 保持进程ID和父进程ID;

③ 继承控制终端;

④ 保留所有文件信息,如目录、文件模式和文件锁等。

        在UNIX中,父进程的执行与子进程的执行是异步的。因此,父进程可能早于子进程结束,如此一来,子进程的资源,如内存,就有可能无法归还给父进程,并引起内存泄漏等问题。wait函数就是父进程用来获取子进程的状态并回收资源的,父进程调用wait函数自我阻塞,等候子进程发来信号,该信号唤醒父进程后由父进程回收子进程的各项资源、清理表格以及回收内存等;若子进程先于父进程结束,此时子进程会暂时变为“僵尸”状态,继续占有部分资源,直到父进程运行wait函数时资源才会被回收(此时父进程不需要阻塞)。

        信号(Signal)函数是UNIX处理异步事件的经典方法。它的产生如下:

① 当用户按某些终端键时,产生信号;

② 硬件异常产生信号:除数为0、无效的存储访问等;

③ 进程用kill函数可将信号发送给另一个进程或进程组;

④ 用户可用kill函数将信号发送给其他进程;

⑤ 当检测到某种软件条件已经发生,并将其通知有关进程。

三、线程

1、线程的基本概念

(1) 什么是线程

        线程是进程中的一个实体,是处理器调度和分派的基本单位。线程基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器和栈等),它可与同属一个进程的其他线程共享进程所拥有的全部资源。

(2) 线程的属性

        线程有以下一些属性:

① 每一个线程有一个唯一的标识符和一张线程描述表,线程描述表记录了线程执行的寄存器以及栈等现场信息;

② 不同的线程可以执行相同的程序;

③ 同一个进程中的各个线程共享该进程的内存地址空间;

④ 线程是处理器的独立调度单位,多个线程是可以并发执行的;

⑤ 一个线程在被创建之后就开始了它的生命周期,直到终止。

(3) 引入线程的好处

① 创建一个新线程花费的时间少,创建线程不需要另外分配资源,同一个进程中的线程共享进程资源;

② 线程之间切换花费的时间少;

③ 线程之间通信无需调用内核,通信更简便,信息传输速度快;

④ 线程能独立执行,能充分利用和发挥处理器与外部设备并行工作能力。

2、进程和线程

(1) 调度

        在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进程。而在引入线程的操作系统中,则把线程作为调度和分派的基本单位,把进程作为资源拥有的基本单位,从而使传统进程的两个基本属性分开。分开之后,在同一个进程中,线程的切换不会引起进程的切换,只有从一个进程中的线程切换到另一个进程中的线程时,才会引起进程切换。

(2) 并发性

        在引入线程的操作系统中,不仅进程之间可以并发执行,多个线程之间也可以并发执行,从而能够更有效地利用系统资源,提高系统的吞吐量。

(3) 拥有资源

        进程是拥有资源的一个独立单位,而线程除了拥有少量必不可少的资源外,多个线程可以共享所属进程的系统资源。

(4) 系统开销

        由于在创建或撤销进程时,系统都要为进程分配或回收资源。因此,从整体上看,操作系统所付出的开销将显著地大于创建或撤销线程时的开销。同样,在进行进程切换时,需要对当前进程处理器环境进行保存以及对新调度进程的处理器环境进行设置,这些工作都要消耗或占用系统的资源。而线程切换只需要保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。

3、线程的实现机制

(1) 用户级线程

        第一种实现方式是用户级线程,这种线程不依赖于内核。

        用户级线程只存在于用户态中,对它的创建、撤销和切换不会通过系统调用来实现,因而这种线程与内核无关。对应地,内核也不知道有用户级线程的存在,从内核角度考虑,就是按正常的方式管理,即单线程进程。这种方法的优点是,用户级线程包可以在不支持线程的操作系统上实现。

        在用户空间管理线程时,每个进程需要有其专用的线程表,该线程表由运行时系统管理。当一个线程转换到就绪或阻塞状态时,运行时系统就把该线程的信息保存在线程表中,它可以调用线程调度程序来选择另一个要运行的线程,保存该线程状态的过程和调度程序都只是本地过程,所以启动它们比进行内核调用效率更高。还有就是,不需要陷入,不需要上下文切换,也不需要对内存高速缓存进行刷新,这就使得线程调度非常快捷。

(2) 内核级线程

        第二种实现方式是内核级线程,这种线程依赖于内核。

        内核级线程依赖于内核,即无论是在用户进程中的线程,还是系统进程中的线程,它们的创建、撤销和切换都是由内核实现的,在内核中保留了一个线程控制块,系统根据该控制块而感知该线程的存在并对线程进行控制。

       在内核中有用来记录系统中所有线程的线程表,内核的线程表保存了每个线程的寄存器、状态和其他信息,这些信息和在用户空间中的线程信息是一样的。当某个线程希望创建一个新线程或撤销一个已有线程时,它就进行一个系统调用,这个系统调用通过对线程表的更新就完成线程创建或撤销工作。另外,内核还维护了传统的进程表,以便跟踪进程的状态。

(3) 用户级线程与内核级线程的区别

① 线程的调度与切换速度

        核心级线程在线程调度和切换与进程的调度和切换十分相似,比如在线程调度时的调度方式上,同样也是采用抢占式和非抢占式两种;在线程的调度算法上,也同样采用时间片轮转法、优先权算法等。

        用户级线程的切换通常是发生在一个应用进程的诸线程之间,不仅无须通过中断进入操作系统的内核,而且切换的规则也远比进程调度和切换的规则简单。

② 系统调用

        用户级线程调用一个系统调用时,由于内核并不知道有该用户级线程的存在,因而把系统调用看作是整个进程的行为,于是该进程等待,而调度另一个进程执行。

        内核级线程调用是以线程为单位,当一个线程调用一个系统调用时,内核把系统调用只看作是该线程的行为,因而封锁该线程,于是可以再调度该进程中的其他线程执行。

③ 线程执行时间

        对于只设置了用户级线程的系统,调度是以进程为单位进行的,如果一个进程A只有一个线程运行,而另一个进程B有100个线程运行,那么进程A的执行速度将会是进程B的100倍。

        对于设置了核心级线程,其调度是以线程为单位进行的,线程获取处理器的时间与诸进程中线程的总数量有关。

(4) 混合实现方式

        在这种方式中,内核只识别内核级线程,并对其进行调度,其中一些内核级线程会被多个用户级线程多路复用,如同在没有多线程能力操作系统中某个进程中的用户级线程一样,可以创建、撤销和调度这些用户级线程。在这种模型中,每个内核级线程都有一个可以轮流使用的用户级线程集合。

四、进程调度

1、概述

(1) 进程调度的主要功能

① 记录系统中所有进程的执行状况;

② 根据一定的调度算法,从就绪队列中选出一个进程,准备把处理器分配给它;

③ 把处理器分配给进程。即把选中进程的进程控制块内有关的现场信息,如程序状态字、通用寄存器等内容送入处理器相应的寄存器中,从而让它占用处理器运行。

(2) 进程调度的时机

① 正在执行的进程运行完毕;

② 正在执行的进程由于某种错误而终止;

③ 时间片用完,即有一个进程从运行状态变成就绪状态;

④ 正在执行的进程调用阻塞原语将自己阻塞起来,即一个进程从运行状态变成阻塞状态;

⑤ 创建了新的进程,即有一个新的进程进入就绪队列;

⑥ 正在执行的进程调用了唤醒原语操作激活了等待资源的进程,即一个等待状态的进程变为就绪状态。

        处理器的调度方式有两种:抢占式和非抢占式(或称不可抢占式)。所谓可抢占方式,即就绪队列中一旦有优先级高于当前运行进程优先级的进程存在时,便立即进行调度,转让处理器。而不可抢占方式,即一旦把处理器分配给一个进程,它就一直占用处理器,直到该进程自己因调用原语操作或等待I/O而进入阻塞状态,或时间片用完时才让出处理器,重新执行进程调度。

2、调度算法设计原则

(1) 进程行为

        几乎所有的进程I/O请求或计算都是交替突发的,有些进程花费了很多时间在计算上,而有些进程则在等待I/O上花费了很多时间,前者称为计算密集型,后者称为I/O密集型。

        随着CPU变得越来越快,更多的进程倾向于I/O密集型,它的基本思想是,如果需要运行I/O密集型进程,那么就应该让它尽快得到机会,以便发出磁盘请求并保持磁盘始终忙碌。如果进程是I/O密集型的,则需要多运行一些这类进程以保持处理器的充分利用。

(2) 系统分类

        通常可以分为三类环境:批处理、交互式和实时系统。

(3) 调度算法的设计目标

        设计调度算法的目标取决于环境,但有一些目标是适用于所有系统的。比如其中有一个共同目标是保持系统的所有部分尽可能地忙碌。

        一个系统的工作状态,通常要检查三个指标:吞吐量、周转时间以及处理器利用率。吞吐量是系统每小时完成的进程数;周转时间是指从一个批处理进程提交时刻开始直到该进程完成时刻为止的统计平均时间;处理器利用率常常用于对批处理系统的度量。这三个指标中,真正有价值的是吞吐量和周转时间。

3、进程调度算法

        进程调度算法解决以何种次序对各就绪进程进行处理器的分配以及按何种时间比例让进程占用处理器。

(1) 先来先服务算法

        它是非抢占式的先来先服务算法,使用该算法,进程按照它们请求处理器的顺序来使用处理器。

        这种算法很公平,但一旦出现计算密集型的长进程则会对其他进程造成较长时间的等待。

(2) 最短进程优先算法

        当输入队列中有若干个同等重要的进程被启动时,调度进程应使用最短进程优先算法。请注意,只有在所有进程都同时可运行的情形下,最短进程优先算法才是最优化的。

        由于这种算法偏好短进程,如果短进程源源不断地的进入后备池,长进程将会长时间滞留在后备池中,其运行将得不到保证。

(3) 最短剩余时间优先算法

        使用这个算法时,调度程序总是选择其剩余运行时间最短的那个进程运行,当一相新的进程到达时,其整个时间同当前进程的剩余时间做比较。如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程。

(4) 最高响应比优先算法

        最高响应比优先算法的性能是介于先来先服务和最短进程优先算法之间的折中算法,它在每次调度时选择响应比最高的进程投入运行。

        响应比 = (等待时间 + 预计运行时间)/预计运行时间 = 周转时间 / 预计运行时间

        最高响应比算法在一定程序上改善了调度的公平性和调度的效率,响应比在每次调度前进行计算,进程运行期间不计算。计算需要消耗系统的资源,存在一定的系统开销。

(5) 轮转算法

        轮转算法的基本思想是,将处理器的处理时间划分为一个个时间片,就绪队列中的诸进程轮流运行一个时间片。当时间片结束时,就强迫运行进程让出处理器,该进程进入就绪队列,等待下一次调度。同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。如此轮流调度,使得就绪队列中的所有进程在一个有限的时间T内都可以依次轮流获得一个时间片的处理器时间,从而满足了系统对用户分时响应的要求。

        影响时间片值设置的几个因素是:系统响应时间、就绪进程的数目、计算机的处理能力。如果时间片设置太短会导致过多的进程切换,降低了处理器效率;而设置的太长又可能引起对短的交互请求的响应时间变长。一般将时间片设置为20~50ms会比较合适。

(6) 最高优先级算法

        最高优先级算法每次将处理器分配给具有最高优先级的就绪进程,进程的优先级由进程的优先数决定。进程的优先数设置可以是静态的,也可以是动态的。

(7) 多级反馈队列算法

        在实际的计算机系统中,进程的调度模式往往是几种调度算法的结合。多级队列反馈法就是综合了先进先出调度算法、时间片轮转算法和可抢占式最高优先级算法的一种进程调度算法。它的主要特点如下:

① 被调度队列的设置

        系统按优先级设置若干个就绪队列,不同优先级别的队列有不同的时间片。

② 在同一个队列之间的调度原则

        除了第n级队列是按轮转算法来调度之外,其他各级队列均按先进先出调度算法进行调度。

③ 在不同队列之间的调度原则

        系统总是先调度级别较高的队列,仅当级别较高的队列为空时才去调度次一级队列中的进程。

④ 进程优先级的调整原则

        当正在执行的进程用完时间片之后,便被换出并进入次一级的就绪队列。当等待进程被唤醒时,它进入与其优先级相同的就绪队列;若该进程优先级高于正在执行的进程,便抢占处理器。

五、系统内核

        为了提高系统的运行效率、保护系统的关键部分不被破坏,一般把操作系统中提供支持系统运行的基本操作和基础功能的一组程序模块集中安排,形成一个操作系统的核心,称为系统核心或系统内核,简称内核。

        在不同的操作系统中,对系统内核功能的设计和安排是有巨大差别的。一般来说,系统内核提供的功能有:中断处理程序、进程同步与互斥、进程调度、控制与通信、存储管理的基本操作以及时钟管理等。对内核的各种功能调用通过执行原语操作来实现。

猜你喜欢

转载自blog.csdn.net/Alexshi5/article/details/88086010