1、第三章第三章 操作系统进程管理操作系统进程管理2contentn进程概述n进程的管理结构:进程控制块n进程调度算法n进程调度的实例n进程控制的实现n线程及其实现nLinux进程管理概述3(一)进程概述 1-1、背景和概念n背景:如何描述一个程序的一次运行过程?n进程n程序在一个数据集上的一次运行过程n操作系统进行资源分配和调度的一个可并发执行的独立单位。n从操作系统角度看:n由数据结构以及在其上执行的程序(代码序列)组成n是操作系统进行资源分配和保护的基本单位 41-2 进程的特性:n独立性:进程既是系统中资源分配和保护的基本单位,也是系统调度的独立单位。凡是未建立进程的程序,都不能作为独立单
2、位参与运行 n动态性:进程是程序在数据集合上的一次执行过程,是动态概念,同时,它还有生命周期,由创建而产生,由撤销而消亡。n并发性:进程可以并发地执行,进程的执行过程可以被中断。CPU对多个进程可以并发执行。5n1-3、进程和程序n进程是程序的一次动态执行活动,而程序是进程运行的静态描述文本。n一个进程可以执行一个或多个程序,但同一时刻只能执行一个程序。n同一程序也可被多个进程同时执行。n程序是一种软件资源,它可以长期保存,而进程是一次执行过程,它是暂时存在的,动态地产生和中止的。6n令人混淆的程序和进程n“把你的程序给我复制一份”?n“启动的程序太多了,系统好慢啊”?n“这个程序没响应了,死
3、了”?7n1-3、进程的组成进程映像:或进程执行现场,或进程上下文。具体组成:n代码段:或叫正文段,在多个进程间可以实现共享。n数据上下文:n用户层次:n外部变量和静态变量n工作区,即栈,包含局部变量,函数调用的现场。n操作系统层:执行现场和核心栈。n寄存器层次:控制寄存器和数据寄存器。8n管理结构:进程控制块,描述进程的运行状况,资源占用状况,以方便操作系统实现对进程的管理和控制。n进程控制表:用来管理进程及其相关信息。n存储控制表:用来管理一级(主)存储器和二级(虚拟)存储器,主要内容包括:主存储器的分配信息,二级存储器的分配信息,存储保护和分区共享信息,虚拟存储器管理信息。nI/O控制表
4、:用来管理计算机系统的I/O设备和通道,主要内容包括:I/O设备和通道是否可用,I/O设备和通道的分配信息,I/O操作的状态和进展,I/O操作传输数据所在的主存区。n文件控制表:用来管理文件,主要内容包括:被打开文件的信息,文件在主存储器和二级存储器中的位置信息,被打开文件的状态和其他属性信息。9n1-4、进程的状态n一个进程从创建而产生至撤销而消亡的整个生命周期,可以用一组状态加以刻划。n为了便于管理进程,一般来说,按进程在执行过程中的不同状况至少定义三种不同的进程状态:n运行态(running):占有处理器正在运行。对单处理器的系统而言,同一时刻最多只能有一个进程处于执行态,而对有n个CP
5、U的系统呢?10n就绪态(ready):具备除处理器外的其它所有运行条件(具备的外设资源,内存资源等),等待系统分配处理器以便运行。n可以有多个进程同时处于就绪态,系统通常将他们排成一个队列,成为就绪队列。n就绪队列仅是保存就绪进程的数据结构,队列上进程的次序并不一定代表获取CPU的先后次序,这要视调度算法而定。11n等待/阻塞态(blocked):又称睡眠态,或挂起态。不具备运行条件,正在等待非CPU的资源的完成,如n等待用户输入数据n等待外设空闲n等待其它进程的信号(如完成工作的信号)12n有些系统在上述三种的基础上又定义了两种状态:n新建态:并没有被提交执行,而是在等待操作系统完成创建进
6、程的必要操作 n终止态:进入终止态的进程以后不再执行,但依然临时保留在操作系统中等待善后。13n1-5、状态转换n处于一个状态的进程,在一定条件下会转变到另外一种状态。n状态转换条件:n运行态等待态:等待使用资源;如等待外设传输;等待人工干预。n等待态就绪态:资源得到满足;如外设传输结束;人工干预完成。n运行态就绪态:运行时间片到;出现有更高优先权进程。n就绪态运行态:CPU空闲时选择一个就绪进程。14运行态就绪态等待态选中时间片完出现等待事件等待对象出现?15运行态就绪态等待态选中时间片完出现等待事件等待事件结束新建态终止态16(二)进程控制块n2-1、进程控制块的基本概念n为了有效的管理进
7、程和资源,操作系统必须掌握每一个进程和使用资源的当前状态;n操作系统为每个进程设置一个数据结构,涵盖进程相关的所有管理信息。该结构称为进程控制块,Process Control Block,PCB;17n每个进程有且仅有一个进程控制块,是操作系统用于记录和刻划进程状态及有关信息的数据结构;n进程控制块是操作系统掌握进程的最重要数据结构,它包括了进程执行时的情况,以及进程让出处理器后所处的状态、断点等信息。n正文段属于进程控制块的一部分吗?n数据段属于进程控制块的一部分吗?18n2-2进程控制块的主要内容:n标示信息:常用的标识信息包括:n进程标识符n父进程的标识符n用户进程名n用户组名等。19
8、n现场信息:用于保留一个进程在运行时存放在寄存器中的各种信息,任何一个进程在让出处理器时必须把此时的处理器现场信息保存到进程控制块中,供进程重新恢复运行时恢复现场 。常用的现场信息包括n通用寄存器的内容n控制寄存器(如PSW寄存器)的内容n用户栈指针n系统栈指针等。20n控制信息。用于管理和调度一个进程。常用的控制信息包括:n1)进程的调度相关信息,如进程状态、等待事件和等待原因、进程优先级、队列指引元等;n2)进程组成信息,如正文段指针、数据段指针;n3)进程间通信相关信息,如消息队列指针、信号量等互斥和同步机制;n4)进程在二级存储器内的地址;n5)CPU资源的占用和使用信息;n6)进程特
9、权信息,如在内存访问和处理器状态方面的特权。n7)资源清单,包括进程所需全部资源、已经分得的资源,如主存资源、I/O设备、打开文件表等。21n2-3、PCB的实例n进程控制块的信息很多,占有的空间空大。有些系统把PCB分为两部分:n常驻内存部分:进程无论处于什么状态,系统都可能要查询的PCB成员。n可交换部分:进程不在执行时系统不需要访问的PCB成员。内存紧张时可以将他们换出磁盘上。22nUNIX中常驻内存的PCB部分称为proc结构。struct proc charp_stat;/*进程状态*/charp_flag;/*进程标志*/charp_pri;/*进程运行的优先数*/charp_ti
10、me;/*进程驻留时间*/charp_cpu;/*进程使用CPU的量*/charp_nice;/*进程优先数偏置值*/ushortp_uid;/*实际用户标识数*/ushortp_suid;/*有效用户标识数*/shortp_pgrp;/*所在进程组的首进程标识数*/shortp_pid;/*进程标识数*/shortp_ppid;/*父进程标识数*/shortp_addr;/*相应user结构的起始页面号*/shortp_size;/*可交换存储映像的大小*/shortp_swaddr;/*交换区的磁盘地址*/struct text *p_textp;/*指向共享正文段控制结构的指针*/;23
11、struct text shortx_daddr;/*正文段在盘交换区地址*/shortx_size;/*正文段块数*/struct proc*x_caddr;/*指向链接的proc结构*/struct inode*x_iptr;/*指向正文段所在文件的内存索引节点的指针*/charx_count;/*共享该正文段的进程数*/char x_ccount;/*共享该正文段且映像在内存 的进程数*/charx_flag;/*标志*/;24nUNIX中,非常驻内存的PCB对应User结构:struct user struct pcb u_pcb;/*进程切换时保存硬件环境区域*/ushortu_ui
12、d;/*有效用户标识数*/ushortu_gid;/*有效用户组标识数*/ushortu_ruid;/*实际用户标识数*/ushortu_rgid;/*实际用户组标识数*/struct proc*u_procp;/*指向相应proc结构的指针*/struct file*u_ofileNOFILE;/*用户打开文件表*/unsigned u_tsize;/*代码段长度*/unsigned u_dsize;/*数据段长度*/unsigned u_ssize;/*堆栈段长度*/intu_signalNSIG;/*软中断信号的处理函数地址表*/time_tu_utime;/*进程用户态运行时间累计值*
13、/time_tu_stime;/*进程核心态运行时间累计值*/;25n2-4、PCB的实例(Linux)n只对应一个结构,名为tast_struct,不再区分常驻内存部分和U区n所有结构内容全部长驻在内存中,一般不会交换到磁盘上。n可参见源代码目录include/linux/sched.h262-5、PCB的组织和管理n为便于对系统中的各进程进行管理和控制,必须把所有进程的PCB按一定方式组织起来。n顺序线性表组织:早期的UNIX系统将进程Proc结构组成顺序存放的线性表。n表项比较固定,可能限制进程数。n经常要扫描整个Proc表27n多队列的PCB组织:用链表方式组织PCB表,对同种状态的进
14、程,其PCB在一个链上,这个链称为一个队列。n执行队列:n就绪队列:n阻塞队列:28PCB0PCB0PCBPCBPCBPCB0PCBPCB0PCB执行队列执行队列 就绪队列就绪队列 阻塞队列阻塞队列散列表散列表 293、调度n3-1、调度概述n调度的层次:n高级调度:又称作业调度,它决定处于输入池中的哪个后备作业可以调入系统,成为一个或一组就绪进程。n 中级调度:又称对换调度,它决定处于交换区中的就绪进程中哪一个可以调入内存,以便直接参与对CPU的竞争。在内存资源紧张时,将内存中处于阻塞状态的进程调至交换区。n 低级调度:又称进程调度或处理机调度,它决定驻在内存中的哪一个就绪进程可以占用CPU
15、,使其获得实实在在的执行。30三种调度的工作情况图后备后备作业作业队列队列高高级级调调度度诸诸进进程程中中级级调调度度诸诸进进程程低低级级调调度度占用占用CPU的执行的执行进程进程终止终止进程进程输入池输入池 交换区交换区 内存内存 31n实际系统并不一定存在所有的三种调度程序。n 分时系统中,常常只包含中级调度和低级调度。n现代系统中的调度,一般指进程调度,作业调度在现代系统中基本不存在了。n中级调度围绕CPU的调度来执行,相当于进程调度的附属(?),很少单独运行。32n3-2、进程调度方式(或进程切换方式):n不可剥夺(或不可抢占)方式:一个进程在获得处理机后,除非运行结束或进入阻塞状态等
16、原因主动放弃CPU,否则一直运行下去。n可剥夺方式:在某些条件下系统可以强制剥夺正在运行的进程使用处理机的权利,将其分配给另一个合适的就绪进程。33n3-3、进程调度策略的概念n进程调度策略:指在什么情况下用什么方式,在就绪进程之间进行切换和分配CPU。n调度策略的设计思路:n需要综合考虑很多因素,难以选择一个最佳算法来适应所有的需要。n在统筹兼顾的基础上,尽可能针对应用场景采取最合适的调度策略。34n进程调度需要考虑的因素:n资源利用高效性:充分使用系统中各类资源,尽可能使多个设备并行工作。n调度低开销性:调度算法不能太复杂,不能带来大的开销。一般系统开销为?n公平性:在考虑不同类型进程具有
17、不同优先权的基础上,尽量公平地对待各个进程,使它们能均衡地使用处理机。n针对性:考虑不同的的设计目标n批处理系统,提高运行效率,取得最大的作业吞吐量和减少作业平均周转时间;n 交互式分时系统,能及时响应用户的请求;n 实时系统,能对紧急事件作出及时处理和安全可靠。35n常用调度算法:n先来先服务(FCFS)调度算法n时间片轮转法n优先级调度算法 n多级反馈队列调度算法n实时系统调度策略 36n3-4、先来先服务(FCFS)调度策略n思想:按照进程进入就绪队列的时间次序分配CPU。n特点:n具有不可抢占性的特点,一旦进程占用了CPU,一直运行到结束,或者因阻塞而自动放弃CPUn处在就绪队列头部的
18、进程首先获得CPU,一旦获得CPU的进程主动释放CPU,要么进入阻塞状态,要么挂在就绪队列的尾部。37n当一个大作业运行时会使后到的小作业等待很长时间,这就增加了作业平均等待时间。n对于I/O繁忙的进程,每进行一次I/O都要等待其他进程一个运行周期结束后才能再次获得处理机,故大大延长了该类作业运行的总时间,也不能有效利用各种外部设备资源。n不能为紧急进程优先分配CPU,很少单独使用。比如在同一个优先级面上,采用先来先服务。n公平?38n3-5、时间片轮转策略n思想:n各就绪进程轮流运行一小段时间,这一小段时间称为时间片。n在时间片内,如进程运行任务完成或因I/O等原因进入阻塞状态,该进程就提前
19、让出CPU。n当一个进程耗费完一个时间片而尚未执行完毕,调度程序就强迫它放弃处理机,使其重新排到就绪队列末尾。39n特点:n剥夺式调度算法:当时间片用完后,即使当前进程没有执行结束,也会被剥夺CPU。n时间片轮转法较适合于交互式分时系统。n系统的效率与时间片大小的设置有关。如时间片过大,系统与用户间的交互性就差,用户响应长;如时间片太小,进程间切换过于频繁,系统开销就增大。包括n进程切换相关开销(保存、恢复现场等)大n频繁执行调度算法开销大40n优化方案:n将时间片分成多个规格,10ms、20ms或50ms等n按时间片大小将就绪进程排成多个队列。排在小时间片的进程被调度的频率比较高。n将交互性
20、强的进程(?)排在小时间片队列,而将计算性较强的进程排在长时间片队列。这样可以提高系统的响应速度和减少周转时间。n将需要连续占用处理机的进程安排在时间片长的队列中,这样可减少进程切换的开销。41n根据运行状况,进程可以从时间片小的队列中转入时间片较长的队列,如何实现?n进程首先处在短时间片的队列上,当一个短时间片用完后,进程没有结束或进入阻塞状态,转到下较长时间片的队列上。n逐个队列调度,还是交叉调度?42n3-6、优先级调度算法n思想:n为反映出各进程的重要和紧迫程度,系统赋予每个进程有一个优先数,用于表示该进程的优先级。n调度程序总是从就绪队列中挑选一个优先级最高的进程,使之占有处理机n具
21、体实现方式:n静态优先级调度:优先级在进程创建时,已经确定。n动态优先级调度:优先级在进程运行中,可以动态调整。43n静态优先级法:在进程创建时就赋予一个优先数,在进程运行期间该优先数保持不变。分配优先级需要考虑的因素:n系统进程应当赋予比用户进程高的优先级。n短作业的进程可以赋予较高的优先级。n I/O繁忙的进程应当优先获得CPU。n根据用户作业的申请,设置进程的优先级。静态优先权法较适合于实时系统,其优先级可根据事件的紧迫程度事先设定。44n动态优先级法:反映进程在运行过程中不同阶段的优先级变化情况。设置优先级需要考虑的因素:n对于一个总体CPU忙的进程,在其I/O阶段就应提高其优先级,而
22、在其大规模运算阶段,可以降低该进程的优先级。n对于运行到某一阶段的进程,需要和用户交互才能正确运行下去,也应当在该阶段提高优先级,以减少用户等待的时间。n进程占用CPU时间越长,就可降低其优先级;反之一个进程在就绪队列中等待的时间越长,就可升高其优先级。n可根据进程在运行阶段占用的系统资源,如内存、外部设备的数量和变化来改变优先级。45n3-7、多级反馈队列调度算法n系统设置多个优先级队列。调度程序总是从第一个就绪队列(优先级最高的队列),仅当该队列为空时才调度下一个队列中的进程,依次类推。n系统中为各个队列中的进程分配的时间片大小不同,优先级最高的时间片最短,从优先级最高到优先级最低的队列其
23、时间片依次增加。n一个新进程进入系统中,被置于优先级最高的第一个就绪队列尾部。46n当某优先级队列中的程序被选中运行:n若时间片内任务完成,离开系统;n若没有完时间片,因资源等待转变为阻塞状态。待等待完成转为就绪态时,仍回原来的优先级队列;n若时间片用完还未完成任务,则降低优先级,进入下一优先级就绪队列尾部。n当一个进程运行时,更高优先级队列中来了新进程,则高优先级进程抢占当前运行进程的处理机。被抢占进程仍在原就绪队列。47最高优先级队列最高优先级队列次高优先级队列次高优先级队列最低优先级队列最低优先级队列CPU进入系统进入系统优先级降低优先级降低运行完成运行完成撤离系统撤离系统48n3-8
24、实时系统调度策略n实时调度的背景:n一些紧急事件必须要在特定的时间内处理完毕。n主要用于控制类的计算机系统。n实时调度的基本要素:n一般而言,在实时调度中,CPU的处理能力要远大于所处理事件所需要的处理能力。n事件的分布特点非常重要,对于不均匀的事件分布,调度的难度比较大,实时性并不一定得到满足。n实时调度的目标:尽可能满足每个事件的实时性要求,或者说提高满足实时性的概率。n调度算法分类:n静态算法:预先确定事件的处理顺序,一般用于发生比较规律的事件处理n动态算法:在系统运行期间动态确定。49n速率单调算法:n按发生频率分配进程的优先级(如何知道?)。如20ms运行一次的进程比100ms运行一
25、次的进程分配更高的优先级。n按优先级从高到低的顺序分配处理机。n若运行过程中,发现优先级更高的就绪进程,则剥夺当前运行进程对CPU的占有,重新分配处理机。50n最早截止时间优先算法:n检测到一个事件,对应的处理进程加入到就绪进程队列中。n就绪进程按事件处理的截止时间从早到晚排序。n选择最早截止时间的进程获得CPU。51n最小松弛时间优先算法n松弛时间:当前到截止时间的时间长度,减去处理事件所需要的时间。n选择松弛时间最小的进程占用CPUn思考题:n如果以某进程就绪队列,按最小松弛时间优先算法能够调度成功(即全部能够满足实时性要求),采用最早截止时间优先算法,是否一定能够调度成功?试证明之!52
26、n思考题的基本思路:n反证:假如利用最早截止时间算法不能调度成功,利用最小松弛时间优先算法也不能调度成功。53n3-9、进程调度的时机和步骤n当前进程自愿放弃处理器,立即进行调度。n进程完成了预定任务n进程因等待某种资源进入了睡眠状态n进程因同步或互斥的需要,暂停执行n强制切换。n切换时机:在中断处理和陷入处理结束后进行调度。n切换方法:n两步骤方案:现在合适的地方设置调度标志,然后在从核心态回到用户态时实现调度和进程切换。如Unix方法。n每次从核心态回用户态时都执行调度算法。如Linux方法。544、进程调度实例4-1、UNIX进程的切换调度算法n切换调度策略:n采用动态优先权算法:在一个
27、适当的时机,选择一个优先权最高,也即优先数(p_pri)最小的就绪进程,使其占用处理机。n优先数(p_pri)计算:两部分相加n固定部分:n1)p_nice:由用户设置,0至3n2)PUSER+PZERO:由操作系统根据进程属性设定。n可变部分p_cpu:n1)若进程占用处理机,每次时钟中断,p_cpu加1;n2)每1秒钟使所有就绪状态进程的p_cpu衰减一半。55n PSWP(0)对换进程n PINOD(10)等待磁盘I/O、管道;申请空闲磁盘块,空闲I节点n PRIBIO(20)等待缓冲区n NI_PRILEV(25)有关网络机制的睡眠 n NZERO(25)可中断和不可中断的分界常数n
28、PMSG(27)因等待消息而睡眠nTTIPRI(28)等待TTY输入nTTOPRI(29)等待TTY输出nPWAIT(30)等待子进程终止nPSLEP(39)因系统调用pause,sleep而入睡 nPUSER(60)核心态与用户态的分界常数n若干用户态进程优先级由公式计算而得到nPIDLE(127)机器空转的最低优先级56n4-2、Linux的进程调度n调度策略:n实时调度:针对实时进程,优先调度。n基于优先级的时间片轮转:针对非实时进程。n具体实现要点:n选择进程时,考虑CPU切换的代价。n实时进程换算成很大的优先数(级),只要比较优先数就能找到应该调度的进程。n具体实现过程参加:kern
29、el/sched.c575、进程控制n5-1、进程创建n创建进程的目的:n任务与与进程的逻辑对应关系清晰,不同的任务(或子任务)分别由不同的进程实现。n用不同进程完成不同任务(或子任务)能有效地实现任务的隔离。如实现多用户系统。n有利于任务间的并发执行。58n常见的进程创建场合:n(1)用户登录时,核心需要创建一个进程,为用户建立交互命令的环境,接收、分析并执行用户输入的命令。n(2)执行批处理命令时,核心要产生一个进程分析并处理批命令,对于批处理文件中的每一条命令,也要创造一个子进程来执行该命令。n(3)用户进程为了并发执行的需要,可在运行时创建一系列的进程,并互相合作,完成总任务。59n进
30、程创建方式和接口:n初始化进程:由系统在启动时,内核自己创建。n父进程创建子进程。系统中的所有用户进程都是初始化进程直接或间接的创建。n经过一段时间的创建后,系统中存在一个以初始化进程为根的进程树。n父进程通过调用操作系统提供的服务接口:系统调用接口,fork()60n进程创建的实现过程:n(1)为新进程分配唯一的进程标识数,为新进程分配进程控制块的空间。n(2)数据区分配:为新进程分配进程各部分映像所需的内存空间。复制了父进程的数据区、核心栈和用户栈。写复制:一种优化技术?n(3)正文段分配:代码相关存储区域的分配?61n(4)进程控制块的域设置:n如进程标识数、父进程标识数n各种地址指针,
31、程序计数器、系统栈指针、等。n进程的状态,进程的运行状态一般初始化为就绪状态。n根据进程的性质或缺省值初始化进程的控制信息。n。n(5)子进程复制父进程控制块的相关内容子进程将共享父进程的全部打开文件、信号处理方式等。62.n创建后的父子进程状态:相同部分n正文段:即运行代码段n完全相同。n一般和父进程共享一段代码存储区n数据部分:n数据段:完全相同。先共享一份-后按需复制一份n栈区:几乎完全一样。63n进程控制块:n分配一个全新的进程控制块n很多数据域的值都是一样的,从父进程中复制的。n正在使用的资源:n打开的文件n待处理的信号等。64n创建后的父子进程状态:不同部分n栈区的最近一个活动记录
32、中n返回值的域不同n父进程的值:子进程标示n子进程的值:0n进程的状态n子进程:就绪态n父进程:运行态n进程控制块的个别域n进程相关标示:pid,ppid等65n进程创建实例:main()int pid;printf(“Before forkn”);pid=fork();if(pid 0)printf(“Parent process:PID=%dn”,getpid();printf“Produced childs PID=%dn”,pid);else if(pid=0)printf(“Child process.:PID=%d n”,getpid();else printf(“fail to
33、create new process!n”);printf(“Parent or child process:PID=%dn”,getpid();66n5-2、进程的代码切换/装载n背景:n创建的新进程与父进程执行同样的代码,只是执行路线(或上下文不同)。这限制了新建进程的能力。n若父进程包含父子进程需要的所有代码,存在一定的浪费,而且进程的逻辑结构不清晰。n如果父子进程可以执行不同的代码,就能很好解决这个问题。67n新代码装载接口:Execnexec的调用进程用一个可执行文件中的程序和数据取代当前正在运行的程序和数据,从而使主调进程的图像改换成新的图像n新执行的程序与原进程的执行程序完全不同
34、,但不新分配PCB,进程标识pid不变,与父进程的关系也没有改变。nexec主要工作:n加载新的代码。n重新设置栈和一般数据区。n重新设置PCB的绝大部分字段。几乎修改所有字段,除进程标识外。68nExec的几种形式:nret=Execl(“/bin/ls”,“ls”,“-l”,(char*)0),参数含义:n程序的路径名n程序名n参数列表n参数结尾:(char*)0nret=execlp(“ls”,“ls”,“-l”,(char*)0).基于环境变量path查找目标程序nret=execv(char*pathname,char*argv)69n具体实例:main()int pid;print
35、f(“Before forkn”);pid=fork();if(pid 0)printf(“Parent process:PID=%dn”,getpid();printf“Produced childs PID=%dn”,pid);else if(pid=0)printf(“Child process.:PID=%d n”,getpid();execl(“/bin/ls”,”ls”,”-l”,(char*)0);/*映象改换*/printf(“execl error.n”);/*映象改换失败*/else printf(“fail to create new process!n”);printf
36、(“Parent process finished”);70n5-3、进程阻塞(挂起)、睡眠和唤醒n进程阻塞的原因:n1.请求系统服务或请求分配资源时得不到满足。n2.同步等待I/O的完成。n3.进程间互相配合共同完成一个任务时,一个进程往往要同步等待另一进程完成某一阶段的工作。n4.一进程在等待某一进程发消息时,也进入了阻塞状态。71n进程阻塞的方式n主动阻塞:n进程自愿发起CPU,可用于进程间的同步和定时处理事务n系统调用接口:sleep(int seconds)n精度为秒.nusleep,nanosleepn被动阻塞:n进程执行一些资源请求类操作,如果资源请求不能得到满足,操作系统就会阻
37、塞相应的进程。72n进程进入阻塞状态的系统操作:n保护进程运行现场,设置该进程状态为等待态。n将该进程排到对应事件的等待队列中。n运行进程调度算法,选择一个合适的就绪进程。n恢复选中进程的现状,让其占用CPU73n进程唤醒:n唤醒的条件:等待时间到,或等待的资源得到满足。n实现过程:n当系统完成:资源释放、I/O、数据到达等操作,操作系统会检查是否有进程在等待所释放的资源等。n如果有,唤醒该进程,使该进程进入就绪队列。n若有多个进程等待同一个资源,唤醒所有的进程,使其全部进入就绪队列。n多个唤醒的进程会再次竞争资源,竞争不到的进程将会再次进入阻塞状态。74n5-4、进程等待:n父进程通过系统调
38、用wait等待它的一个子进程终止。pid=wait(&status)n通过返回值pid可获得终止进程的进程标识。status的高位部分为子进程传给父进程的返回值,status的低8位部分为核心设置的系统调用状态码:子进程正常结束,还是异常终止。n该系统调用为同步调用,待一个子进程(任意子进程)结束时返回n如父进程在调用wait时,所有的子进程已先期终止了,那么对子进程作善后处理后,立即返回。75n父进程通过系统调用wait等待它的特定子进程终止。pid=waitpid(pid,&status,option)n等待指定pid的进程结束,pid 为-1时,等待任意一个子进程结束。pid小于-1时,
39、等待一组子进程的结束。76n5-5、进程的撤消n方式:n主动式:exit(int status)。n被动式:其它进程kill本进程。n主要工作:n关闭所有的打开文件,释放共享正文段、本进程的数据段、用户栈和核心栈的存储空间,暂时保留proc结构和盘交换区的user结构副本,进程的状态改为SZOMB状态。n进程终止时如有父进程因等待子进程的终止而处于睡眠状态,就唤醒父进程,最后进行进程调度。n父进程对进入SZOMB的子进程作善后处理后,释放该子进程的一切资源,使其生命期最后被终止77nmain()nn int i,pid,status=1;n printf(“Before fork call.n
40、”);n while(i=fork()=-1);n if(i)/*父进程*/n printf(“It is the parent process.n”);n pid=wait(&status);n printf(“Child process%d,status=%d n”,pid,status);n else /*子进程*/n printf(“It is the child process.n”);n execl(“/bin/ls”,”ls”,”-l”,(char*)0);/*映象改换*/n printf(“execl error.n”);/*映象改换失败*/n exit(2);n n prin
41、tf(“Parent process finish.n”);n786-1、线程的引入动机:n应用背景:n传统的进程:进程在任一时刻只有一个执行控制流。n在一般的服务器应用中,接受服务请求和为单个请求提供服务是并发操作,为不同请求提供服务也是并发操作。6、线程79n传统的进程在实现服务器应用时存在下列问题:n如果接受服务请求和为单个请求提供服务分别以不同的进程实现:n进程间需要频繁进行信息交互,进程之间通信的代价大.n需要为每个进程分配必要的资源,资源消耗比较大。n进程切换的开销大,频繁的进程调度将耗费大量处理器时间 n 如果用一个进程实现服务器的所有功能n任务间的并发度不高,或者说不能完成两类
42、任务(接受请求和提供服务)间的并发处理80n解决思路:n在同一进程中,存在多个执行线索。n把进程视为资源分配的基本单位,把进程内部的每个执行线索看作是调度和执行的基本单位。n这种进程内部的执行线索,称为线程,又被称为轻量级进程。81n6-2、多线程进程:n单线程进程的两个特征:n资源拥有单位:进程的虚址空间用于驻留进程的映像,进程可以分配到主存和控制其它的系统资源。n调度单位:进程是可以并发执行的独立单元,是操作系统进行调度的一个实体n多线程进程:分离上述两个特征。n进程:资源分配的基本单位。n线程:调度和执行的基本单位。82n线程的基本特征:n独立的线程执行状态(运行、就绪等)。n独立的线程
43、上下文环境。n独立执行栈:保存线程的上下文。n存在独立的线程控制块来描述线程的各类管理信息。n存取所属进程内的主存和其它资源,在本进程的范围内与所有线程共享这些资源。n同一程序地址空间。n运行代码。n全局变量。n设备和文件资源。83线程和进程的区别线程和进程的区别 进程进程控控制块制块用户用户地地址空址空间间核心核心栈栈用户用户栈栈进程进程控控制块制块用户用户地地址空址空间间线程线程控制控制块块核心核心栈栈用户用户栈栈线程线程控制控制块块线程线程控制控制块块核心核心栈栈用户用户栈栈用户用户栈栈核心核心栈栈多线程进程模型多线程进程模型单线程进程模型单线程进程模型84n引入线程机制的好处:提高了操
44、作系统的性能和效率n创建线程的开销(包括时间开销和资源开销)要远小于创建进程。n同进程内的线程切换开销要远远小于进程之间的切换开销。n进程内部的线程间的数据通信效率要远效率进程间的数据通信效率。85n6-3、多进程的实现方案:n用户级多线程。n基本思想:n管理线程的工作由应用程序来完成,操作系统感觉不到进程内部的多执行线索。n管理线程的工作包括:n线程创建和撤销、线程间通信、调度和现场保存与恢复等。86n系统运行方式:n进程按操作系统的进程调度方式竞争CPU。n进程竞争到CPU后,再按自己的调度方式选择合适的线程运行。n进程占有CPU期间,进程可以按既定的调度方式选择新线程运行,被剥夺CPU的
45、线程的执行线程保存由该进程负责。n实现方式:n进程管理工作完全应用程序员代码实现。n为了便于使用,以函数库的形式提供,应用程序员可以通过对函数库的调用实现对线程的管理。87n主要优点:n同一进程内的线程切换和调度开销小。n进程内部的线程调度算法比较灵活,不同的应用程序可以采用不同的调度算法。n实现独立于操作系统内核,便于维护,也便于在操作系统之间实现移植。n主要缺点:n在多处理器环境下,同进程中多线程并行性差。88n内核级多线程。n基本思想:n所有的线程管理工作全部由操作系统核心完成。n操作系统核心为进程中的每个线程维护上下文。n操作系统基于线程实现处理器调度,任何进程都至少包含一个线程。n实
46、现和使用方式:n应用程序中不再包含线程管理代码。n应用程序员可以通过系统调用接口完成线程的创建和控制。n缺点:n即使同进程内的线程切换也需要进入核心态执行调度算法。n优点:n对不同进程内的线程切换效率高,一次调度就能完成。n同进程内的线程并行度好。89n混合方法实现多线程n综合用户级线程和核心级线程的实现方法n性能比较好,但实现比较复杂。90n6-4、线程特性n一个线程被阻塞后,只代表该线程对应的执行线索暂停,并不会导致整个进程的阻塞,同进程中的其它线程仍有可能被调度执行。n同进程内的线程是并发执行的。n同进程内的线程能够实现一些资源的共享,如全局变量等n对共享的资源,在访问时需要解决同步或互
47、斥的问题。91n6-5、Linux的线程实现n实现方式:n父进程在调用Clone创建新进程时,可以任意设定子进程与父进程所共享的内容。nLinux通过创建与父进程共享代码、全局数据的子进程来模拟线程。n上层的库函数利用这个系统调用实现线程的使用接口。n这种子进程在OS中无论是调度还是管理,都视为普通的进程。n在操作系统的层次上,没有独立的线程概念,只有进程的概念。n实现方式的特点:n内核级实现。92n思考题:n对照引入线程的背景和动机,说明Linux的这种实现方式,哪一点达到了引入线程初衷,哪一点没有达到,或者部分达到。93(七)Linux进程管理概述n7-1 进程控制块n每个进程控制块对应一个task_struct结构体n以双向链表的形式组织在一起,init_task指向初始化进程。n通过左子-右兄弟的二叉树实现了父子关系的进程树。n7-2 进程状态nRunning:运行和就绪态nWaiting:等待状态nZombie:终止态94n7-3 调度n支持实时进程n主要采用时间片轮转调度算法95n习题n p88(p75)6,8,9,12,14,16n Linux进程调度的主要流程。96谢谢