1.进程与线程
进程的概念和特征
进程的概念
在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process)的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特性)。
为了使参与并发执行的每个程序(含数据)都能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block,PCB)。由程序段、相关数据段、PCB三部分构成进程实体(又称进程映像),PCB是进程存在的唯一标志。
提示
进程是系统进行资源分配和调度的一个独立单位。
进程的特征
进程的状态与转换

注意
一个进程从运行态变成阻塞态是主动的行为,而从阻塞态变成就绪态是被动的行为,需要其他相关进程的协助。
进程的组成
进程控制块
进程创建时,操作系统为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除。
PCB通常包含的内容
| 进程描述信息 | 进程控制和管理信息 | 资源分配清单 | 处理机相关信息 |
|---|---|---|---|
| 进程标识符 (PID) | 进程当前状态 | 代码段指针 | 通用寄存器值 |
| 用户标识符 (UID) | 进程优先级 | 数据段指针 | 地址寄存器值 |
| 代码运行入口地址 | 堆栈段指针 | ||
| 程序的外存地址 | 文件描述符 | ||
| 进入内存时间 | 键盘 | ||
| 处理机占用时间 | 鼠标 | ||
| 信号量使用 |
程序段
程序段就是能被进程调度程序调度到CPU执行的程序代码段。注意,程序可被多个进程共享,即多个进程可以运行同一个程序。
数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
进程的控制
- 进程的创建
- 进程的终止
- 进程的阻塞和唤醒
进程的通信
PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类。
共享存储
在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现
进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如P操作、V操作),对共享空间的写/读进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享:高级方式的共享则是基于存储区的共享。
消息传递
进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
- 直接通信方式。发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息
- 间接通信方式。发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱。该通信方式广泛应用于计算机网络中。
管道通信
管道通信允许两个进程按生产者-消费者方式进行通信,生产者向管道的一端写,消费者从管道的另一端读。数据在管道中是先进先出的。管道机制必须提供三方面的协调能力:互斥、同步和确定对方的存在。

注意
- 从管道读数据是一次性操作,数据一旦被读取,就释放空间以便写更多数据。普通管道只允许单向通信,若要实现父子进程双向通信,则需要定义两个管道。
- 管道的数据一旦读出即消失,因此只能有一个读进程。但是写进程可有多个。
线程与多线程模型
线程的基本概念
传统的进程只能串行执行一系列程序,而有的进程需要同时处理很多事,所以进入线程,增加并发度。
提示
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
线程的属性
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可以占用不用的CPU
- 每个线程都有一个线程ID、线程控制块(TCB)
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程间共享进程的资源
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
- 同一进程中的线程切换,不会引起进程切换,不同进程中的线程切换,会引起进程切换
- 切换同进程内的线程,系统开销很小,切换进程系统开销大
线程的实现方式
用户级线程
早期的操作系统(如:早期Unix)只支持进程,不支持线程。当时的“线程”是由线程库实现的

用户级线程的优缺点
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
内核级线程

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