教材为西安电子科技大学 汤小丹老师 第四版
视频/图片来源:https://www.bilibili.com/video/BV1jv41147h8?p=1
操作系统系列目录:
第一章:操作系统引论
第二章:进程的描述与控制
第三章:处理机调度与死锁
第四章:存储器管理
第五章:虚拟存储器
第六章:输入输出系统
第七章:文件管理
进程的定义
传统OS中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位”。
结构特征(与程序比较)
进程控制块(PCB) + 程序 + 数据 = 进程实体
进程控制块(Process Control Block,PCB) 操作系统用于管理进程的专门的数据结构。
进程的特征:
动态性:由创建而产生,由调度而执行,由撤销而消亡。
并发性:多个进程实体同存于内存之中,且能在一段时间内同时执行。
独立性:独立执行、独立获得资源、独立接受调度的基本单位。
异步性:按各自独立的、不可预知的速度向前推进。
进程的三种基本状态定义
创建状和终止状态
1)创建状态
创建工作:分配PCB,并填写必要信息;其次将其转入就绪队列。
2)终止状态
终止工作:OS做善后处理;PCB清空并归还给系统。
挂起状态( 引起挂起状态的原因:)
进程状态的转换
引入挂起状态后,增加了挂起状态(静止状态)到非挂起状态(活动状态)的转换,或者相反。
引入挂起原语操作后,基本进程状态的改变:
1.活动就绪→静止就绪
2.活动阻塞→静止阻塞
1.静止就绪→活动就绪
2.静止阻塞→活动阻塞
进程控制块PCB的作用:
使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。
作为独立运行基本单位的标志:
能实现间断性运行方式
提供进程管理所需要的信息
提供进程调度需要的信息
实现与其它进程的同步与通信
进程控制块中的信息
进程标识符:进程标识符用于唯一地标识一个进程。
进程控制块中的信息
①一个进程通常有两种标识符:
内部标识符。在所有的操作系统中,都为每一个进程赋予一个唯一的数字标识符,它通常是一个进程的序号。 设置内部标识符主要是为了方便系统使用。
外部标识符。它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。为了描述进程的家族关系。还应设置父进程标识及子进程标识。此外,还可设置用户标识,以指示拥有该进程的用户。
②处理机状态:处理机状态信息主要是由处理机的各种寄存器中的内容组成的
通用寄存器,又称为用户可视寄存器,它们是用户程序可以访问的, 用于暂存信息,在大多数处理机中,有 8~32个通用寄存器,在RISC结构的计算机中可超过 100 个;
指令计数器,其中存放了要访问的下一条指令的地址;
程序状态字PSW,其中含有状态信息,如条件码、执行方式、中断屏蔽标志等;
用户栈指针,指每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶。
③进程调度信息:在PCB中还存放一些与进程调度和进程对换有关的信息,包括:
- 进程状态。
指明进程的当前状态,作为进程调度和对换时的依据。- 进程优先级。
用于描述进程使用处理机的优先级别的一个整数, 优先级高的进程应优先获得处理机。- 进程调度所需的其它信息。
它们与所采用的进程调度算法有关, 比如,进程已等待CPU的时间总和、 进程已执行的时间总和等。- 事件。
是指进程由执行状态转变为阻塞状态所等待发生的事件, 即阻塞原因。
④进程控制信息,包括:
- 程序和数据的地址
是指进程的程序和数据所在的内存或外存地 (首)址,以便再调度到该进程执行时,能从PCB中找到其程序和数据。- 进程同步和通信机制
指实现进程同步和进程通信时必需的机制, 如消息队列指针、信号量等,它们可能全部或部分地放在PCB中- 资源清单
是一张列出了除CPU以外的、进程所需的全部资源及已经分配到该进程的资源的清单。- 链接指针
它给出了本进程(PCB)所在队列中的下一个进程的PCB的首地址。
⑤进程控制块的组织方式
进程控制是用来管理从进程诞生、运行、到结束过程中的一切事情,故而要由操作系统内核中的原语来实现。
原语是由若干条指令组成的,用于完成一定功能的一个过程。它与一般过程的区别在于:它们是“原子操作”。所谓原子操作,是指一个操作中的所有动作要么全做,要么全不做。换言之, 它是一个不可分割的基本单位,因此,在执行过程中不允许被中断。原子操作在管态(核态,相对用户态)下执行,常驻内存。
内核的实现是通过原语实现的,而原语又是由原子操作构成的。
操作系统内核:操作系统中与硬件紧密相关的模块(如中断处理程序、设备驱动程序等)以及运行频率较高(如时钟管理、进程调度等)的模块,它们常驻内存。
设置操作系统内核的作用:
便于对软件进行保护,防止被其它程序破坏
提高操作系统的运行效率
处理机执行状态:
系统态(管态或内核态)
用户态(目态)
操作系统内核两大功能:
支撑功能
中断处理:内核对中断进行“有限处理”后,转入相关进程接续后续处理。
时钟管理:定时产生时钟信号。
原语操作:原语是完成一定功能的过程,具有不可分割性。资源管理功能
进程管理:运行频率较高的模块(如进程调度、创建与撤销等),常被调用模块如同步原语等均放入内核。
存储器管理:运行频率较高也要放入内核。
设备管理:与硬件相关也要放入内核。
进程的层次结构体现为进程创建过程中生成的进程家族树,如unix下的进程树。
windows中不存在进程层次结构的概念,进程之间(通过句柄)只有控制与被控制的关系。
引起创建进程的事件
用户登录
作业调度
提供服务
应用请求
进程的创建(Creation of Progress)
OS 调用进程创建原语 Creat
引起进程终止的事件:
①正常结束
②异常结束:在进程运行期间,由于出现某些错误和故障而迫使进程终止
越界错误
保护错,访问不当;
非法指令,把数据当成了指令
特权指令错
运行超时
等待超时
算术运算错,例如被0除
I/O故障
③外界干预:外界干预并非指在本进程运行中出现了异常事件,而是指进程应外界的请求而终止运行。这些干预有:
操作员或操作系统干预。 例如,发生了死锁
父进程请求。
父进程终止。 当父进程终止时,OS也将他的所有子孙进程终止。
进程的终止过程
终止的过程:
根据被终止进程的标识符,从 PCB 检索出该进程的 PCB
若被终止进程正处于执行状态,应立即终止该进程的执行, 并置调度标志为真,用于指示该进程被终止后应重新进行调度。
终止该进程的所有子孙进程,以防他们成为不可控的进程。
将被终止进程所拥有的全部资源,或者归还给其父进程, 或者归还给系统。
将被终止进程(它的PCB)从所在队列(或链表)中移出, 等待其他程序来搜集信息。
引起进程阻塞和唤醒的事件:
①向系统请求共享资源失败
②等待某种操作的完成
③新数据尚未到达
④等待新任务的到达
进程阻塞过程:
正在执行的进程,当发现阻塞事件时,由于无法继续执行,于是进程便通过调用阻塞原语block把自己阻塞。可见,进程的阻塞是进程自身的一种主动行为。
进入block过程后,由于此时该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。 最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换。
进程唤醒过程:
当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。
唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
进程的挂起:当出现了引起进程挂起的事件时,系统将利用挂起原语suspend()将指定进程或处于阻塞状态的进程挂起。
进程的激活:当发生激活进程的事件时,系统将利用激活原语active()将指定进程激活。
参考博客:操作系统第二章:进程同步+经典进程的同步问题
进程通信:指进程之间的信息交换。
低级通信:进程间仅交换一些状态和少量数据。如:进程之间的互斥和同步
信号量机制作为通信工具的缺点:(1)效率低 (2)通信对用户不透明
高级通信:进程间可交换大量数据。
用户可直接利用操作系统提供的一组通信命令,高效 地传送大量数据的一种通信方式。
操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。
高级通信机制可归结为三大类:
相互通信的进程间共享某些数据结构或共享存储区,通过这些空间进行通信。
1)基于共享数据结构的通信方式(比如:全局变量?)
进程公用某些数据结构,借以实现诸进程间的信息交换。
实现:公用数据结构的设置及对进程间同步的处理,都是程序员的职责。
2)基于共享存储区的通信方式(比如:数组?)
在存储器中划出一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。
特点:低效。只适合传递相对少量的数据。
进程间的数据交换,以格式化的消息为单位。
程序员直接利用系统提供的一组通信命令(原语)进行通信。
例:计算机网络:网络报文
进程间通信时,源进程可以直接或间接地将消息传送给目标进程,由此可将进程通信分为直接通信和间接通信。
1.直接通信方式
发送进程利用OS提供的发送命令,直接把消息发送给目标进程。发送进程和接收进程都以显式方式提供对方的标识符。
利用直接通信原语解决生产者–消费者问题
当生产者生产出一个产品(消息)后,便用Send原语将消息发送给消费者进程;而消费者进程则利用Receive原语来得到一个消息。若消息尚未产生出来,消费者必须等待,直至生产者进程将消息发送过来。
2.间接通信方式 --通过信箱通信(就像qq邮箱)
信箱用来暂存发送进程发送给目标进程的消息,接收进程则从信箱中取出发送给自己的消息。
消息在信箱中可安全保存,只允许核准的目标用户随时读取
利用信箱通信方式,既可实时通信,又可非实时通信。
信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。
信箱分类:
引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。
在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
为了说明这一点,我们首先来回顾进程的两个基本属性:
①进程是一个可拥有资源的独立单位;
②进程同时又是一个可独立调度和分派的基本单位。
正是由于进程有这两个基本属性,才使之成为一个能独立运行的基本单位,从而也就构成了进程并发执行的基础。然而,为使程序能并发执行,系统还必须进行以下的一系列操作。
1)创建进程
2)撤消进程
3)进程切换
传统的进程“太重”,在多处理机环境(如对称多处理机SMP)下进程调度、分派和切换时都需花费较大的时间和空间开销。
所以就出现了线程,线程设计的指导思想:
若进程的两个属性分开,即对于作为调度和分派的基本单位,不同时作为拥有资源的单位,以做到“轻装上阵”;而对于拥有资源的基本单位,又不对之进行频繁的切换。
线程运行的三个状态
如同传统的进程一样,在各线程之间也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。 相应地,线程在运行时,也具有下述三种基本状态:
① 执行状态,表示线程正获得处理机而运行;
② 就绪状态, 指线程已具备了各种执行条件,一旦获得CPU便可执行的状态;
③ 阻塞状态,指线程在执行中因某事件而受阻,处于暂停执行时的状态。
线程控制块TCB
在OS中的每一个线程都可以利用线程标识符和一组状态参数进行描述,即线程控制块。通常有这样几项:
- 线程标识符
- 寄存器状态, 它包括程序计数器PC和堆栈指针中的内容;
- 堆栈, 在堆栈中通常保存有局部变量和返回地址;
- 线程运行状态, 用于描述线程正处于何种运行状态;
- 优先级, 描述线程执行的优先程度;
- 线程专有存储器, 用于保存线程自己的局部变量拷贝;
- 信号屏蔽, 即对某些信号加以屏蔽。
多线程OS中的进程属性
在多线程OS中,进程是作为拥有系统资源的基本单位,通常的进程都包含多个线程并为它们提供资源,但此时的进程就不再作为一个执行的实体。 多线程OS中的进程有以下属性:
(1) 作为系统资源分配的单位。
(2) 可包括多个线程。
(3) 进程已不是一个可执行的实体。
即无论是用户进程中的线程,还是系统进程中的线程,他们的创建、撤消和切换等,也是依靠内核实现的。此外,在内核空间还为每一个内核支持线程设置了一个线程控制块,内核是根据该控制块而感知某线程的存在的,并对其加以控制。
优点
(1)多处理器系统中,同一进程中的线程可以并行;
(2)内核知道进程中的线程运行情况;
(3)线程切换开销小;
(4)内核本身也可以采用多线程技术,以提高系统的执行速度和效率。
缺点
同一进程下的线程切换开销比较大。
用户级线程是与内核无关。用户级线程仅存在于用户空间中。对于这种线程的创建、撤消、线程之间的同步与通信等功能,都无须利用系统调用来实现。对于用户级线程的切换,通常是发生在一个应用进程的诸多线程之间,无须内核的支持。 由于切换的规则远比进程调度和切换的规则简单,因而使线程的切换速度特别快。
系统仍然是以进程为单位进行调度的。容易发生线程当前状态与实际状态不相吻合的情况。
①如某线程运行过程中请求I/O,于是系统将该线程所在的进程置入阻塞状态。同一进程下的线程即使具备运行条件,也不会被调度;而当前线程理应是阻塞状态,但实际上仍是运行状态,因为系统不对线程进行操作。
②再比如系统采用时间片轮转法,A、B两个进程轮流执行,但是A进程只有两个线程,而B进程则有20个线程,显然这种调度对B进程而言就是不公平的。若想以线程为单位进行调度,系统就应该识别线程,这就得采用内核支持级线程。
优点
(1)同一进程下的线程切换开销小,不用内核状态;
(2)调度算法可以是进程专用的;
(3)用户级线程的实现与OS平台无关;
缺点
(1)系统调用导致同一进程下的所有线程阻塞;
(2)不能利用多处理机进行多重处理,进程中仅有一个线程能执行,其他线程只能等待。
组合方式:将用户级线程和内核支持级线程进行组合。 组合方式中,内核支持内核支持级线程的建立、调度和管理, 同时也允许用户应用程序建立、调度和管理用户级线程。
用户级线程与内核控制线程的连接(3种连接模型)
1)一对一模型 为每一个用户线程都设置一个内核控制线程与之连接。
优势:开销小,效率高
劣势:一个线程阻塞,整个进程阻塞;映射到一个内核的多线程不能使用多处理机
2)多对一模型 将多个用户线程映射到一个内核控制线程。
优势:更好的并发性,一个线程阻塞,允许调度另一个线程执行;
劣势:开销大;整个系统线程数有限;
3)多对多模型 将多个用户线程映射到多个内核控制线程。
结合上述两种方式的优势
系统在创建一个新进程时,便为它分配一个任务数据区PTDA(Per Task Data Area),其中包括若干个线程控制块TCB空间。
内核支持线程的创建、撤销、调度与切换,与进程管理相类似。
1)运行时系统(Runtime System)
所谓“运行时系统”,实质上是用于管理和控制线程的函数(过程)的集合, 其中包括用于创建和撤消线程的函数、 线程同步和通信的函数以及实现线程调 度的函数等。正因为有这些函数,才能使用户级线程与内核无关。运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
线程是通过运行时系统来请求系统的资源的。
2)内核控制线程
这种线程又称为轻型进程LWP(Light Weight Process)。 每一个进程都可拥有多个LWP,同用户级线程一样,每个LWP都有自己的数据结构(如TCB),其中包括线程标识符、优先级、状态,另外还有栈和局部存储区等。它们也可 以共享进程所拥有的资源。LWP可通过系统调用来获得内核提供的服务,这样,当一个用户级线程运行时,只要 将它连接到一个LWP上,此时它便具有了内核支持线程的所有属性。
用户级线程共享LWP,把LWP做成线程池
线程的创建
在多线程OS环境下,应用程序在启动时,通常仅有一个线程在执行,该线程被人们称为“初始化线程”。它可根据 需要再去创建若干个线程。在创建新线程时,需要利用一个线程创建函数(或系统调用),并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小,以及用于调度的优先级等。在线程创建函数执行完后,将返回一个线程标识符供以后使用。
线程的终止
终止线程的方式有两种:一种是在线程完成了自己的工作后自愿退出;另一种是线程在运行中出现错误或由于某种原因而被其它线程强行终止。