【操作系统】进程管理
进程与线程
进程映像(进程实体)由程序段、相关数据和PCB (进程控制块) 三部分构成。所谓创建进程,实质上是创建进程映像中的PCB;⽽撤销进程,实质上是撤销进程的 PCB。值得注意的是进程映像是静态的,进程则是动态的。
PCB 是进程存在的唯⼀标志。
进程的基本特征:
1. 动态性。进程是程序的⼀次执⾏,它有着创建、活动,暂停、终⽌等过程,具有⼀定的⽣命周期。是动态地产⽣、变化、和消亡的。动态性是进程最基本
的特征。
2. 并发性。是指多个进程实体同时存在于内存中,能在同⼀段时间内运⾏。
3. 独⽴性。指进程实体是⼀个能独⽴运⾏、独⽴获得资源和独⽴接受调度的基本单位。
4. 异步性。由于进程的相互制约,使得进程具有执⾏的间断性,即进程按各⾃独⽴的、不可预知的速度向前推进。异步性会导致结果的不不可再现性,为此
在操作系统中必须配置相应的进程同步机制。
5. 结构性,每个进程都配置⼀个 PCB 对其进⾏描述。从结构上看,进程是由程序段、数据段和进程控制段三部分组成的。
进程的状态与转换
⼀个进程从运⾏态变成阻塞态是主动的⾏为,⽽从阻塞态变成就绪态是被动的⾏为,需要其他相关进程的协助。
允许⼀个进程创建另⼀个进程。此时创建者称为⽗进程,被创建的进程称为⼦进程。⼦进程可以继承⽗进程所拥有的资源。当⼦进程被撤销时,应将其从⽗进程哪⾥获得的资源归还给⽗进程。此外,在撤销⽗进程时,必须同时撤销其所有的⼦进程。
引起进程终⽌的事件主要有:正常结束,表⽰进程的任务已经完成并准备退出运⾏。异常结束,表⽰进程在运⾏时,发⽣了某种异常事件,使程序⽆法继续运⾏,如存储区越界、保护错、⾮法指令、特权指令错、I/O 故障等。外界⼲预是指进程应外界的请求⽽终⽌运⾏,如操作员或操作系统⼲预、⽗进程请
求和⽗进程终⽌。
正在执⾏的进程,由于期待的某些事件未发⽣,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或⽆新⼯作可做等,由系统⾃动执⾏阻塞原语(Block),使⾃⼰由运⾏态变为阻塞态。可见,进程的阻塞时进程⾃⾝的⼀种主动⾏为,也因此只有处于运⾏态的进程(获得 CPU )。才可能将其转为阻塞态。当被阻塞进程所期待的事件出现时,如它所启动的 I/O 操作已完成或其所期待的数据已到达,由有关进程(如提供数据的进程)调⽤唤醒原语(Wakeup),将等待该事件的进程唤醒。 Block 原语和 Wakeup 原语是⼀对作⽤刚好相反的原语,必须成对使⽤。
对于通常的进程⽽⾔,其创建、撤销及要求由系统设备完成的I/O 操作,都是利⽤系统调⽤⽽进⼊内核,再由内核中的相应处理程序予以完成的。进程切换同样是在内核的⽀持下实现的,因此可以说,任何进程都是在操作系统的⽀持下运⾏的,是与内核紧密相关的。进程切换是指处理及从⼀个进程的运⾏转到另⼀个进程上运⾏。
调度是指决定资源分配给哪个进程的⾏为,是⼀种决策⾏为;切换是指实际分配的⾏为,是执⾏⾏为,⼀般来说,现有资源的调度,然后才有进程的切换。
进程通信是指进程之间的信息交换。 PV 操作是低级通信⽅式,⾼级通信⽅式是指以较⾼的效率传输⼤量数据的通信⽅式。⾼级通信⽅法主要有以下三类:
1. 共享存储。在通信的进程之间存在⼀块可直接访问的共享空间,通过对这⽚共享空间进⾏写 / 读操作实现进程之间的信息交换。在对共享空间进⾏写 / 读操作时,
需要使⽤同步互斥⼯具(如 P 操作、 V 操作),对共享空间进⾏写 / 读控制。共享存储⼜分为两种:低级⽅式的共享是基于数据结构的共享。⾼级⽅式的共享则是基于存储区的共享。操作系统只负责位进程通信提供可共享使⽤的存储空间和同步互斥⼯具,⽽数据交换则由⽤户⾃⼰安排写 / 读指令完成。
2. 消息传递。在消息传递系统中,进程间的数据交换是以格式化的消息为单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利⽤操作系统提供的消息传
递⽅法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进⾏数据交换。(1)直接通信⽅式。发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接受进程从消息缓冲队列中取得消息。(2)间接通信⽅式。发送进程把消息发送到某个中间实体,接受进程从中间实体取得消息。这种中间实体⼀般称为信箱,这种通信⽅式⼜称信箱通信⽅式。
3. 管道通信。管道通信是消息传递的⼀种特殊⽅式。所谓“管道”,是指⽤连接⼀个读进程和⼀个写进程以实现它们之间的通信的⼀个共享⽂件,⼜名pipe ⽂件。向管道
(共享⽂件)提供输⼊的发送进程(即写进程),以字符流形式将⼤量的数据送⼊(写)管道;⽽接收
管道输出的接收进程(即读进程)则从管道中接收(读)数据。为了协调双⽅的通信,管道机制必须提供以下三⽅⾯的协调能⼒:互斥、同步和确定对⽅的存在。管道是⼀个固定⼤⼩的缓冲区。从管道读数据是⼀次性操作,数据⼀旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。管道只能采⽤半双⼯通信,即某⼀时刻只能单向传输。要实现⽗⼦进程双⽅互动通信,需定义两个管道
线程是进程中的⼀个实体,是被系统独⽴调度和分派的基本单位,线程⾃⼰不拥有系统资源,只拥有⼀点⼉在运⾏中必不可少的资源,但它可与同属⼀个进程的其它线程共享进程所拥有的全部资源。
⼀个线程可以创建和撤销另⼀个线程,同⼀进程的多个线程之间可以并发执⾏。由于线程之间的相互制约,致使线程在运⾏中呈现出间断性。
线程也有就绪、阻塞和运⾏三种基本状态。
若线程的切换发⽣在同⼀个进程内部,则只需要很少的时空开销。
线程与进程的⽐较:
1. 调度。在传统的操作系统中,拥有资源和独⽴调度的基本单位都是进程。在引⼊线程的操作系统中,线程是独⽴调度的基本单位,进程是拥有资源的基本单位。在同
⼀进程中,线程的切换不会引起进程切换。在不同进程中进⾏线程切换会引起进程切换。
2. 拥有资源。进程是拥有资源的基本单位,⽽进程不拥有系统资源,但线程可以访问其⾪属进程的系统资源。
3. 并发性。进程之间可以并发执⾏,多个线程之间也可以并发执⾏,提⾼了系统的吞吐量。
4. 系统开销。创建或撤销进程时操作系统所付出的开销远⼤于创建或撤销线程时的开销。进线程切换同样。
5. 地址空间和其他资源(如打开的⽂件)。进程间的地址空间之间相互独⽴,同⼀进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
6. 通信⽅⾯。进程间通信(IPC)需要进程同步和互斥⼿段的辅助,以保证数据的⼀致性,⽽线程间可以直接读 / 写进程数据段(如全局变量)来进⾏通信。
线程的实现可以分为两类:⽤户级线程和内核级线程。内核级线程⼜称为内核⽀持的线程。
在⽤户级线程中,有关线程管理的所有⼯作都应有⽤户程序完成,内核意识不到线程的存在。应⽤程序可以通过使⽤线程库设计成多线程程序。通常,应⽤程序从单线程开始,在该线程中开始运⾏,在其运⾏的任何时刻,可以通过调⽤线程库中的派⽣例程创建⼀个在相同进程中运⾏的新线程。
在内核级线程中,线程管理的所有⼯作由内核完成,应⽤程序没有进⾏线程管理的代码,只有⼀个到内核级线程的编程接⼝。内核为进程及其内部的每个线程维护上下⽂信息,调度也在内核基于线程架构的基础上完成。
C 语⾔编写的程序在使⽤内存时⼀般分为三个段,它们⼀般是正⽂段(即代码和赋值数据段)、数据堆段和数据栈段。⼆进制代码和常量存放在正⽂段,动态分配的存储区在数据堆段,临时使⽤的变量在数据栈段。
系统进程所请求的⼀次 I/O 操作完成后,将使进程状态从阻塞态变为就绪态。
同⼀个系统的进程(或线程)可以由系统调⽤的⽅法被不同的进程(或线程)多次使⽤。
处理机调度
处理机调度时多道操作系统的基础,是操作系统设计的核⼼问题。
⼀个作业从提交开始直到完成,往往要经历以下三级调度:
1. ⾼级调度。⼜称作业调度,其主要任务是按⼀定的原则从外存上处于后备状态的作业中挑选⼀个(或多个)。给它(们)分配内存、输⼊/输出设备等必
要的资源,并建⽴相应的进程,以使它(们)获得竞争处理机的权利。简⾔之,作业调度就是内存与辅存之间的调度。对于每个作业只调⼊⼀次、调出⼀次。
2. 中级调度。⼜称内存调度⼜称内存调度,其作⽤是提⾼内存利⽤率和系统吞吐量·。为此,应将那些暂时不能运⾏的进程调⾄外存等待,把此时的进程状
态称为挂起态。当它们已具备运⾏条件且内存⼜稍有空闲时,由中级调度来决定把外存那些已具备运⾏条件的就绪进程再重新调⼊内存,并修改其状态为就绪态,挂在就绪队列上等待。
3. 低级调度。⼜称进程调度,其主要任务是按照某种⽅法和策略从就绪队列中选取⼀个进程,将处理机分配给它。进程调度是操作系统中最基本的⼀种调
度,再⼀般的操作系统中都必须配置进程调度,进程调度的频率和⾼,⼀般⼏⼗毫秒⼀次。
作业调度为进程活动做准备,进程调度使进程正常活动起来,内存调度将暂时不能运⾏的进程挂起,内存调度处于作业调度和进程调度之间。
作业调度次数少,内存调度次数略多,进程调度频率最⾼。
进程调度是最基本的,不可或缺。
现代操作系统中,不能进⾏进程的调度与切换的情况由以下⼏种:
1. 在处理机中断的过程中。
2. 进程在操作系统内核程序临界区中。
3. 其他需要完全屏蔽中断的原⼦操作过程中。
周转时间 = 作业完成时间 - 作业提交时间(就是到达时间)
平均周转时间 = (作业1的周转时间 + ... + 作业n的周转时间)/ n
带权周转时间 = (作业周转时间 / 作业实际运⾏时间)>= 1
平均带权周转时间 = (作业1的带权周转时间 + ... + 作业n的带权周转时间)/ n
典型的调度算法:
1. 先来先服务(FCFS)调度算法。既可⽤于作业调度,⼜可⽤于进程调度。FCFS 属于不可剥夺算法。对长作业⽐较有利,但对短作业不利(相对于SJF
和⾼响应⽐);有利于 CPU 繁忙型作业(需要⼤量的 CPU 时间进⾏计算,⽽很少请求 I/O 操作),⽽不利于 I/O 繁忙型作业(CPU 处理时,需频繁地请求 I/O 操作)。
2. 短作业优先(SJF)调度算法。短进程优先(SPF)调度算法。作业/进程调度。对长作业不利,有可能导致长作业饥饿现象。
3. 优先级调度算法。作业/进程调度。根据新的更⾼级进程能否抢占正在执⾏的进程,可将该调度分为如下两种:(1)⾮剥夺式优先级调度算法。当⼀个进
程正在处理机上运⾏时,即使由某个更为重要或紧迫的进程进⼊就绪队列,仍然让正在运⾏的进程继续运⾏,直到由于其⾃⾝原因⽽主动让出处理机时(任务完成或等待事件),才把处理机分配给更重要或紧迫的进程。(2)剥夺式优先级调度算法。当⼀个进程正在处理机上运⾏时,若有某个更为重要或紧迫的进程进⼊就绪队列,则⽴即暂停正在运⾏的进程,将处理机分配给更重要或紧迫的进程。根据进程创建后其优先级是否可以改变,可以将进程分为以下两种:(1)静态优先级。优先级是在创建进程时确定的,且在进程的整个运⾏期间保持不变。(2)动态优先级。在进程运⾏过程中,根据进程情况动态调整优先级。
4. ⾼响应⽐优先调度算法。在每次进⾏作业调度时,先计算后备作业队列中每个作业的相应⽐,从中选出相应⽐最⾼的作业投⼊运⾏。相应⽐ R P = (等待时间 + 要求
服务时间)/ 要求服务时间。克服了饥饿状态,兼顾了长作业。
5. 时间⽚轮转调度算法。主要适⽤于分时系统。时间⽚的⼤⼩对系统性能的影响很⼤,若时间⽚⾜够⼤,以⾄于所有进程都能在⼀个时间⽚内执⾏完毕,则时间⽚轮转
调度算法就退化为先来先服务调度算法。若时间⽚很⼩,则处理机将在进程间过于频繁地切换,使处理机开销增⼤,⽽真正⽤于运⾏⽤户进程的时间将减少。因此,时间⽚的⼤⼩应选择适当。
6. 多级反馈队列调度算法(融合了前⼏种算法的优点)。(1)设置多个就绪队列,并将各个队列赋予不同的优先级,第1队列的优先级最⾼,第2级队列次之,其余队
列的优先级逐次降低。(2)赋予各个队列中进程的执⾏时间⽚的⼤⼩各不相同。在优先级⾼的队列中,每个进程的运⾏时间⽚越⼩。(3)⼀个新进程进⼊内存后,⾸先将它放⼊第⼀级队列的末尾,按 FCFS 原则排队等待调度。当轮到该进程执⾏时,如它能在该时间⽚内完成,便可准备撤离系统;若它在⼀个时间⽚结束时尚未完成,调度程序便将该进程转⼊第2级队列的末尾,再同样按FCFS 原则等待调度执⾏…… (4)当且仅当第1级队列为空时,调度程序才调度第2级队列中的进程运⾏;仅当第1~( i-1 )级队列均为空时,才会调度第i级队列中的进程运⾏。若处理机正在执⾏第i级队列中的某进程,这时⼜有新进程进⼊优先级更⾼的队列【第1~(i-1 )中的任何⼀个队列】,则此时新进程将抢占正在运⾏进程的处理机,即由调度程序把正在运⾏的进程放回第i级队列的末尾(优先级不变),把处理机分配给
新到的更⾼优先级的进程。
时间⽚调度算法是绝对可抢占的。分时系统的时间⽚固定,因此⽤户数越多,响应时间越长。
中断向量本⾝是⽤于存放中断服务例⾏程序的⼊⼝地址,因此中断向量地址就应是该⼊⼝地址的地址。
进程同步
将⼀次仅允许⼀个进程使⽤的资源称为临界资源(互斥、共享)。对临界资源的访问,必须互斥进⾏,在每个进程中,访问临界资源的那段代码称为临界区。
同步亦称直接制约关系,是指为完成某种任务⽽建⽴的两个或多个进程,这些进程因为需要在某些位置上协调它们的⼯作次序⽽等待、传递信息所产⽣的制约关系。进程间的直接制约关系源于它们之间的相互合作。
进程间通信和线程间通信的区别互斥也称间接制约关系。当⼀个进程进⼊临界区使⽤临界资源时,另⼀个进程必须等待,当占⽤临界资源的进程退出临界区后,另⼀进程在允许去访问此临界资源。
为禁⽌两个进程同时进⼊临界区,同步机制应遵循以下准则:
1. 空闲让进。临界区空闲时,可以允许⼀个请求进⼊临界区的进程⽴即进⼊临界区。
2. 忙则等待。当已有进程进⼊临界区时,其他试图进⼊临界区的进程必须等待。
3. 有限等待。对请求访问的进程,应保证能在有限时间内进⼊临界区。
4. 让权等待。当进程不能进⼊临界区时,应⽴即释放处理器,防⽌进程忙等待。
系统中的各种硬件资源和软件资源,均可⽤数据结构抽象地描述其资源特性,即⽤少量信息和对资源所执⾏的操作来表⽰该资源,⽽忽略它们的内部结构和实现细节。管程是由⼀组数据及定义在这组数据之上的对这组数据的操作⽽组成的软件模块,这组操作能初始化并改变管程中的数据和同步进程。
管程的组成:
1. 局部于管程共享的数据结构说明。
2. 对该数据结构进⾏操作的⼀组过程。
3. 对局部于管程的共享数据设置初始值的语句。
管程的基本特性:
1. 局部于管程的数据只能被局部于管程内的过程所访问。
2. ⼀个进程只有通过调⽤管程内的进程才能进⼊管程访问共享数据。
3. 每次仅允许⼀个进程在管程内执⾏某个内部过程。
在操作系统中,P、V 操作时⼀种低级进程通信原语。
可以被多个进程在任意时刻共享的代码必须是不允许任何修改的代码(可重⼊代码)。若代码可被多个进程在任意时刻共享,则要求任⼀个进程在调⽤此段代码时都以同样的⽅式运⾏;⽽且进程在运⾏过程中被中断后再继续执⾏,其执⾏结果不受影响。这必然要求代码不能被任何进程修改,否则⽆法满⾜共享的要求。
管程的 signal 操作与信号量机制中的 V 操作不同,信号量机制中的 V 操作⼀定会改变信号量的值 S = S + 1 。⽽管程中的 signal 操作是针对某个条件变量的,若不存在因该条件⽽阻塞的进程,则 signal 不会产⽣任何影响。
硬件⽅法(关中断、硬件指令⽅法)实现进程同步时不能实现让权等待。
死锁
所谓死锁,是指多个进程因竞争资源⽽造成的⼀种僵局(互相等待),若⽆外⼒作⽤,这些进程都将⽆法向前推进。
死锁产⽣的原因:
1. 系统资源的竞争。
2. 进程推进顺序⾮法。
3. 死锁产⽣的必要条件。产⽣死锁必须同时满⾜以下4个,只要其中任意⼀个条件不成⽴,死锁就不会发⽣。(1)互斥:进程要求对所分配的资源进⾏排他
性控制,即在⼀段时间内某资源仅为⼀个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。(2)不剥夺条件:进程所获得的资源在未使⽤完之前,不能被其他进程强⾏夺⾛,即只能由获得资源的进程⾃⼰来释放(只能是主动释放)。(3)请求并保持条件:进程已经保持了⾄少⼀个资源,但⼜提出了新的资源请求,⽽该资源已被其他进程所占有,此时请求进程被阻塞,但对⾃⼰已获得的资源保持不放。(4)循环等待条件:存在⼀种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下⼀个进程所请求。
死锁的处理策略:
1. 死锁预防:设置某些限制条件,破坏产⽣死锁的4各必要条件中的⼀个或⼏个,以防⽌发⽣死锁。
2. 避免死锁:在资源的动态分配过程中,⽤某种⽅法防⽌系统进⼊不安全状态,从⽽避免死锁。
3. 死锁的检测及解除:⽆须采取任何限制性措施,允许进程在运⾏过程中发⽣死锁,通过系统的检测机构及时地检测出死锁的发⽣,然后采取某种措施解除
死锁。
死锁处理策略的⽐较
资源分配策略各种可能模式主要优点主要缺点
死锁预
防保守,宁可资源
闲置
⼀次请求所有资源(破坏请求并
保持条件),资源剥夺(破坏不
剥夺条件),资源按序分配(破
坏循环等待条件)
适⽤于突发式
处理的进程,
不必进⾏剥夺
效率低,进程初始
化时间延长;剥夺
次数过多;不便灵
活申请资源
死锁避
免是“预防”和“检
测”的折中(在
运⾏时判断是否
可能死锁)
寻可能的安全允许顺序(银⾏
家算法)
不必进⾏剥夺
必须知道将来的资
源需求;进程不能
长时间阻塞
死锁检
测宽松,只要允许
就分配资源
定期检查死锁是否已经发⽣(资
源分配图,死锁定理,死锁解除
(资源剥夺法,撤销进程法,进
程回退法))
不延长进程初
始化时间,允
许对死锁进⾏
现场处理
通过剥夺解除死
锁,造成损失
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论