进程基本概念
进程状态及状态转换
进程控制
线程的引入
线程的实现
1.进程基本概念
-
进程的定义:进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位(又称任务)
-
进程控制块(PCB:process control block)
- 也称为进程描述符、进程属性
- OS用于管理控制进程的数据结构
- 描述进程的动态变化,系统感应进程存在的唯一标志,进程与PCB一一对应
- 进程表:所有进程的PCB集合
进程表大小固定:最多允许多少个进程并发执行
- 包括进程描述信息,进程控制信息,所拥有的资源和使用情况,CPU现场信息
-
进程与程序的区别
- 进程能准确的刻画并发
- 程序是静态的,进程是动态的
- 进程有生命周期,程序是相对长久的
- 一个程序可以对应多个进程
- 进程具有创建其他进程的功能
-
进程的地址空间
- OS给每个进程都分配了一个地址空间
- 是相对(虚拟/逻辑)的地址,所以两个进程的地址可能相同,代表的是相对位置而不是同一物理空间
-
进程映像(IMAGE)
- 对进程执行活动全过程的静态描述(快照)
- 用户相关:进程地址空间
- 寄存器相关:程序计数器,状态寄存器,通用寄存器,栈指针,指令寄存器
- 内核相关:PCB及资源数据结构(静态部分),内核栈(动态部分)
-
上下文切换
- CPU硬件状态从一个进程换到另一个进程的过程
- 进程运行时,硬件状态保存在CPU的寄存器中
- 不运行时,保存在PCB;要运行时,将PCB的相关值送到对应寄存器
2.进程状态和状态转换
-
三种基本状态:
- 运行态:占有CPU,并在CPU上运行
- 就绪态:具备运行条件,但是没有空闲CPU而暂时不能运行
- 等待态(阻塞态):因等待某一事件而不能运行(如等待读盘)
就绪->运行:调度程序选择新的进程
运行->就绪:用完时间片;高优先级程序抢占正在运行的程序
运行->等待:进程等待某个事件
等待->就绪:等待的事件发生了
等待->运行,就绪->等待 -
其他状态:
- 创建:完成创建但是==尚未同意执行 ==
- 终止:执行完成,数据统计,资源回收
- 挂起:用于调节负载,不占用内存空间,进程映像交换到磁盘上,分为就绪挂起和阻塞挂起
-
进程队列
- OS为每一类进程创建一个或多个队列
- 队列元素为PCB
- 进程状态的改变:==PCB从一个队列进入另一个队列 ==
3.进程控制
进程状态转换有特定的原语完成
原语:完成特定功能的一段程序,不可分割,不可中断,即原语的执行必须是连续的
-
创建
- 给进程分配唯一的标识,进程控制块和地址空间
- 初始化进程控制块
- 设置相应的队列指针
-
撤销
- 结束进程
- 收回进程占有的资源
- 撤销PCB
-
阻塞:进程自己执行阻塞原语,使自己的运行状态变为阻塞态
-
UNIX进程控制操作
- fork():复制调用进程来创建新的进程
分配给子进程唯一标识pid,状态设置为就绪,插入就绪队列,对子进程返回标识符0,对父进程返回pid
- exec():用一段新的程序代码覆盖原来的地址空间
两者都是进程的创建,但是对于fork,子进程如果要完成和父进程不一样的工作,那么实际上不需要复制全部内容,这时候选择用exec覆盖掉不需要的部分
- wait():进入等待态
- exit():终止进程的运行
4.线程的引入
- 概念:进程中的一个运行实体,是CPU的调度单位,也称为轻量级进程
- 理由:应用的需要,开销的考虑,性能的考虑
- 应用的需要
- 典型的应用:web服务器
- 构造服务器的三种方法
模型 | 特性 |
---|---|
多线程 | 有并发、阻塞系统调用 |
单线程 | 无并发、阻塞系统调用 |
有限状态机 | 有并发、非阻塞系统调用、中断 |
- 开销的考虑:进程的操作时间/空间开销大,限制了并发度的提高
- 性能的考虑:多个线程,负责不同的功能
- 线程的属性
- 标识符ID
- 有状态及状态转换
- 不运行时需要保存上下文环境
- 有栈和栈指针
- 共享所在进程的地址空间和其他资源
- 可以创建、撤销另一个线程,==程序开始是以一个单线程进程方式运行的 ==
5.线程机制的实现
- 用户级线程
- 在用户空间建立线程库
- ==内核管理的还是进程,不知道线程的存在 ==
- 线程切换不需要内核态特权
- 例子:UNIX
优点:线程切换快,可以运行在任何OS,只需要实现线程库
缺点:内核将处理器分配给进程,同一进程的两个线程不能同时运行在两个处理器;大多数系统调用是阻塞的,由于内核阻塞进程,因此进程中的线程也被阻塞
-
核心级线程
- 内核维护进程和线程的上下文
- 线程的切换需要内核支持
- ==以线程为基础进行调度 ==
- 例子:Windows
-
混合模型
- 线程的创建在用户空间
- 线程的调度在核心态完成
- 例子:Solaris