文章目录
1. 进程基本概念
2. 进程的状态及状态转换
2.1 五种状态
运行状态:占有CPU,并在CPU上运行
单核CPU,每个时刻下只能有一个进程处于运行态。
就绪状态:已经具备运行条件,但由于CPU在忙,而暂时不能运行。
万事俱备,只欠CPU
阻塞状态:因等待某一事件而暂时不能运行
比如,进程进行了一次“系统调用”,等待系统的服务结果,此时进程就处于阻塞状态,也可以说等待状态。
创建状态:进程正在被创建。
操作系统需要完成创建进程。操作系统为该进程分配各种资源,并为其创建、初始化PCB。这一段事件,进程就处于创建状态。
终止状态:进程运行结束(正常、异常)后,进程正在从系统中撤销。
操作系统需要完成撤销进程相关的工作。回收各种分配给它的资源,撤销PCB等。
2.2 状态之间的转换
小结
3. 进程控制
进程控制:简单理解就是要实现进程状态的转换。
如果,某个状态的队列当中的进程,和本身所在队列的状态不一致,这是很危险的,所以,引入了“原语”。
用原语实现进程的有关控制。
原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作即原子操作。
原语,有点类似线程锁。它采用“关中断指令”和“开中断指令实现”。原语是在操作系统内核当中的一种特殊的程序,是最接近硬件的部分,原语运行在核心态。
执行了关中断指令后,再有外部中断发生的话,不会立即处理。等到执行了开中断指令,系统才恢复对中断的处理。
进程控制所使用的原语,要做的只有三件事情:
- 更新PCB中信息(如修改进程状态、保存运行环境到PCB、从PCB恢复运行环境)
- 将PCB插入合适的队列
- 分配和回收系统资源
小结
4. 进程通信
4.1 概述
进程通信:就是进程之间的信息交换。
进程是系统分配资源的基本单位,并且有内存保护机制,各个进程只能访问自己拥有的内存空间。但是各个进程之间的信息交换又是必须要实现的,为了保证进程之间的安全通信,操作系统提供了一些方法。
进程间通信有三种方式:
- 共享存储
- 消息传递
- 管道通信
方式1. 共享存储
操作系统为两个进程开辟一个“共享空间”,进程1和进程2都可以访问,但是,两个进程对该空间的访问必须是互斥的(不能同时访问)。操作系统只负责提供共享空间和同步互斥工具(如P、V操作)。
- 基于数据结构的共享
比如共享空间里只能放一个长度为10的数组,数据结构是固定的!这种方式速度慢,限制多,是低级的。
- 基于存储区的共享
操作系统只划出一个共享存储区,数据的形式、存放位置,都由进程来控制,而不是操作系统。这种方式速度快,是高级的。
方式2. 管道通信
管道:是指用于连接读写进程的一个“共享文件”,又叫pipe文件。其实就是一个大小固定的缓冲区。
- 通道是半双工的。要想实现全双工,就必须用两个管道。
- 各个进程对管道的访问也必须是互斥的。
- 进程1在写的时候,若管道写满了,则进程1的write()系统调用将被阻塞,等待管道数据被取走。当进程2把管道数据全都取走之后,进程2的read()系统调用将被阻塞。
- 写满才可以读,全都取走才可以写。
- 管道内的数据没有备份,一旦取走,管道就不管了,这就意味着,读进程最多只能有一* 个,否则可能会有读错数据的情况。
方式3. 消息传递
以“格式化的消息(有点类似报文)”为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
直接通信方式:消息直接挂到目标进程的消息缓冲队列上。
间接通信方式:消息先放到一个“信箱”里。
5. 线程概念与多线程模型
线程概念
传统的进程是程序执行流的最小单位。引入“线程”来增加并发度。
引入线程以后,CPU服务的对象不再是进程本身,而是进程内的多个线程。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
- 引入了线程以后,除了CPU这个资源以外,其他的资源(比如内存、打印机)等,依然是以进程为单位进行分配。
引入线程机制后有什么变化
- 资源分配、调度(CPU的调度)
- 进程机制,进程是资源分配、调度的基本单位。
- 引入线程后,进程依然是资源分配的基本单位,而调度的进本单位变为了线程。
- 并发性
- 进程机制,只能进程间并发
- 线引入线程后,各个线程间也可以并发
- 系统开销
- 进程机制,进程间并发时,需要切换进程的运行环境,系统开销大。(因为各种资源都要切换)
- 线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小。
- 同一个进程内的线程共享进程的资源,所以同一进程中的各个线程之间通信无需系统干预。
线程的实现方式
- 用户级线程:用户级线程由应用程序通过线程库实现,线程切换在用户态下就可以完成。(简单来说,用户级线程就是从用户角度可以看到的线程)
在用户看来,是有多个线程,但是在操作系统内核看来,并意识不到这些线程的存在,操作系统只能看到进程。
- 内核级线程:内核级线程的管理由操作系统内核负责,切换也必须在核心态下才能完成。
内核级线程就是“从操作系统内核视角能看到的线程”,上边图中,对操作系统来说,只有3个线程。
因为操作系统只看得见内核级线程,所以只有内核级的线程才是CPU调度的基本单位
多线程模型
-
多对一
多个用户级线程由一个内核级线程来维护。
-
一对一模型
一个用户级线程由一个内核级线程维护。
-
多对多模型
n个用户级线程由m个内核级线程维护(n >= m)