认识进程
定义
当引入多道批处理技术后,程序可以并发执行,这时,操作系统需要区分不同的程序。
那么怎么进行区分呢?
每个程序都会被放入内存中,包括程序段和数据段,但是还需要一个区分不同程序的信息,也就是 PCB(程序控制块,Process Control Block)
程序段、数据段、PCB 三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程。所谓创建进程,实质上是创建进程实体中的 PCB;而撤销进程,实质上是撤销进程实体中的 PCB。
注意:PCB 是进程存在的唯一标志!
![image-20220911202630118](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911202630118.png)
进程可以有不同的定义:
1.进程是程序的一次执行过程。
2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3.进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
组成
进程(进程实体)由程序段、数据段、PCB 三部分组成。
![image-20220911203219662](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911203219662.png)
![image-20220911203319156](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911203319156.png)
组织方式
进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题。
- 链接方式:按照进程状态将 PCB 分为多个队列,操作系统持有指向各个队列的指针
- 索引方式:按照进程状态建立几张索引表,操作系统持有指向各个索引表的指针
![image-20220911205339008](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911205339008.png)
![image-20220911205406430](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911205406430.png)
特征
- 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的。
- 并发性:内存中有多个进程实体,各进程可并发执行。
- 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位。
- 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供 “进程同步机制” 来解决异步问题。
- 结构性:每个进程都会配置一个 PCB。结构上看,进程由程序段、数据段、PCB 组成。
动态性是进程最基本的特征。
进程是资源分配、接受调度的基本单位!
进程状态
- 运行态
- 就绪态
- 阻塞态
- 创建态
- 终止态
其中,运行态、就绪态、 阻塞态是三种基本状态。
![image-20220911211321150](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911211321150.png)
创建态:进程正在被创建,操作系统为进程分配资源、初始化 PCB。
终止态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销 PCB。
![image-20220911212229860](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911212229860.png)
这部分知识非常重要!!!
![image-20220911212424036](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220911212424036.png)
进程控制
什么是进程控制
进程控制就是要实现进程状态转换。
![image-20220912150115817](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912150115817.png)
这里会产生一个问题,如果更改了相应队列时,PCB 的状态还未改变,就会出现错误。
因此,需要用原语实现进程控制。原语的特点是执行期间不允许中断
,只能一气呵成。这种不可被中断的操作即原子操作。
原语采用 “关中断指令” 和 “开中断指令”
实现。
当关中断后,再次发来的外部中断信号将被拒绝,因此会始终执行当前程序。
![image-20220912151023307](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912151023307.png)
显然,关/开中断指令的权限非常大,是只允许在核心态下使用的特权指令。
相关原语
无论哪种原语,要做的无非是以下几点:
-
更新 PCB 中的信息(如修改进程状态标志、将运行环境保存到 PCB、从 PCB 恢复运行环境)
a.所有的进程控制原语一定都会修改进程状态标志
b.剥夺当前运行进程的 CPU 使用权必然需要保存其运行环境
c.某进程开始运行前必然要恢复期运行环境
-
将 PCB 插入合适的队列
-
分配/回收资源
![image-20220912151828058](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912151828058.png)
![image-20220912151854554](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912151854554.png)
![image-20220912152031617](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912152031617.png)
![image-20220912152121962](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912152121962.png)
进程通信
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
为了保证安全,
一个进程不能直接访问另一个进程的地址空间
,但是进程之间的信息交换又是必须实现的。
进程通信就是指进程之间的信息交换。
共享存储
![image-20220912155217204](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912155217204.png)
消息传递
进程间的数据交换以格式化的**消息(Message)**为单位。进程通过操作系统提供的 “发送消息/接收消息” 两个原语进行数据交换。
![image-20220912160147942](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912160147942.png)
管道通信
管道是指用于连接读写进程的一个共享文件
,又名 pipe 文件。其实就是在内存中开辟一个大小固定的缓冲区。
![image-20220912155726808](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912155726808.png)
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
- 各进程要
互斥
地访问管道。 - 数据以字符流的形式写入管道,当管道写满时,写进程的 wite() 系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的 read() 系统调用将被阻塞。
如果没写满,就不允许读。如果没读空,就不允许写。
- 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
线程
线程是一个基本的 CPU 执行单元,也是程序执行流的最小单位
。
引入线程后,进程只作为除 CPU 之外的系统资源的分配单元。(如打印机、内存地址空间等都是分配给进程的,而不是给线程)
![image-20220912162911356](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912162911356.png)
引入线程机制后的变化:
、
对线程的认识:
![image-20220912165453727](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912165453727.png)
线程的实现方式
用户级线程:
![image-20220912170342150](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912170342150.png)
内核级线程:
![image-20220912170409873](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912170409873.png)
二者组合方式:
![image-20220912170642027](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912170642027.png)
多线程模型
多对一模型
多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
![image-20220912171515151](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912171515151.png)
一对一模型
一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
![image-20220912171636957](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912171636957.png)
多对多模型
n 个用户级线程映射到 m 个内核级线程(n >= m)。每个用户进程对应 m 个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
![image-20220912172029805](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912172029805.png)
总结
![image-20220912172112094](https://youxing-typora.oss-cn-qingdao.aliyuncs.com/image-20220912172112094.png)