Week3 进程线程模型
声明:本文的图片和内容均来自Coursera课堂。
1. 进程(Process)的基本概念
1.1 进程的定义
多道程序设计(Multiprogramming):允许多个程序同时进入内存并运行,其目的是为了提高系统效率。
并发环境:一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,并且次序不是事先确定的。如下图左就是并发程序A和B,下图右程序A和B就不是并发的。
进程的定义:进程是具有独立功能的程序关于某个数据集合上(即系统分配好的资源)的一次运行活动,是系统进行资源分配和调度的独立单位。又称任务(task or job)。
进程是正在运行程序的抽象。系统资源(如内存、文件)以进程为单位分配。每个进程具有独立的地址空间。调度相当于操作系统把CPU的控制权交给某个进程。
1.2 进程控制快(PCB,Process Control Block)
PCB又称进程描述符或进程属性,是操作系统用于管理控制进程的一个专门的数据结构。PCB记录进程的各种属性,描述进程的动态变化过程。
PCB是系统感知进程存在的唯一标志,进程与PCB是一一对应的。
进程表就是所有进程的PCB集合。
PCB中包含哪些信息呢?
1).进程描述信息
- 进程标识符(Process ID):唯一,通常是一个整数;
- 进程名:通常基于可执行文件名,不唯一;
- 用户标识符(User ID)
- 进程关系组
2).进程控制信息
- 当前状态
- 优先级(priority)
- 代码执行入口地址
- 程序的磁盘地址
- 运行统计信息(执行时间、页面调度)
- 进程间同步和通信
- 进程的队列指针
- 进程的消息队列指针
3).进程拥有的资源和使用情况
- 虚拟地址空间的状况
- 打开文件列表
4).CPU现场信息(即进程在CPU上运行时刻存放的信息)
当进程在CPU上从运行到不运行时,需要保存的信息,通常包括:
寄存器值(通用寄存器、程序计数器PC、程序状态字PSW、栈指针等);
指向该进程页表(和地址空间相关的概念)的指针。
2. 进程状态及状态转换
2.1 进程的基本状态
基本状态:
运行态(Running):占有CPU,并在CPU上运行;
就绪态(Ready):已经具备运行条件,但由于没有空闲CPU,而暂时不能运行;
等待态(Waiting/Blocked,也称为阻塞态、封锁态或睡眠态):因等待某一事件而暂时不能运行。
其他状态:
创建(new):已完成创建进程所必须的工作(分配PID,PCB等),但尚未同意执行该进程(可能因为资源有限)。
终止(Terminated):终止执行后,进程进入该状态。可完成一些数据统计工作,进行资源回收。
挂起(suspend):用于调节负载。进程不占用内存空间,其进程映像交换到磁盘上。挂起不是等待,它不是在等待事件发生。
2.2 进程状态的转换
1).三状态模型及状态转换
2).五状态模型及状态转换
3).七状态进程模型及状态转换
2.3 进程队列
操作系统为每一类进程建立了一个或多个队列。队列元素为PCB。伴随进程状态的改变,其PCB从一个队列进入另一个队列。如下图。单CPU的情况下,运行队列只有一个。
五状态进程模型的队列示意图:
3. 进程控制
进程控制操作完成进程各状态之间的转换,由具有特定功能的原语完成,包括:进程创建原语、进程撤销原语、阻塞原语、唤醒原语、挂起原语、激活原语、改变进程优先级等。
**原语(primitive)**是指完成某种特定功能的一段程序,具有不可分割性或不可中断性。原语的执行必须是连续的,在执行过程中不允许被中断。
3.1 进程的创建
1).给新进程分配一个唯一标识PID以及进程控制块PCB;
2).为进程分配地址空间;
3).初始化进程控制块,设置各种默认值;
4).设置相应的队列指针,如把新进程加入就绪队列链表中。
Unix系统中对应的指令是:fort/exec
Windows系统中对应的指令是:CreateProcess
3.2 进程的撤销
结束进程,收回进程所占有的资源(关闭打开的文件、断开网络连接、回收分配的内存等)。撤销该进程的PCB。
Unix系统中对应的指令是:exit
Windows系统中对应的指令是:TerminateProcess
3.3 进程阻塞
处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待其他进程发送消息等,当被等待的事件未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态。
Unix系统中对应的指令是:wait
Windows系统中对应的指令是:WaitForSingleObject
3.4 Unix常见进程控制操作简介
fork():通过复制调用进程来建立新的进程,是最基本的进程建立过程;
exec():包括一系列系统调用,它们都是通过用一段新的程序代码覆盖原来的地址空间(这种方式很浪费时间,在Linux中有所改进,采用写时复制技术,即复制时指复制原来地址空间的指针,原空间转变为只读,只有当需要写入信息时,才新开辟空间进行写入),实现进程执行代码的转换。
wait():提供初级进程同步操作,能使一个进程等待另外一个进程的结束。
exit():用来终止一个进程的运行。
4.深入理解进程概念
4.1 进程的分类与层次结构
进程的分类:用户进程和系统进程,或前台进程和后台进程,或CPU密集型进程和I/O密集型进程。
进程的层次结构:
对于UNIX进程家族树来说,是树形结构,以init为根。
对Windows来说,每个进程的地位都相同。
4.2 进程与程序的区别
1).进程更能表现出CPU的并发性,而程序不能;
2).程序是静态的,而进程是动态的;
3).进程由生命周期,有诞生和消亡,是短暂的;而程序是相对长久的,是存在硬盘上的;
4).一个程序可以对应多个进程;
5).进程具有创建其他进程的功能。
4.3 进程的地址空间
什么叫操作系统给每个进程都分配了一个地址空间?
对于同一程序,运行两个进程,两个进程都有自己独立的地址空间。而两个进程中的变量,其地址是相对于各自独立地址空间的相对地址,而不是绝对地址。所以,两个进程中的某个变量的地址很可能是相同的(相对于各自进程地址空间是相同的)。
一个进程的地址空间示意图如下。
4.4 进程映像(Image)
进程映像是对进程执行活动全过程的静态描述,相当于某个时刻的快照。进程映像的信息由进程地址空间内容、硬件寄存器内容及与该进程相关的内核数据结构、内核栈组成。
1).与用户相关的信息:进程地址空间(包括代码段、数据段、堆和栈、共享库等);
2).寄存器相关:程序计数器、指令寄存器、程序状态寄存器、栈指针、通用寄存器等内的数值;
3).内核相关:
静态部分:PCB及各种资源数据结构;
动态部分:内核栈(不同进程在进入内核后使用不同的内核栈)。
4.5 上下文(Context)切换
将CPU硬件状态从一个进程切换到另一个进程的过程称为上下文切换。
进程运行时,其硬件状态保存在CPU上的寄存器中;
进程不运行时,这些寄存器的值要保存在进程控制块PCB中;
当操作系统要运行一个新进程时,需要将对应进程的PCB中的相关值送到CPU对应寄存器中。
5. 线程的引入
5.1 线程的基本概念
线程是进程中的一个运行实体,是CPU的调度单位,有时也将线程称为轻量级进程。
线程继承了进程“CPU调度单位”的属性,但没有继承其资源拥有者的属性,其没有属于自己的地址空间,进程还是资源的拥有者。
5.2 为什么在进程中再派生线程?
1).应用的需要
比如,一个进程中通常有多个并发任务的需求,如一边打字一边自动保存等;
再比如,Web服务器的监听请求线程和查询信息线程,两个任务不能互相阻塞。
2).开销的考虑
进程的创建与撤销所需的时间/空间开销大,限制了并发度的提高。相对地,线程创建与撤销的开销就小很多;
进程之间的切换比较麻烦,而线程由于在同一进程内,切换起来开销也少;
进程之间的地址空间是相互独立的,要在两个进程间通信很繁琐;而线程之间的通信无需调用内核,因为线程都是共用同一个进程地址空间的。
3).性能的考虑
在进程中开辟多线程,如果硬件是多核CPU,则可以最大程度利用多处理器的优势。
5.3 线程的属性
1).有标识符ID,标识同一进程内的不同线程;
2).有状态及状态转换的需求;
3).不运行时需要保存CPU上下文环境;
4).有自己的栈和栈指针;
5).共享所在进程的地址空间和其他资源;
6).可以创建、撤销另一个线程。
6.线程机制的实现
6.1 线程的实现
1).用户级线程
在用户空间建立线程库,提供一组管理线程的过程方法。
运行时系统完成线程的管理工作;
内核管理的还是进程,不知道线程的存在;
线程切换不需要内核态特权。
例子:UNIX系统。
优点:i.线程切换快;
ii.调度算法是应用程序特定的;
iii.用户级线程可运行在任何操作系统上(只需要实现线程库);
缺点:i.内核只能将处理器分配给进程,同一进程中的两个线程不能同时运行在多处理器上;
ii.大多数系统调用是阻塞的,因此,由于内核阻塞进程,故进程中所有线程也被阻塞。
2).核心级线程
内核管理所有线程管理,并向应用程序提供API接口;
内核维护进程和线程的上下文;
线程的切换需要内核支持;
以线程为基础进行调度。
例子:Windows系统。
3).混合-两者结合方法
线程创建在用户空间完成;
线程调度等在内核态完成。
例子:Solaris系统。
可再入程序(可重入):
可被多个进程同时调用的程序,具有下列性质:它是纯代码,即在执行过程中自身不改变;调用它的进程应该提供数据区。
7.本章总结
重点概念:进程、进程状态及状态转换、进程控制、进程控制块(PCB)、进程地址空间、进程上下文环境、线程、线程属性、用户级线程、核心级线程、可再入程序、原语、Web服务器。