操作系统【进程管理之进程与线程篇】
秋招复习专用,纯属个人整理重点笔记。如果你在看,希望也对你有所帮助。所有笔试都是来自《计算机操作系统》汤小丹的第四版和王道考研的操作系统,如果想深入了解下去,请阅读原书。
因为本文主要是面向秋招,所以针对秋招高频会重点标记(标⭐)并会多整理一些,其他一些知识会稍微补充一下,不会重点介绍。
进程的概念和特征⭐
进程的概念
(1)什么是进程呢?
进程呢其实是我们早期为了更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性而引入的概念。而从不同的角度来看,我们的进程有着不同的概念,一般如下:
- 进程是一次执行过程。
- 进程是一个程序及数据在处理机上顺序执行时所发生的活动。
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进程资源分配和调度的一个独立单位。
不过在后来引入实体(下面将介绍)之后,我们的进程就有了一个统一的概念:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立的单位。”
(2)什么是进程控制块?
所谓进程控制块是为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,简称为进程控制块(Process Control Block,PCB)。
(3)进程的实体是什么?
我们在上面点到了进程实体,其实进程实体也称进程映像,它是由程序段和相关数据段和PCB三部分构成了进程映像。因此,我们所谓的创建进程,其实就是创建进程映像中的PCB,撤销进程便是撤销进程映像中的PCB。需要注意的是进程映像是静态的,而进程是动态的。
进程的特征
(1)动态性。进程是程序一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。
(2)并发性。多个进程实体位于内存当中,能在一段时间内同时运行。所以引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
(3)独立性。 指进程实体(必须包含PCB)是一个能独立运行、独立获得资源和独立接受调度的基本单位。
(4)异步性。由于进程的相互制约,使进程具有执行的间断性,即按照各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,因此在操作系统中必须配置相应的进程同步机制。
(5)结构性。每个进程都要配置一个PCB对其进行描述。
进程的状态与切换⭐
进程的状态
一个进程在生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断的发生变化。一般来说,进程共有以下的五种状态,其中(2),(3),(4)属于进程的基本状态。
(1)创建状态。进程正在被创建,尚未转到就绪状态。创建的步骤为:申请PCB->向PCB中填写控制管理进程的信息->系统分配资源->将进程转到就绪状态。
(2)就绪状态。进程获得了除处理机外的一切资源,一旦得到处理机,便可立即运行。系统处于就绪状态的进程可能有多个,通常将它们排成列,称为就绪队列。
(3)运行状态。进程正在处理机上面运行。
(4)阻塞状态。又称等待状态,进程正在等待某一事件而暂停,如等待资源可用或输入输出完成等。
(5)结束状态。进程正常结束或者其他原因中断推出运行。
进程的转换
(1)就绪状态->运行状态:处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片),进程就转换了。
(2)运行状态->就绪状态:1、处于运行状态的进程在时间片用完后,不得不让出处理机,从而进程状态转换。2、在可剥夺的操作系统中,当由更高优先级的进程就绪时,调度程序将正在执行的进程装换为就绪态,让更高优先级的进程执行。
(3)运行状态->阻塞状态:1、进程请求某一资源(如外设)的使用和分配;2、或者等待某一事件(如等待IO执行中(阻塞))。
(4)阻塞状态->就绪状态:1、进程等待事件的发生(得到资源),如另一个进程的IO操作结束,释放IO资源,这个进程得到IO资源;2、中断结束,中断处理程序来改变响应进程状态。
引入挂起状态
其实呢,除了上面的几种状态,在另外一些操作系统中,又增加了一些新状态,最重要的就是挂起状态。
为什么要引入挂起状态?
(1)终端用户的请求。当用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况对程序进行修改。
(2)父进程请求。父进程有时候希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动。
(3)负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
(4)操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
进程状态的转换
引入挂起状态后,我们于是又多了几种状态的转换。分别是就绪和阻塞与挂起之前的相互转换。(挂起状态又称静止状态,非挂起状态又称活动状态。)
- 活动就绪->静止就绪
- 活动阻塞->静止阻塞
- 静止就绪->活动就绪
- 静止阻塞->活动阻塞
进程的组织
进程是一个独立的运行单位,也是操作系统进行资源分配和调度的基本单位。它由下面将要介绍的三部分组成。
进程控制块(PCB)
我们在创建一个进程的时候,同时也会为它创建一个PCB,视为进程实体的一部分,是进程存在的唯一标志。而我们的操作系统也是通过PCB来管理和控制进程。
PCB的结构组成
PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息等。
各部分的组成如下表:
PCB的组织方式
(1)链接方式。把具有同一状态的PCB,用其中的链接字链接成一个队列。形成就绪队列、若干个阻塞队列和空白队列等。对其中的就绪队列常按进程优先级的高低排列,把优先级高的进程的 PCB 排在队列前面。如下图所示
(2)索引方式。根据所有进程的状态建立几张索引表。如就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。然后在索引表里面,记录具有相应状态的某个PCB在PCB表中的地址。如下图所示:
PCB的生命周期
(1)进程创建。新建PCB(进程存在的唯一标识)。
(2)进程执行。了解进程的现行状态信息(控制管理)。
(3)进程结束。回收PCB,进程随之消亡。
关于进程执行过程中的,PCB是贯穿整个生命周期的。在生命周期中执行了以下操作:
- 进程调度前从PCB中查出进程当前状态和优先级
- 进程调度时根据保存的CPU状态信息,恢复现场
- 进程运行中通过访问PCB实现同步,通信,文件访问
- 进程暂停运行时,将断点的CPU环境保存在PCB中
程序段
(1)能调度到CPU执行的程序的代码段(指令序列)
(2)可以被多个程序共享(多个进程运行同一程序段)
数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
进程的控制⭐
基本概念
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语。
原语的特点是执行期间不允许中断,它是一个不可分割的基本单位,也就是原子操作。它具体是由若干条指令组成的,用于完成一定功能的一个过程。主要作用呢是为了实现进程的通信和控制,系统对进程的控制如不使用原语,就会造成其状态的不稳定性,从而达不到进程控制的目的。
进程的创建
进程允许创建另一个进程,关系为父子进程。子进程可以拥有父进程所拥有的所有资源。但是当子进程被撤销的时候,资源必须回归父进程。同理,父进程撤销时候,子进程也要进行撤销,不然就会变成孤儿进程。
引起进程创建的事件
(1)用户登录。如分时系统中,用户终端登录成功,创建一个进程。
(2)作业调度。如多批次处理系统中,作业调度到某作业时放入内存,创建一个进程。
(3)提供服务。用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务,如文件打印等。
(4)应用请求。上面三种情况都是系统内核为它创建一个新进程,而应用请求则是自己创建一个新进程,以便使新进程以并发运行方式完成特定任务。如键盘输入,表格输出进程。
创建进程的原语
(1)为新进程分配一个唯一的进程标识号,并申请一个空白的PCB。
(2)为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间。如果资源不足,进行阻塞状态,等待内存资源。
(3)初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
(4)若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。
进程的终止
引起进程终止的事件
(1)正常结束。表示进程的任务已完成并准备退出运行。
(2)异常结束。表示进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算错、IO故障等。
(3)外界干预。指进程应外界的请求而终止运行,如系统干预,父进程请求和终止等。
终止进程的原语(撤销原语)
(1)根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
(2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
(3)若该进程还有子孙进程,则应将其所有子孙进程终止。
(4)将该进程所拥有的全部资源,或归还给其父进程,或归还给操作系统。
进程的阻塞和唤醒
引起进程阻塞的事件
正在执行的进程,由于期待的某些事件未发生,如下:
(1)请求系统资源失败
(2)等待某种操作的完成
(3)新数据尚尚未到达或无新工作可做
进程阻塞的原语
(1)找到要阻塞进程的PCB
(2)若该进程为运行态,则保护其现场,将其状态转换为阻塞态,停止运行
(3)PCB插入事件的等待队列,将处理机资源调度给其他就绪进程
引起进程唤醒的事件
(1)等待的事件发生了
进程唤醒的原语
(1)在该事件的等待队列中找到相应进程的PCB
(2)从等待队列移出,设置状态为就绪态
(3)将PCB插入就绪队列,等待处理机调度
总结
阻塞和唤醒作用相反,是一对需要成对使用的原语。
进程切换
引起进程切换的条件
(1)当前进程的时间片到
(2)有更高优先级的进程到达
(3)当前进程在运行态时主动阻塞
(4)当前进程终止
需要注意的是:(1)(2)进程切换是从运行态到就绪态,而(3)是运行态到阻塞态,(4)是运行态到终止态
进程切换的原语
(1)将运行环境(进程和处理机)上下文信息存入PCB
(2)PCB移入相应的队列,如就绪、阻塞等
(3)选择另一个进程执行,并更新其PCB
(4)根据PCB恢复新进程所需的运行环境
进程的通信⭐
进程通信是指进程之间的信息交换。之所以要进入进程通信是为了保证安全,让一个进程不能直接访问其他进程的地址空间。下面主要介绍三种高级通信方式
共享存储
设置一块各进程之间可以直接访问的共享空间,通过对这空间进行写/读操作(使用PV操作完成)来进行信息交换和控制。
实现方式
(1)低级方式的共享,基于数据结构的共享;
(2)高级方式的共享,基于存储区的共享。
操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,数据交换则由用户自己安排读/写指令完成。
消息传递
关于消息传递,进程间的数据交换是以格式化的消息为单位的,是通过系统提供的发送消息和接收消息两个原语进行数据交换。主要的方式有以下两种:
(1)直接通信方式。发送进程->接收进程的消息缓冲队列->接收进程
(2)间接通信方式。发送进程->某个中间实体->接收进程
管道通信
所谓“管道”,指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又称pipe文件。
这里需要注意的是,管道是半双工通信的,也就是两个进程只能有一个进程在工作。当我们的管道缓冲区为空的时候,不允许读,为满的时候,不允许写。并且没写满也不允许读,没读空也不允许写。
线程与多线程⭐
关于线程基本信息
1、为什么要引入线程?
引入进程的目的是为了更好地多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是为了减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
2、线程的信息和属性
(1)线程是一个基本的CPU执行单元,是程序执行的最小单元,也可以说是“轻量级进程”,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。
(2)每一个线程应用一个唯一的标识符和一个线程控制块,块记录了线程执行的寄存器和栈等线程状态。
(3)同一进程中的各个线程共享该进程所拥有的资源。
(4)每一个线程和进程一样,也有着生命周期和自己状态变化。
线程与进程的比较
(1)调度。进程是分配资源的基本单位,而线程是独立调度的基本单位。
(2)拥有资源。进程是拥有资源的基本单位(线程也会拥有一点儿必不可少的资源),线程可以访问所属进程的系统资源。
(3)并发性。进程和线程都可以实现并发,使系统具有更好的并发性,提高了系统的吞吐量。
(4)系统开销。
- 进程创建撤销,系统为之分配回收资源开销大
- 进程切换时保存/恢复执行进程的上下文开销大,而线程切换只需保存和设置少量寄存器内容
- 多个线程共享同一进程的地址空间,同步通信容易实现,开销小
(5)地址空间和其他资源。进程地址空间之间互相独立,同一个进程内线程共享资源,对其他进程的线程不可见。
(6)通信方面。进程通信(IPC)需要进程同步和互斥手段的辅助,线程可以直接读/写进程数据段(如全局变量)进行通信。
线程的实现方式
(1)用户级线程
线程管理(创建,撤销,切换)的所有工作都由应用程序完成,内核意识不到线程的存在。
(2)内核级线程
线程管理的所有工作都由内核完成,应用程序没有进程线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。
(3)组合方式
一个应用程序中的多个用户级线程被映射到一些内核级线程上。
多线程的模型概念
有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式。
(1)多对一模型。多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。
优点:线程管理是在用户空间进行的,因而效率比较高。
缺点:线程在使用内核时被阻塞,进程也会被阻塞,多个线程不能并行运行在多处理机上。
(2)一对一模型。每个用户级线程映射到一个内核级线程。
优点:一个线程被阻塞后,允许另一个线程继续执行,并发粒度大。
缺点:一对一,所以开销比较大,影响应用程序的性能。
(3)多对多模型。n个用户线程映射到m个内核级线程上,m<=n。
克服两家之缺点,集齐两家之优点。女少!
参考资料
《操作系统》—— 王道考研
《计算机操作系统》—— 汤小丹