《操作系统》2进程与线程.ppt

上传人:牧羊曲112 文档编号:4952570 上传时间:2023-05-25 格式:PPT 页数:29 大小:1.56MB
返回 下载 相关 举报
《操作系统》2进程与线程.ppt_第1页
第1页 / 共29页
《操作系统》2进程与线程.ppt_第2页
第2页 / 共29页
《操作系统》2进程与线程.ppt_第3页
第3页 / 共29页
《操作系统》2进程与线程.ppt_第4页
第4页 / 共29页
《操作系统》2进程与线程.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《《操作系统》2进程与线程.ppt》由会员分享,可在线阅读,更多相关《《操作系统》2进程与线程.ppt(29页珍藏版)》请在三一办公上搜索。

1、第2章 进程与线程,本章目录,2.1 进程的概念,2.1.1 多道程序设计环境下的程序特点,2.1.2 进程的定义,2.2 进程的管理,2.2.1 进程控制块,2.2.2 进程控制块队列,2.4.3 Linux进程的生存过程,2.2.3 进程控制的系统调用命令,2.1.3 进程的状态及状态变迁,2.3 线程,2.3.1 线程的概念,2.3.2 线程的实现,2.3.3 线程与进程的关系,2.4 Linux的进程,2.4.1 Linux进程,2.4.2 Linux的几种链接信息,2.1 进程的概念,多道程序设计环境下的程序特点,.,单道程序设计环境下的程序特点,1.,资源的独占性,程序A,程序B,

2、程序C,时间,4,2,3,4,2,4,5,3,3,0,4,6,9,14,18,20,23,26,30,图例:打印机输出 CPU执行,.,.,执行的顺序性,结果的再现性,多道程序设计环境下的程序特点,2.,程序A,时间,0,4,6,9,12,15,17,13,18,22,程序B,程序C,.,执行的并发性:宏观上,在内存的多个程序都按自己程序规定的操作步骤向前推进;微观上,CPU在任何时刻只执行一个程序,它们轮流占用CPU,交替地执行着。,.,相互的制约性:内存里的多个程序共享系统中的资源,相互间必然有各种制约。一种是“间接制约关系”,另一种是“直接制约关系”。,程序P1调用echo()函数,ge

3、tchar()接收到从键盘输入的字符x,在将其存于变量chin后被中断;,程序P1从断点恢复执行。此时由于P2调用了echo(),chin里原先的x被y所覆盖。于是,在屏幕上显示的是y,而不是x。,程序P1调用echo()函数,getchar()接收到从键盘输入的字符x,然后在屏幕上显示出字符x;,.,状态的多变性:诸多程序在运行过程中有着各种制约关系,致使内存中每一个程序的状态总在不断的变化之中:时而获得CPU处于运行状态;时而由于输入/输出或申请某种资源未得到满足而只好挂起来等待。它们走走停停,停停走走,交替式地向前推进,直至终点。,例2-1:,在多道程序设计环境下,“结果再现性”被打破的

4、简单例子,void echo()chin=getchar();chout=chin;putchar(chout);,执行顺序1:,程序P2调用echo()函数,getchar()接收到从键盘输入的字符y,然后在屏幕上显示出字符y。,(1),(2),.,.,执行顺序2:,(1),(2),(3),程序P2获得CPU使用权,调用echo()函数,从头做到尾,屏幕上显示字符y;,返回目录,.,2.1.2 进程的定义,1.,进程的定义,.,进程是程序的一次运行活动;,进程的运行活动是建立在某个数据集合之上的;,进程要在获得资源的基础上从事自己的运行活动。,所谓“进程”是指一个程序在给定数据集合上的一次执

5、行过程,是系统进行资源分配和运行调度的独立单位。,可从三个方面来描述进程:,(1),(2),(3),例2-2:,驼峰溜放控制过程中的进程,驼峰,到达场,编组场,溜放中的一勾车,雷达测速、测长,道岔(轨道电路),一列新货车,一列解体货车,缓行器,1,2,3,4,5,6,7,8,股道号,溜放中的一勾车,扳道岔程序,.,.,缓行器控制程序,.,雷达测速程序,.,雷达测长程序,.,巡回检测程序,2.,进程与程序的关系,进程是一个动态的概念,强调的是程序的一次“执行”过程;程序则是一组有序指令的集合,在多道程序设计环境下,它不涉及“执行”,是一个静态的概念。,.,.,不同进程可执行同一个程序。由进程的定

6、义可知,区分进程的条件一是所执行的程序,二是数据集合。即使多个进程执行相同的一个程序,只要它们运行在不同的数据集合上,它们就是不同的进程。,.,每个进程都有自己的生命期。进程的本质是程序的一次执行过程,当系统要完成某项工作时,它就“创建”一个进程,以便执行事先编写好的、完成该工作的那段程序。程序执行完毕、完成预定的任务后,系统就“撤消”这个进程,收回它所占用的资源。一个进程创建后,系统就感知到它的存在;一个进程撤消后,系统就无法再感知到它。于是从创建到撤消,这个时间段就是一个进程的“生命期”。,.,进程之间具有并发性。在一个系统中,同时会存在多个进程,与它们对应的多个程序同时在系统中运行,轮流

7、占用CPU和各种资源。这正是多道程序设计的初衷,说明这些进程在系统中并发执行着。,.,进程间会相互制约。由于进程是系统中资源分配和运行调度的单位,因此在对资源共享和竞争中,必然会相互制约,影响了各自向前推进的速度。,通常,系统进程运行在核心态,用户进程运行在用户态。不过,在微内核模式下,只有那些执行基本功能程序的进程,运行在核心态,那些执行非基本程序的进程,则以各种服务的形式运行在用户态。,系统进程与用户进程都要使用系统中的各种资源,它们都是资源分配与运行调度的独立单位,但系统进程的使用级别,应该高于用户进程。也就是说,在双方出现对资源的竞争时,系统进程有优先获得资源、优先得到运行的权利。只有

8、这样,才能保证计算机系统高效、有序的工作。,系统进程直接管理软、硬件资源的有关活动;而用户进程则不得插手资源管理,在需要使用资源时,必须向系统提出申请,由系统统一调度与分配。,系统进程间的相互关系由操作系统负责协调,以利于增加系统的并行性,提高资源的整体利用率;用户进程间的相互关系由用户自己(在程序中)安排。不过,操作系统会向用户提供一定的协调手段(以系统调用命令的形式)。,3.,系统进程与用户进程,.,在多道程序设计系统中,既有操作系统程序,又有用户程序,因此整个系统中存在着两类进程:一类是系统进程,一类是用户进程。,.,操作系统中用于管理系统资源的那些可以并发执行的程序,构成了一个个系统进

9、程,它们提供系统的服务,分配系统的资源;而可以并发执行的用户程序段,形成一个个用户进程,它们是操作系统的服务对象,是系统资源的实际享用者。,.,系统进程与用户进程的主要区别:,(1),(2),(3),(4),返回目录,终止:进程或正常结束,或因某种原因被强制结束。这时,系统正在为其进行善后处理。,阻塞:进程正在等待某事件(如I/O完成)的发生。在事件到来之前,即使把CPU分配给这个进程,它也无法运行。阻塞状态有时也被称为等待状态。,运行:进程获得CPU正在被执行中。若系统只有一个CPU,那么任何时候系统中最多只有一个进程处于运行状态。,就绪:进程已具备运行的条件,只要有机会获得CPU,它就可以

10、投入运行。,创建:进程正在初创时期,操作系统还没把它列入可执行的进程行列。,进程的状态及状态变迁,1.,进程的基本状态和状态变迁,.,.,就绪,提交,运行,阻塞,终止,调度,撤销,超时,事件发生,等待事件,三种最基本的状态,创建,进程的五种状态,(1),(2),(3),(4),(5),进程状态的变迁,进程从一个状态改变成另一个状态,称为进程状态的“变迁”。箭头上的文字,是引起状态变迁的原因。并不是所有的进程状态之间都可发生变迁。,.,可能的变迁为:创建就绪,就绪运行,运行就绪,运行阻塞,阻塞就绪,运行终止,就绪/挂起:进程在辅存。只要被激活,进程就可以调入内存,如果获得CPU就可以投入运行。,

11、2.,对进程状态更细致的划分,就绪/挂起,就绪,激活,运行,阻塞,终止,调度,撤销,超时,事件发生,等待事件,挂起,阻塞/挂起,激活,挂起,事件发生,创建,提交,提交,挂起,.,.,若内存中现有的进程都在等待I/O的完成,CPU只能空闲运转。这无疑是对系统资源的一种浪费。,.,使用磁盘与内存间的交换技术,可达到提高CPU利用率的目的。,新增两个状态,(1),(2),阻塞/挂起:进程在辅存等待事件的发生。只要被激活,进程就可以调入到内存里去等待事件的发生。,.,处于这两种状态的进程,表示它们是在辅存而不是内存。只有通过“激活”,才可以使这些进程的状态变迁为“就绪”或“阻塞”,从而进入内存。,.,

12、这时,比较重要的变迁是:阻塞阻塞/挂起,阻塞/挂起就绪/挂起,就绪/挂起就绪,就绪就绪/挂起,创建就绪,创建就绪/挂起,阻塞/挂起阻塞,运行就绪/挂起。,返回目录,进程控制块里包括四种基本信息:标识信息、现场保护区信息、调度信息以及管理信息。,程序代码及与代码相关联的数据集合,是组成一个进程的实体。但它们都是静态文本,无法反映进程的各种动态特征。,2.2 进程的管理,2.2.1 进程控制块,.,.,.,1.,进程控制块,为便于管理和控制进程的执行,为随时刻画进程的动态特性,为反映进程间的相互关系,操作系统用一个与进程有关的数据结构来完成这样的任务。这个数据结构被称为“进程控制块(PCB)”,它

13、由操作系统创建和管理。,标识信息,现场保护区信息,调度信息,管理信息,进程标识符(进程名),进程标识数(PID),家族关系(父进程),家族关系(子孙进程),通用寄存器,指令计算器,程序状态字(PSW),用户栈指针,进程状态,进程优先数(级/权),等待原因,队列指针,程序存放位置,资源使用历史,打开的文件,数据存放位置,由于进程控制块PCB里包含着一个进程所需要的所有信息,因此它是操作系统中最重要的一种数据结构。进程的PCB是系统感知一个进程实际存在的唯一实体。,.,2.,进程的三个组成部分,.,.,操作系统中进程由三个部分组成,称为“进程映像”。,(1),(2),(3),程序:进程将要执行的程

14、序;,数据:用户空间中的可修改部分,如数据、堆栈、可修改程序;,进程控制块PCB:记录操作系统管理、控制进程所需要的数据信息。,进程映像的表示,PCB,PCB,PCB1,PCB2,程序,程序,程序,数据集合,数据集合,数据集合1,数据集合2,(a),(b),(c),3.,进程间的切换,进程P0,进程P1,操作系统,中断或系统调用,保护现场到PCB0,从PCB1现场保护区获取现场信息,中断或系统调用,保护现场到PCB1,从PCB0现场保护区获取现场信息,执行,执行,执行,被打断的断点x,从断点x恢复执行,被打断的断点y,返回目录,PCB中可以有多个队列指针,以反映进程间的不同关系,比如用另一个指

15、针反映出进程间的家族关系。,还可以有就绪/挂起队列、阻塞/挂起队列等;,队列最后一个PCB的“队列指针”里,放队列结束标志,如“-1”;,操作系统要为每个队列设置一个头指针,通过它及队列中各PCB里的队列指针,可以得到该队列里的所有进程的PCB;,2.2.2 进程控制块队列,.,操作系统是通过PCB来管理系统中 的进程的。最常用的办法是根据进程所处状态的不同,通过PCB中的链接指针,形成各种管理队列。,.,运行队列头指针,就绪队列头指针,PCB,PCB,PCB,PCB,PCB,-1,阻塞队列1头指针,PCB,PCB,-1,阻塞队列2头指针,PCB,PCB,PCB,PCB,-1,PCB,队列指针

16、,(a)带有队列指针的PCB,(b)由PCB组成的各种队列,几点说明,(1),(2),(3),(4),返回目录,按系统所采用的调度算法,将其PCB排入就绪队列或就绪/挂起队列。,调用创建进程原语后,系统中出现一个新的进程,就会感知到这个进程的存在。一个进程创建(或“派生”)另一个进程,前者称为父进程,后者称为子进程。,2.2.3 进程控制的系统调用命令,在执行期间不能被打断、不能被分割的程序段,在操作系统里称作“原语”、“原子操作”或“不可分割的操作”。,.,.,.,有关进程控制的系统调用命令都是以原语的形式出现的。,1.,创建进程原语,屏蔽中断,申请一个PCB,分配一个标识,填写PCB,将进

17、程置为就绪或就绪/挂起状态,到相应队列排队,开中断,不能被分割的整体,.,创建进程原语程序主要应该完成的工作,(1),为新进程申请一个PCB;,(2),为新进程分配一个唯一的标识;,(3),根据创建者提供的信息,填写进程控制块PCB里的各项内容;,(4),.,创建进程原语的图中,“屏蔽中断”及“开中断”两个操作,是为了保证整个执行流程不被分割而设置的。也就是说,这四项工作必须作为一个整体一次执行完毕,中间不能被别的操作打断。这是原语的要求。,2.,撤消进程原语,.,调用撤消进程原语后,一个原来在系统里存在的进程就消失了,系统再也不会感知到它的存在。,.,撤消进程原语应该完成的工作,(1),(2

18、),根据进程标识,找到相应的PCB,若该进程正在运行,则立即终止运行;,(3),释放该进程使用的所有资源(如程序、数据所占用的存储空间等);,(4),若有子孙进程,终止它们,释放资源;,归还所占用的PCB空间。,3.,阻塞进程原语,.,在生命期里,进程走走停停。“停”的原因,就是为等待某个事件的发生而被阻塞。调用阻塞原语后,一个原来处于运行的进程变为阻塞状态,操作系统将会重新对CPU进行分配。,.,阻塞进程原语应该完成的工作,(1),(2),停止进程的运行,将CPU的运行现场保护到该进程PCB的现场保护区;,(3),把进程的状态由运行修改为阻塞,并到相关的阻塞队列里排队;,转向操作系统的进程调

19、度程序,将CPU分配给另外一个进程使用。,.,4.,唤醒进程原语,当所等待的事件发生以后,进程就应该被唤醒,让其去参与对CPU的竞争。调用唤醒进程原语后,一个进程又可以“走”了。,.,唤醒进程原语应该完成的工作,(1),(2),将进程从相应的阻塞队列上摘下来;,(3),把进程的状态由阻塞修改为就绪,并到就绪队列里排队;,转向操作系统的进程调度程序,将CPU分配给另外一个进程使用。,5.,挂起进程原语,.,当系统为了获得所需的内存空间,在主-辅存之间交换进程时,进程才会有挂起状态。,.,挂起进程原语应该完成的工作,(1),(2),得到需要挂起的进程的PCB,将其从相应队列里摘下;,(3),申请位

20、于辅存上的交换区空间,将进程映像的部分或全部写入交换区,并将交换区地址记入该进程PCB;,根据进程原先的状态,把其状态修改为阻塞/挂起,或就绪/挂起;,(4),系统收回进程所占用的内存空间。,通过对驼峰溜放控制过程的简略描述,理解进程控制原语的应用。,激活是针对处于“阻塞/挂起”或“就绪/挂起”状态的进程实行的操作。由于它是挂起的“逆”操作,因此激活进程的原因就与挂起的原因相关。,每股道是一个“进路”。对任何一个道岔,知道所来勾车的进路编码,就能知道当前道岔应该是往左扳动还是往右扳动。,.,6.,激活进程原语,.,激活进程原语应该完成的工作,(1),(2),得到需要激活的进程的PCB,将其从相

21、应队列里摘下;,(3),申请所需要的内存空间,将存放在辅存交换区里的进程映像读入该内存区域;,根据进程状态修改为阻塞或就绪,把PCB排入相应的管理队列;,(4),释放所占用的辅存交换区。,勾车进入方向,勾车出清方向,勾车出清方向,道岔,轨道电路,轨道电路,轨道电路,勾车进路表,例2-4:,(1),对每个道岔,都装有“轨道电路”硬设施,当一勾车的第一对车轮从进入方向压到轨道电路时,它会发一个消息给计算机;当这一勾车的最后一对车轮从出清方向压到轨道电路时,它也会发一个消息给计算机。,(2),(3),系统为每一个道岔开设一张勾车进路表,保存所来勾车的进路编码。,返回目录,2.3.1 线程的概念,2.

22、3 线程,1.,引入线程的原因,进程的两个属性,做法是将进程的两个属性拆开来,进程只作为“资源拥有者”,“调度和运行”则赋予线程。这样,CPU的利用率能得到更多的提高,使系统的效率得到更充分地发挥。,.,(1),(2),进程是系统资源分配的单位;,进程是系统调度运行的单位。,.,资源分配和调度运行彼此间是独立的。为提高进程的并发执行程度,减少系统在进程切换时所花费的开销,就出现了与进程管理相关联的更高级的概念:线程。,.,(a)单进程,单线程,(b)单进程,多线程,(c)多进程,每个进程一个线程,(d)多进程,每个进程多个线程,在引入线程的操作系统中,线程是进程中的实体。实施CPU分配时,是把

23、CPU分配给进程中可以并发执行的线程。因此,如果把进程理解为是操作系统在逻辑上需要完成的一个任务,那么线程则是完成该任务时可以并发执行的多个子任务。,.,.,进程和线程之间的各种关系,2.,线程的定义,所谓“线程”,是指进程中实施处理机调度和分配的基本单位。有了线程后,人们有时就把原先的进程称为“重载进程”,把线程称为“轻载进程”。,3.,线程的状态,由于在进程内的线程共享程序和资源,因此创建线程无需进行资源分配,比创建一个进程要顺利和快捷得多;这也使得撤消线程比撤消一个进程所花费的时间短;,.,.,引入线程的好处,(1),同一进程里线程间的切换是在进程的地址空间里进行,因此比进程间不同地址空

24、间中的切换开销要少得多;,(2),进程里的线程可以随时访问该进程拥有的所有资源,无需做任何切换工作;,(3),同一进程中的诸多线程共享内存区域和文件,因此它们之间可以直接进行通信,不必通过系统内核。,(4),.,创建:创建一个新进程时,同时就为该进程建立一个主线程,它可以再创建其他线程,新线程被排在就绪队列中。,.,阻塞:当线程等待一个事件时,它将被阻塞,CPU转而去执行另一个就绪线程。线程阻塞引起的是同进程中线程间的调度和CPU分配;进程的阻塞引起的是不同进程间的重新调度和CPU分配。,.,唤醒:当线程等待的事件发生时,该线程由阻塞转为就绪,插入到就绪队列中。,返回目录,2.3.2 线程的实

25、现,1.,用户级线程方法,若有关线程的管理工作都是由运行在用户空间的应用程序完成,那么这样的线程称为“用户级线程”。完成线程管理的应用程序,称为“线程库”,它将被系统中的所有用户程序共享使用。,2.,这时,用户程序被创建成为一个由内核管理的进程,与这个进程相对应的线程则在用户空间里运行。,.,内核级线程方法,线程库,用户空间,内核空间,P,进程,线程,.,.,由于一切活动都是针对一个进程发生的,并且都发生在用户空间里,系统感知不到这些活动的存在。系统内核仍然是以进程为单位管理和调度进程,指定其所处的状态。,用户空间,内核空间,P,进程,运行在用户态的线程,管理在核心态的线程,.,若有关线程管理

26、的所有工作都是由内核完成的,用户空间里没有任何进行线程管理的程序,只是向应用程序提供相应的系统调用和应用程序编程接口),以便用户程序可以创建、执行、撤消线程。那么这样的线程称为“内核级线程”。,3.,组合方法,.,采用这种方法,用户程序的所有线程都在一个进程内。内核为该进程以及内部的每一个线程(深色圆圈)维护上下文信息,调度在内核基于线程架构的基础上完成,线程运行则在用户空间进行。,.,组合方法中,同一进程中的多个线程可以分配到不同处理器上并行地运行,这意味着一个会引起阻塞的系统调用不必阻塞整个进程。这样组合式的管理方法,会综合用户级线程与内核级线程管理方法的优点,减少它们的缺点。,.,在组合

27、式方法中,线程的创建在用户空间里完成,线程的调度等工作,是通过线程库来进行。一个用户程序中的多个用户级线程,被映射到一些内核级线程上。,.,内核级线程可把同一进程中的多个线程调度分配到不同处理器中;若进程中的一个线程被阻塞,内核可调度同一进程中的另一个线程投入运行,而不是整个进程都被阻塞。内核级线程的另一个优点是内核程序本身也可使用多线程技术。,用户空间,内核空间,P2,进程,用户级线程,内核级线程,P1,线程库,.,内核级线程在同一个进程里进行线程切换时,是在内核模式下进行的。这相比用户级线程,就会显得复杂一些,所花费的时间要多一些。,返回目录,调度切换:不同进程间的调度切换,系统要花费很大

28、的开销(比如,要从这个地址空间转到那个地址空间,要保护现场等);同一进程的线程间的切换,无须转换地址空间,从而减少了系统的开销。,通信关系:不同进程间的通信,必须使用操作系统提供的进程通信机制;同一进程各个线程间的通信,可以直接通过访问共享的进程地址空间来实现。,地址空间:不同进程的地址空间是相互独立的,而同一个进程中的各个线程共享着同一个用户地址空间。,两个堆栈指针,一个指向用户栈(线程在用户态下时,使用自己的用户栈),一个指向系统栈(线程在核心态下运行时,使用系统栈);,2.3.3 线程与进程的关系,1.,线程与进程的关系,.,线程控制块(TCB)的三部分内容,(1),一个唯一的线程标识;

29、,(2),(3),一个私用的现场保护区,存放现场保护信息(如处理机的各种寄存器内容)和其他与线程有关的信息。,PCB,数据,程序,用户栈,系统栈,寄存器,单线程进程模型,进程,PCB,数据,程序,用户栈,系统栈,寄存器,TCB1,用户栈,系统栈,寄存器,TCB2,用户栈,系统栈,寄存器,TCB3,线程1,线程2,线程3,进程,多线程进程模型,进程和线程的几点不同,.,(1),(2),(3),一个管理窗口系统的进程,提供显示器上有关窗 口的各种操作:窗口写、移动窗口、改变 窗口尺寸等的程序。进程拥有的资源是物 理显示器。如图所示,三个窗口线程都将共享着进程的资源,使用同一个程序来把信息写到显示器

30、的某一部分上,每一个线程的执行独立于其他线程。,例2-7:,窗口线程,窗口进程,三个窗口,显示器,处理机管理的新含义,2.,.,调度:引入线程后,进程是资源的拥有者,线程是处理机调度和分配的单位。在同一进程内,线程的切换不引起进程的切换;由一个进程中的线程切换到另一个进程中的线程时,就要引起进程间的切换。,.,并发:引入线程后,不仅进程之间可以并发执行,而且一个进程内的多个线程之间也可以并发执行,因此系统具有了更好的并发性,进而使系统的资源利用率和吞吐率大大提高。,.,资源:引入线程后,进程内的所有线程共享该进程拥有的全部资源;线程只有很少一些运行时必需的资源,如程序计数器、一组寄存器和堆栈等

31、。,.,开销:创建和撤消进程时,系统要做资源的分配和回收工作;进程间进行切换时,系统要为其保存现场信息,将原进程内容调出至辅存,将新进程内容调入内存等。同一进程内的线程有相同地址空间,它们间的切换不涉及存储器管理方面的操作。,返回目录,系统调用接口。进程通过它进入Linux内核,并得到所提供的各种特定服务。,用户进程。用户应用程序是运行在Linux内核上的一个庞大的软件集合。当一个用户程序在操作系统上运行时,它就成为一个进程。在Linux里常把进程称为“任务”。,2.4 Linux的进程,2.4.1 Linux进程,Linux内核,1.,.,Linux内核,指的是所有Linux发布版本的核心程

32、序。整个系统由四个部分组成:,(1),系统调用接口,内核子系统,硬件,进程1,进程2,进程n,用户进程,Linux内核,进程调度,存储管理,虚拟文件系统,网络,进程间通信,(2),(3),Linux内核。它负责管理和使用系统中的各种资源(如内存空间、磁盘空间、磁盘上的文件),以及启动并运行程序等。Linux内核并发地运行多个进程,并使各种进程公平、合理地使用各种资源,保证进程之间互不干扰地安全运行。,(4),硬件。这是安装Linux时需要的所有可能的物理设备,是支撑Linux运行的硬件环境,比如CPU、内存储器、磁盘、网络硬件等。,Linux的进程控制块,2.,.,Linux中,把传统的进程控

33、制块PCB称为进程描述符,用于记录每个进程所做的事情。每个PCB都是一个task_struct的结构式数据类型。,Linux系统中的进程,由四个部分组成,.,内核栈,PCB(task_struct 结构),8KB,52个字节,高地址,低地址,内核栈的增长方向,8140个字节,(1),一段可执行的程序;,(2),一个专用的系统栈空间,用来保存中断现场信息和进程进入内核模式后执行子程序(函数)嵌套调用的返回现场信息;,(3),进程控制块PCB(task_struct结构);,(4),独立的存储空间。,每个进程的系统栈和PCB间存在着紧密关系,为了节省存储空间,Linux把每个进程的PCB和内核栈存

34、放在一起,共占有8KB的内存区。,.,Linux的进程状态及其变迁,3.,可运行状态:当一个进程正在被CPU执行,或已经准备就绪随时可由调度程序调度执行,则称该进程处于“可运行”状态。,(1),(2),可中断等待状态:当一个运行进程需等待某事件的发生、等待时允许由其他进程通过发信号而唤醒,那么就把它的状态由“可运行”变迁为“可中断的等待”。在所等待的事件或信号到来时,进程的等待结束,状态变迁为“可运行”。,不可中断等待状态:这是一种与“可中断的等待”类似的状态,只是在等待期间不能被信号打断。,(3),(4),暂停状态:当运行进程接到暂停执行的信号(比如程序正在接受调试)时,其状态就由“运行”变

35、迁成为“暂停”。,创建一个进程,TASK_RUNNING(可运行状态),时间片到,调度,TASK_UNINTERRUPTIBLE(不可中断等待状态),TASK_INTERRUPTIBLE(可中断等待状态),TASK_STOPPED(暂停状态),TASK_ZOMBIE(僵死状态),占有CPU运行,等待事件发生,等待事件或信号发生,等待的事件已发生,等待的事件或信号已发生,收到暂停信号,进程被终止,收到结束暂停信号,(5),僵死状态:由于某种原因进程已被终止执行,正在归还资源,但其PCB还没有释放。这时的进程就处于僵死状态。,Linux的进程标识符,4.,.,进程标识符:在Linux进程的PCB里

36、,字段pid存放进程标识符,用来唯一地标识进程。,.,用户标识符:在Linux里,每个用户都有一个唯一的数字与之对应,称为用户标识符。它存放在进程PCB的字段uid里。,.,Linux将用户划分成组,每个用户可分属一个或多个用户组。组由一个唯一的数字来标识,称为组标识符。组标识符存放在进程PCB的字段gid里。,返回目录,2.4.2 Linux的几种链接信息,进程链表,1.,.,.,Linux启动时,创建了一个非常特殊的进程,它的名字是init,进程标识符PID为1。,每个进程的PCB里有两个task_struct型指针字段,作用是:prev_task:向前指针,指向链表中本进程前面的那个进程

37、的PCB;next_task:向后指针,指向链表中本进程后面的那个进程的PCB。,init进程的PCB,next_task,prev_task,进程1的PCB,next_task,prev_task,进程2的PCB,next_task,prev_task,进程3的PCB,next_task,prev_task,进程n的PCB,next_task,prev_task,系统中的所有进程,“可运行”队列,2.,PCB里有名为prev_run和next_run的两个task_struct型指针字段,作用是:prev_run:向前指针,指向链表中本进程前的那个“可运行”状态进程的PCB;next_run

38、:向后指针,指向链表中本进程后的那个“可运行”状态进程的PCB。,.,.,为提高调度时的查找速度,Linux是以优先级为依据建立“可运行”队列的。Linux进程优先级的允许范围从0到139,因此系统总共维护着140个“可运行”的队列。,利用散列表pidhash里的pidhash_next和pidhash_pprev,以及进程PCB里的字段pidhash_next和pidhash_pprev,就能基于散列表的索引值形成一个个进程PCB的双向链表。,PID散列链表,2.,.,为了加快查找过程,理想的做法是通过某个函数,利用进程的PID值算出进程PCB所在的位置。这实际上就是所谓的散列技术。,.,L

39、inux引入了散列技术,并利用链地址法来处理PID冲突。即如果两个不同的PID计算出的PCB在散列表的索引值相同(冲突),那么就把这两个PCB组成链表链接在一起。,pidhash_next,pidhash_pprev,pidhash_pprev,pidhash_next,pidhash_next,pidhash_pprev,pidhash_next,pidhash_pprev,pidhash_next,pidhash_pprev,pidhash_next,pidhash_pprev,pidhash散列表,0,199,散列表的一个元素,进程的PCB,进程的PCB,进程的PCB,进程的PCB,为实

40、现PID散列链表,Linux开辟了名为pidhash的数组作为散列表。该表的每个元素由两个task_struct型指针组成:pidhash_next指向pidhash散列表里该索引值链表中的下一个PCB;pidhash_pprev指向pidhash散列表里该索引值链表中的前一个PCB。,.,.,4.,进程家族关系链,.,.,p_opptr:指向初始父进程的指针;,创建进程的进程称为父进程,被创建的进程称为子进程。如果一个进程创建了若干个子进程,那么这些子进程之间就是兄弟关系。Linux的PCB里专门有反映进程间关系的task_struct型指针字段。,p_pptrr:指向父进程的指针;,p_c

41、ptr:指向最新子进程的指针;,p_ysptr:指向弟进程的指针;,p_osptr:指向兄进程的指针。,P0,P1,P2,P3,P4,指向父进程,指向兄进程,指向弟进程,指向最新子进程,图例:,各种家族指针,(1),(2),(3),(4),(5),比如,进程P0创建三个子进程,P1、P2、P3,进程P3又创建了一个进程P4。那么,这五个进程间的关系如图所示。从图中看出,进程P0是进程P1、P2、P3的父进程;进程P3是进程P4的父进程;P1是P2的兄进程,P2是P3的兄进程;P2是P1的弟进程,P3是P2的弟进程;P3是P1的最新子进程,P4是P3的最新子进程;如此等等。,.,返回目录,2.4

42、.3 Linux进程的生存过程,Linux初启时运行在内核态。完成系统引导和初始化后,诞生了第一个进程:init进程。该进程为当前的每个终端创建管理进程,接收用户的登录信息。用户正确登录后,就为其创建名为shell的进程。此后用户与系统交互时,就由shell进程接收并解释用户输入的命令,创建子进程执行该命令。执行命令的子进程又可能再创建子进程,从而形成了一棵倒长的树:根在上面,树枝在下面。,.,系统中的进程个数,1.,32位/字,1024个字,pidmap_array位图,当这位为1时,表示系统里有PID等于3的进程,这位不用,.,Linux中同时存在的进程数目是受限的,缺省情况下最大的PID

43、值是32767。当PID达到这个上限值时,就必须使用已闲置的小PID值。,.,Linux在内核里开辟一个有1024个字、每个字32个二进制位的区域,用它各位的顺序来表示PID值。整个区域称为一个“位图”,取名pidmap_array。位图里的某位为“1”,表示该位代表的PID值已被进程使用;某位为“0”,表示该位代表的PID值还没使用,可作为新进程的PID。,进程的创建,2.,除了init进程外,运行在Linux系统中的其他进程,都是用系统调用fork和clone创建的。调用fork和clone的进程是父进程,被创建的进程是子进程。,.,.,子进程通过复制父进程而得到创建。使用fork和clo

44、ne的区别是:fork是全部复制,是把父进程使用的所有资源全部通过复制而“传”给子进程;clone则是通过设置各种参数,对资源做有选择地复制,没有被复制的就通过指针的复制让子进程共享。,.,不管是fork还是clone,它们都是调用内核函数do_fork()来完成对子进程的创建。,.,在fork或clone调用结束时,父进程和子进程同时存在,都可以运行。这时,父进程的返回点与子进程的开始执行点是一样的(因为子进程基本继承了父进程的一切),Linux用返回值来区分不同情况。,进程的执行,3.,为一个进程注入新“灵魂”的任务,在Linux里是由系统调用exec()来完成的。,.,.,exec()有三个参数:待执行的文件名、参数列表、环境变量表。调用exec()就做下面的三件事情:用所给的执行程序代替原先的代码段;废弃原有的数据段,为新程序分配新的数据段;废弃原有的堆栈段,为新程序分配所需的堆栈段。,.,一个进程执行exec()后,除进程的PID没有改变外,它的代码段、数据段、堆栈段全都变了,成了一个不是原进程(代码段、数据段、堆栈段全是新的)的原进程(因为PID是原来的)。,返回目录,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号