进程组成:
PCB
PCB:系统为每个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息(如程序代码存放位置)
PCB,程序段,数据段三部分构成了进程实体(进程映像)。所谓创建进程,实际上是创建进程实体中的PCB。撤销进程实际就是撤销进程的PCB,PCB是进程存在的唯一标志。
PCB组成:(进程的管理者)
- 进程描述信息
- 进程标识符PID
- 创建此进程的父进程
- 用户标志符UID
- 进程控制和管理信息
- 进程当前状态
- 进程优先级
- 资源分配清单
- 程序段指针
- 数据段指针
- 键盘
- 鼠标
- 处理机相关信息
- 各种寄存器的值
- 进程运行时需要把进程当前的运行情况记录下来保存在PCB中,如程序计数器的值表示了当前程序执行到哪一句。
- 各种寄存器的值
进程的组织方式:
- 链接方式
- 按照进程状态将PCB分为多个队列
- 执行队列
- 就绪队列:通常会把优先级高的进程放在队头
- 阻塞态队列
- 操作系统持有指向各个队列的指针
- 按照进程状态将PCB分为多个队列
- 索引方式
- 根据进程状态不同,建立几张索引表
- 执行表
- 就绪表
- 索引表
- 操作系统持有指向各个索引表的指针
- 根据进程状态不同,建立几张索引表
进程特征:
- 动态性
- 并发性
- 独立性
- 是资源分配最小单位
- 异步性
- 导致并发程序执行结果的不确定性
- 结构性
进程的状态:
三种基本状态:
- 运行态
- 占有CPU并在CPU上运行
- 就绪态
- 已具备运行条件,但没有空闲CPU所以暂时不能运行
- 阻塞态
- 因某一等待时间暂停不能运行
其他两种状态:
- 创建态:分配资源,初始化PCB
- 终止态:回收进程的资源,撤销PCB
进程状态转换
进程控制:
进程控制就是实现进程间的状态转换
原语:
一般地,把核心态下执行的某些具有特定功能的程序段成为原语。
- 原语有俩类:
- 一类是机器指令级的,其特点是执行期间不允许中断。
- 另一类是功能型的,其特点是作为原语的程序段不允许并发执行。
原语操作所做事情:
-
更新PCB中的信息(修改进程状态标志,将运行环境保存到PCB,从PCB中回复运行环境)
- 进程控制原语一定会修改进程状态标志
-
将PCB插入到合适的队列
-
分配/回收资源
相关原语:
- 进程的创建
- 进程的终止
- 终止其所有子进程
- 将该进程的资源归还给父进程或操作系统
- 进程的阻塞和唤醒
- 进程切换
- 运行态->阻塞态/就绪态
- 就绪态->运行态
进程执行的中断机制
机制 | 原因 | 使用 |
---|---|---|
中断 | 当前指令的外部执行 | 对异步事件的反应 |
陷阱 | 正在运行的进程 | 正在运行进程所产生的错误或异常条件 |
系统调用 | 显示请求 | 调用操作系统函数,例如一个用户进程打开文件,这个调用会导致转移到作为操作系统代码一部分的一个例程上执行并将用户进程转为阻塞态。 |
其中中断又分为:
- 时钟中断:正在运行的进程的执行时间超过了最大允许时间段
- I/O中断:等待一个IO事件
- 内存失效:发生了缺页中断,从硬盘中调入该页框
进程通信:
各进程拥有的内存地址空间相互独立,一个进程不能直接访问另一个进程的地址空间。
共享存储
两个进程对共享空间的访问操作是互斥的(通过操作系统提供的互斥工具<如PV操作>)。
管道通信
特殊的共享文件,实质是在内存空间中开辟的大小固定的缓冲区
-
管道只能半双工通信,也就是在某一时间段只能单向传输。若想双向同时通信必须设置两个管道。
-
各进程互斥地访问管道
-
数据以字符流的形式写入管道,当管道写满时,写进程的wirte()系统调用将被阻塞,等待读进程将数据取走。当读进程的将全部数据取走后,管道为空,此时读进程的read()系统调用将被阻塞。
-
如果没写满则不允许读。如果没读空则不允许写。
-
数据一旦读出则从管道中抛弃,意味着读进程最多只能一个,否则可能读错数据。
消息传递
-
传递结构化消息(消息头/消息体)
-
系统提供发送/接收原语
-
两种方式:
-
直接通信方式:消息直接挂到接收方的消息队列
-
间接通信方式:消息先发送到中间体(信箱)中
-
线程
-
传统的进程只能串行地执行一系列程序。引入线程增加并发度。-
-
线程是CPU调度的最小单位
-
进程间并发需要切换进程的运行环境,系统开销很大。线程间并发则不需要,系统开销小。
-
每个线程都有一个线程ID、线程控制块(TCB)
-
同一进程的不同线程可以共享进程的资源。同时由于共享内存地址空间,同一进程中的线程间的通信是无需系统干预。
分类
用户级线程
-
由应用程序通过线程库来实现
-
线程管理工作由应用程序负责,线程切换在用户态下即可完成
-
对内核不可变,内核只知道有一个进程,只会分配一个处理器
内核级线程
- 线程调度切换由内核负责
- 内核级线程才是处理机分配的单位
多线程模型
多对一模型(纯粹的用户级线程)
一对一模型(纯粹的内核级线程)
多对多模型