当前位置:   article > 正文

2.1 进程的概念与详情、线程_掌握进程,线程等概念及其特点

掌握进程,线程等概念及其特点

目录

一、进程的概念和特征

1 进程的概念

2 进程的特征

二、进程的状态与转换

三、进程控制

1 进程的创建

2 进程的终止

3 进程的阻塞和唤醒

4 进程的切换

四、进程的组织

1 进程控制块

2 程序段

3 数据段

五、进程的通信

1 共享存储

2 消息队列

3 管道通信

六、线程和多线程模型

1 线程的基本概念

2 线程与进程的比较

3 多线程模型


一、进程的概念和特征

1 进程的概念

        在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process) 的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性共享性(最基本的两个特性)。
        为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block, PCB)。 系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体),所谓创建进程,实质上是创建进程映像中的PCB;而撤销进程,实质上是撤销进程的PCB。值得注意的是,进程映像是静态的,进程则是动态的
        注意: PCB 是进程存在的唯一标志!

2 进程的特征

        进程是由多程序的并发执行而引出的,它和程序是两个截然不同的概念。进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求。
        1)动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
        2)并发性:指多个进程实体,同存于内存中,能在一段时间内 同时运行,并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
        3)独立性:指进程实体是一个能独 立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
        4)异步性:由于进程的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此,在操作系统中必须配置相应的进程同步机制。
        5)结构性:每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和进程控制段三部分组成的。

二、进程的状态与转换

        进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断地发生变化(一个进程会经历若干种不同状态)。通常进程有以下五种状态,前三种是进程的基本状态。
        1)运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。
        2)就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
        3)阻塞状态:又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
        4)创建状态:进程正在被创建,尚未转到就绪状态。创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所必需的资源;最后把该进程转入到就绪状态。
        5)结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行。当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和回收等工作。

进程的状态转换

        就绪状态→运行状态:处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪状态转换为运行状态。
        运行状态→就绪状态:处于运行状态的进程在时间片用完后,不得不让出处理机,从而进程由运行状态转换为就绪状态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。
        运行状态→阻塞状态:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行状态转换为阻塞状态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。
        阻塞状态→就绪状态:当进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞状态转换为就绪状态。
        需要注意的是,一个进程从运行状态变成阻塞状态是一个主动的行为,而从阻塞状态变到就绪状态是一个被动的行为,需要其他相关进程的协助。

三、进程控制

        进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

1 进程的创建

        允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程。
        在操作系统中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。操作系统创建一个新进程的过程如下(创建原语):
        1)为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。
        2)为新进程分配资源。为新进程的程序和数据,以及用户栈分配必要的内存空间(在PCB中体现)。注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于“等待状态”,或称为“阻塞状态”,等待的是内存这个资源。
        3)初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
        4)如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。

2 进程的终止

        引起进程终止的事件主要有正常结束,表示进程的任务已经完成和准备退出运行。异常结束,表示进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、I/O故障等。外界干预是指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止。
操作系统终止进程的过程如下(撤销原语):
        1)根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
        2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
        3)若该进程还有子进程,则应将其所有子进程终止。
        4)将该进程所拥有的全部资源,或归还给其父进程或归还给操作系统。
        5)将该PCB从所在队列(链表)中删除。

3 进程的阻塞和唤醒

        正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作可做等,则由系统自动执行阻塞原语(Block), 使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。阻塞原语的执行过程是:
        1)找到将要被阻塞进程的标识号对应的PCB。
        2)若该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行。
        3)把该PCB插入到相应事件的等待队列中去。
        当被阻塞进程所期待的事件出现时,如它所启动的I/O操作已完成或其所期待的数据已到达,则由有关进程(比如,提供数据的进程)调用唤醒原语( Wakeup),将等待该事件的进程唤醒。唤醒原语的执行过程是:
        1)在该事件的等待队列中找到相应进程的PCB。
        2)将其从等待队列中移出,并置其状态为就绪状态。
        3)把该PCB插入就绪队列中,等待调度程序调度。
需要注意的是,Block原语和Wakeup原语是一对作用刚好相反的原语,必须成对使用。Block原语是由被阻塞进程自我调用实现的,而Wakeup原语则是由一个与被唤醒进程相合作或被其他相关的进程调用实现的。

4 进程的切换

        对于通常的进程,其创建、撤销以及要求由系统设备完成的I/O操作都是利用系统调用而进入内核,再由内核中相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。进程切换是指处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化。进程切换的过程如下:
        1)保存处理机上下文,包括程序计数器和其他寄存器。
        2)更新PCB信息。
        3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
        4)选择另一个进程执行,并更新其PCB。
        5)更新内存管理的数据结构。.
        6)恢复处理机上下文。
        注意,进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。如果进程因中断或异常进入到核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。

        注意:“调度”和“切换”的区别,调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说, 先有资源的调度,然后才有进程的切换。

四、进程的组织

进程是操作系统的资源分配和独立运行的基本单位。它一般由以下三个部分组成:

1 进程控制块

        进程创建时,操作系统就新建一个PCB结构,它之后就常驻内存,任一时刻可以存取,在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。当创建一个进程时,系统为该进程建立一个PCB;当进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制和管理;当进程结束时,系统收回其PCB,该进程随之消亡。操作系统通过PCB表来管理和控制进程。
        下表是一个PCB的实例,PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息等。各部分的主要说明如下:

PCB通常包含
进程描述信息进程控制和管理信息资源分配清单处理机相关信息
进程标识符(PID)进程当前状态代码段指针通用寄存器值
用户标识符(UID)进程优先级数据指针地址寄存器值
代码运行入口地址堆栈段指针控制寄存器值
程序的外存地址文件描述符标志寄存器值
进入内存时间键盘状态字
处理机占用时间鼠标
信号量使用

1)进程描述信息。
        进程标识符:标志各个进程,每个进程都有一个并且是唯一的标识号。
        用户标识符:进程归属的用户,用户标识符主要为共享和保护服务。
2)进程控制和管理信息。
        进程当前状态:描述进程的状态信息,作为处理机分配调度的依据。
        进程优先级:描述进程抢占处理机的优先级,优先级高的进程可以优先获得处理机。
3)资源分配清单,用于说明有关内存地址空间或虚拟地址空间的状况;所打开文件的列表和所使用的输入/输出设备信息。
4)处理机相关信息,主要指处理机中各寄存器值,当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程重新执行时,能再从断点继续执行。
        在一个系统中,通常存在着许多进程,有的处于就绪状态,有的处于阻塞状态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各进程的PCB用适当的方法组织起来。目前,常用的组织方式有链接方式和索引方式两种链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可以把处于阻塞状态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。索引方式是将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。

2 程序段

        程序段就是能被进程调度程序调度到CPU执行的程序代码段。注意,程序可以被多个进程共享,就是说多个进程可以运行同一个程序。

3 数据段

        一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。

五、进程的通信

        进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三个类。

1 共享存储

        在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如P操作、V操作),对共享空间的写/读进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式则是基于存储区的共享。操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读/写指令完成。需要注意的是,用户进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,要想让两个用户进程共享空间必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的。
        简单理解就是,甲和乙中间有一个大布袋,甲和乙交换物品是通过大布袋进行的,甲把物品
放在大布袋里,乙拿走。但乙不能直接到甲的手中拿东西,甲也不能直接到乙的手中拿东西。

2 消息队列

        在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
        1)直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。
        2)间接通信方式:发送进程把消息发送到某个中间实体中,接收进程从中间实体中取得消息。这种中间实体一般称为信箱,这种通信方式又称为信箱通信方式。该通信方式广泛应用于计算机网络中,相应的通信系统称为电子邮件系统。
        简单点理解就是,甲要告诉乙某些事情,就要写信,然后通过邮差送给乙。直接通信就是,邮差把信直接送到乙的手上,间接通信就是,乙家门口有一个邮箱,邮差把信放到邮箱里。

3 管道通信

        管道通信是消息传递的一一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道;而接收管道输出的接收进程(即读进程),则从管道中接收(读)数据。为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥、同步和确定对方的存在
        下面以Linux中的管道为例进行说明。在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
        1)限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为4KB,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发 生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
        2)读进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
        注意:从管道读数据是一次性操作,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。管道只能采用半双工通信,即某一时刻只能单向传输。要实现父子进程双方互动通信,需要定义两个管道。
        管道可以理解为是共享存储的优化和发展,因为在共享存储中,如果某进程要访问共享存储空间,必须是,该空间没有别的进程在里面进行写操作,否则访问行为就会被阻塞。而管道通信中,存储空间进化成了缓冲区,缓冲区只允许一边写入,另一边读出,那么,只要缓冲区中有数据,进程就能从缓冲区中读出,不必担心会因为别的进程在里面进行写操作而遭到阻塞,因为写进程会先把缓冲区写满,然后才让读进程读,当缓冲区里还有数据时,写进程不会往缓冲区写数据。当然这也决定了,管道通信必然是半双工通信。

linux 进程之间的通信主要有下面几种:
        无名管道/有名管道,信号,共享存储、消息队列、信号量、套接字

六、线程和多线程模型

1 线程的基本概念

        当切换进程时, 需要保存/恢复进程运行环境,还需要切换内存地址空间(更新快表、 更新缓存) 开销很大,所以引入线程来减小系统的开销。线程最直接的理解就是“轻量级进程”,它是CPU的一个基本执行单元也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程主要特点有:(1) 线程是处理机调度的单位,进程是资源分配的单位;(2)同一进程内的个线程共享进程拥有的资源;(3)同一进程内的线程切换不会导致进程的切换。线程也有就绪态、阻塞态和运行态。

2 线程与进程的比较

        1)调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换丕会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
        2)拥有资源。不论是传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有一点必不可少的资源),但线程可以访问其隶属进程的系统资源。我们要知道,如果线程也是拥有资源的单位,那么,切换线程也需要较大的时空开销,线程这个概念的提出就没有意义了。
        3)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且多个线程之间也可以并发执行,从而使操作系统具有更好的并发性,提高了系统的吞吐量。
        4)系统开销。由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,因此操作系统所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程CPU环境的保存及新调度到进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此,这些线程之间的同步与通信非常容易实现,甚至无需操作系统的干预。
        5)地址空间和其他资源(如打开的文件):进程的地址空间之间互相独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
        6)通信方面:进程间通信(IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。

3 多线程模型

        线程的实现可以分为两类:用户级线程(User-Level Thread, ULT)和内核级线程( Kernel-Level Thread,KLT)。内核级线程又称为内核支持的线程。
        1. 用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)2. 用户级线程中, 线程切换可以在用户态下即可完成,无需操作系统干预。3. 在用户看来, 是有多个线程。 但是在操作系统内核看来, 并意识不到线程的存在。“用户级线程” 就是“从用户视角看能看到的线程”。4. 优点:用户级线程的切换在用户空间即可完成, 不需要切换到核心态, 线程管理的系统开销小, 效率高。缺点: 当一个用户级线程被阻塞后, 整个进程都会被阻塞, 并发度不高。 多个线程不可在多核处理机上并行运行。

 1. 内核级线程的管理工作操作系统内核完成。2. 线程调度、 切换等工作都由内核负责, 因此内核级线程的切换必然需要在核心态下才能完成。3. 操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。 “内核级线程” 就是“从操作系统内核视角看能看到的线程”。4.优点: 当一个线程被阻塞后, 别的线程还可以继续执行, 并发能力强。 多线程可在多核处理机上并行执行。缺点: 一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成, 需要切换到核心态, 因此线程管理的成本高, 开销大。

一对一模型

一对一模型: 一个用户级线程映射到一个内核级线程。 每个用户进程有与用户级线程同数量的内核级线程。优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成, 需要切换到核心态, 因此线程管理的成本高, 开销大。

多对一模型

多对一模型: 多个用户级线程映射到一个内核级线程。 且一个进程只被分配一个内核级线程。优点: 用户级线程的切换在用户空间即可完成, 不需要切换到核心态, 线程管理的系统开销小, 效率高。缺点: 当一个用户级线程被阻塞后, 整个进程都会被阻塞, 并发度不高。 多个线程不可在多核处理机上并行运行;重点重点重点:操作系统只“看得见” 内核级线程, 因此只有内核级线程才是处理机分配的单位。

多对多模型

 多对多模型:n个用户级线程映射到m个内核级线程(n≥m),集二者之所长。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/699538
推荐阅读
相关标签
  

闽ICP备14008679号