进程
- 概念
- 组成
- 特征
程序: 存放在磁盘中的可执行文件, 指令的集合
进程: 动态的, 程序的一次执行过程
操作系统创建进程的时候分配进程ID, PID, 是不重复的
还需要记录进程的相关信息被存放在PCB(进程控制模块)
进程实体
进程存在的唯一标识
- PCB
-
- 进程描述信息
-
- 进程标识符PID
- 用户标识符UID
- 进程控制管理信息
-
- CPU、磁盘、网络流量使用情况
- 进程当前状态:就绪/阻塞/运行
- 资源分配清单
-
- 正在使用的文件
- 正在使用的区域
- 正在使用的I/O
- 处理机相关信息
-
- PSW、PC等各种寄存器的值,实现进程切换
- 程序段
-
- 程序的代码
- 数据段
-
- 运行过程中产生的数据
进程是动态的, 进程实体是静态的
PCB是操作系统使用的, 数据段, 程序段是进程自己使用的
进程是进程实体的运行过程, 是系统进行资源分配和调度的独立单位
调度: 系统决定哪一个进程在CPU上进行
多次打开同一个程序PCB和数据段不同, 程序段相同
有了线程之后就不是进行调度的基本单位了
进程的状态与转换
状态
- 创建态(新建态): 分配系统资源, 初始化PCB
- 就绪态: 有运行的状态, 但是CPU没有空闲, 暂时不运行(可能有多个进程)
- 运行态: CPU空闲的时候选取一个就绪态进程进行运行, 执行对应的程序
- 阻塞态(等待态): 请求某个资源, 资源获得之前进程没有办法进行, 进入阻塞态, CPU选取另一个就绪态的进程进行执行, 资源获得之后阻塞态=>就绪态
- 终止态(结束态): 运行结束, 发出exit()系统调用, 系统让下CPU然后回收PCB, 工作完成, 进程彻底消失
中间三种是基本状态
转换
在PCB中有变量记录当前状态, 为了对同一状态下进程统一管理, 操作系统会将PCB组织起来
链接模式: 使用不同的指针指向对应的PCB, 操作系统有各个队列的指针
索引模式: 采用索引模式, 创建不同的索引表, 操作系统有索引表的指针
进程控制
对系统中的所有进程进行有效的管理, 创建新进程, 撤销已有进程, 实现进程状态转换等功能(实现状态的转换)
- 进程控制
-
- 基本概念
-
- 什么是进程控制
- 如何实现
-
- 原语
- 进程控制相关原语
-
- 进程的创建
- 进程的终止
- 进程的阻塞
- 进程的唤醒
- 进程的切换
怎么实现
原语: 特殊的程序, 执行具有原子性, 进行必须一气呵成, 不可以中断
在转换的时候需要转换转换变量, 然后更换队列, 防止 没有执行完全导致数据结构数据不统一
如何实现
可以使用关闭中断和开中断指令, 给他实现原执行
相关的的原语
作业: 从外存还没有运行的程序调度一个程序进入内存, 计算机领域的作业是指用户在一次解决或是一个事务处理过程中要求计算机系统所做的工作的集合
作业调度是指从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。作业调度的目的是提高系统的吞吐量和资源利用率
原语总结
- 更新PCB信息
- 将PCB插入队列
- 分配/回收资源
进程间通讯
IPC: 指两个进程之间产生数据的交换
进程是分配系统资源的单位, 各个进程拥有内存地址空间相互独立
为了保证安全, 一个进程不能直接访问另一个进程的地址空间
解决方式
共享存储
多个进程有一片共享存储区
Linux下面的
int shm_open
函数, 申请调用一片共享内存,void mmap
把区域映射到自己的虚拟地址空间(通过增加页表项/段表项)
- 有可能导致访问互斥, 可以使用同步互斥工具(P、V操作)
基于存储区的共享, 划分出一块共享储存区, 数据的形式, 存放位置由进程决定, 高级通信方式(速度快)
基于数据结构的共享, 比如共享空间可以存放固定的数组, 共享速度慢, 限制多, 低级通讯
消息传递
进程之间使用格式化的消息为单位, 通过系统提供的原语进行数据叫喊
直接通讯方式: 在进程的PCB中包含有一个消息队列, 使用原语进行传递接收, 传递时候需要指明对方进程的PID等
间接通讯方式: 进程向操作系统申请邮箱, 将信息发送到信箱中, 发送的时候指明信箱, 另一个进程点名从信箱中获取信息
管道通讯
单向传递数据
管道是一种特殊的共享文件, 又叫做pipe文件, 实际上就是在内存中开辟一个固定大小的内存缓冲区
先进先出, 本质上是一个队列
和共享内存的不同: 只能按顺序进行传递, 是一个半双工通讯, 同时双向进行的时候需要两个管道, 进程的访问也是互斥的
管道写满了写的进程会被阻塞, 直到管道内的数据被取走, 读空的时候也会进入阻塞
数据一旦被读出就会消失, 多个进程读取可能造成错乱
- 一个管道有多个写进程, 只有一个读进程
- 允许有多个读写进程, 但是系统让读进程轮流读取(Linux方案)