进程管理
程序并发执行
顺序执行
- 顺序性
- 封闭性
- 可再现性
并发执行
- 间断性: 由于共享资源, 且资源少于并发执行的进程数量
- 失去封闭性: 并发执行时,共享资源导致系统状态不再是只有正在执行的程序才能看到
- 不再可现性: 由于失去封闭性导致的
进程的概念
应用程序对应的进程由程序, 用户数据, 操作系统管理进程所需要的进程控制块构成
定义
- 进程是允许并发执行的程序在某个数据集合上的运行过程
- 进程是由正文段 用户数据段 以及进程控制块共同组成的执行环境
特征
- 并发性: 多个进程实体能在一段时间间隔内同时运行(重要特征)
- 动态性:
- 独立性
- 异步性
- 结构特征: 进程实体包括用户正文段, 用户数据段和进程控制块
进程和程序的比较
- 程序是静态的, 进程是动态的
- 程序是永久的, 进程是短暂存在的
- 存在实体不同, 程序是指令的集合, 而进程是包括了。。。。的实体
- 联系: 进程是程序的一次执行, 进程总是至少对应一个特点的程序
进程控制块PCB
进程控制块中记录了操作系统所需要的用于描述进程情况以及控制进程运行所需的全部信息
组成
- 进程标识符信息
- 处理机状态信息
- 通用寄存器
- 指令计数器
- 程序状态字PSW
- 用户栈指针
- 进程调度信息
- 进程控制信息
进程的状态
基本状态
- 就绪态
- 执行态
- 阻塞态
进程的组织
- 链接方式: 进程列队
- 索引方式
进程的控制
- 创建: 用户登录, 作业调度, 提供服务, 应用请求
- 阻塞: 请求系统服务, 启动某种操作, 新数据尚未到达, 无新工作可做
- 唤醒
- 终止: 正常执行完毕, 另外一个进程调用系统调用终止一个进程
操作系统内核
操作系统内核是计算机硬件的第一次扩充
内核功能
- 支撑功能: 中断处理 时钟管理 原语操作(原子操作)
- 资源管理功能: 进程管理存储器管理设备管理
中断
中断是改变处理器执行指令顺序的一种事件这样的事件与CPU芯片内外部电路产生的电信号相对应
- 类型
- 同步中断(内部中断或异常): 除法出错, 调试, 溢出和浮点出错
- 异步中断(外部中断): 外部可屏蔽中断, 外部不可屏蔽中断
- 原因
- 人为设置中断
- 程序性事故
- 硬件故障
- IO设备
- 外部设备
- 响应
- 条件: 可屏蔽中断 IF 标志为1
- 响应时机: 对于外部中断, 每条指令完成之后检测是否有外部中断信号到来
- 处理过程
- 系统关闭中断
- 转中断处理程序, 保护现场
- 保护完现场后, 根据中断向量到向量表中找到中断处理子例程, 并执行
- 恢复现场开中断
- 查找中断服务子程序
- 中断向量
- 中断描述表(Linux)
时钟管理
- 时钟源
- 实时时钟 CMOS 时钟
- OS时钟: 产生于主板上的定时计数芯片
- 时钟机制
- OS时钟管理硬件
- 按照指定的时间间隔产生时钟中断
- 时钟软件 时钟驱动程序
- 维护日期和时间
- 递减当前进程在一个时间片内的剩余时间
- 对CPU的使用情况记账
- 递减报警计数器
- OS时钟管理硬件
系统调用
系统调用是一群预先定义好的模块, 他们提供一条管道让应用程序或一般用户能够由此得到核心程序的服务
- 系统调用和一般函数区别
- 系统调用运行在系统态/核心态, 一般函数运行在用户态
- 系统调用时要进行中断处理, 多一些开销
- 系统调用类型
- 进程控制类 系统调用: 创建撤销进程, 获得, 改变进程属性
- 文件操纵 类系统调用: 创建删除文件, 打开关闭文件, 读写
- 设备管理类 系统调用: 请求释放设备
- 通信类 系统调用: 打开关闭连接, 交换信息
- 信息维护类 系统调用: 返回系统当前日期, 时间, 内存大小等信息
- 优点: 1.方便编程 2.提高系统安全性
进程同步
在保证多任务共享系统资源的情况下程序能够得到正确的结果
- 临界资源: 必须以互斥的方式访问的共享资源
- 临界区: 进程中访问临界资源的那段代码
同步机制的原则
- 空闲让进: 当没有进程处于临界区时, 表明临界资源处于空闲状态, 因允许一个请求进入临界区的进程立刻进入自己的临界区
- 忙则等待: 已有进程进去临界区时, 其他试图进入的进程必须等待, 保证互斥访问
- 有限等待: 对要求访问临界资源的进程, 应保证在有限时间内能进到自己的临界区
- 让权等待: 申请不到共享资源是应立即释放处理机, 避免进入忙等
进程同步的任务
- 具有资源共享关系的进程, 保障各进程以互斥的方式访问临界资源
- 对具有合作关系的进程, 保障相互合作的各进程协调执行
信号量
整型信号量
整型信号量是表示共享资源状态只能由特殊的原子操作改变的整型量
- 原子操作
- wait
- 没有资源时会 无限loop 死讯环
- signal
- wait
- 实例: linux 自旋锁
代码:
记录型信号量
- s.value 表示资源的数量
- 小于0时, 绝对值表示某资源等待列队中的阻塞进程的数量
- 资源分配完毕后, 后续再申请的进程调用block原语自我阻塞
代码:
var s: semaphore;
s.value = 1;
Begin
Repeat
wait(s);
OP
signal(s);
Until false;
AND型信号量
- 将整个进程在整个运行过程中所需要的全部资源一次性的全部分配给进程
- Swait(s1, s2)
- Ssignal(s1, s2)
管程
管程是 描述 共享资源的数据结构 和 在数据结构上的共享资源 管理程序 的集合, 其中包括变量的定义, 初始化 以及管理共享资源的过程
进程通信机制
| 通信机制 | 分类 | 分类 |
|---|---|---|
| 共享存储器系统 | 基于共享 数据结构 的通信方式 | 基于共享 存储区 的通信方式 |
| 消息传递系统 | 直接通信方式 | 间接通信方式(实时/非实时) |
| 管道通信 | 连接读写进程的一个特殊文件 也称 管道文件 | |
| 消息缓冲列队 |
线程
线程是进程中的一个实体 是被系统独立调度和分派的基本单元 进程是资源分配的基本单位, 线程是调度执行的基本单位
线程控制的基本操作
- 线程创建
- 线程终止
- 线程的调度与切换
- 线程的阻塞与唤醒
系统线程和用户级线程
- 内核级线程切换有内核的线程调度程序完成, 用户级则是由用户线程包中的一个过程完成, 内核级的调度程序运行在系统态, 用户级的调度运行在用户态
- 内核级调度规则和进程调度相似, 用户级调度规则相对简单, 内核级切换慢, 用户级切换快
- 内核级线程进行系统调用只阻塞线程, 用户级线程的系统调用会阻塞线程所属的进程
- 内核级的cpu时间以线程位单位分配, 每个线程可以独享一个CPU时间片, 用户级线程的CPU以进程位单位, 所有线程共享一个CPU时间片
线程控制块
- 线程标识符信息
- 处理机状态信息
- 线程调度信息
- 线程控制信息
线程组织
- 通常使用链接的方式来组织
- 把同一进程中具有相同状态的TCB用指针链接成列队
与进程的关系
- 资源调度
- 线程时程序执行的基本单位, 进程时拥有资源的基本单位
- 地址空间资源
- 不同的进程地址空间是相互独立的, 同一进程中的个线程共享同一地址空间
- 通信共享
- 进程间的通信必须使用操作系统提供的进程间通信模块, 而同一进程的各个线程可以直接读写全局变量来通信
- 并发性
- 多进程间可以并发执行, 多线程也可以并发执行
- 系统开销
- 进程的开销远大于线程的开销
开销对比
- 进程的调度涉及到当前进的CPU环境的保存以及新调度的CPU环境的设置, 线程切换是, 只需要保存和设置少量的寄存器内容, 开销很小
线程的控制
- 创建: 用户级调用线程库中的实用程序, 内核级是由内核完成的
- 终止: 正常结束, 异常结束, 外界干预
- 用户级: 按照线程库的实用程序来调用线程终止原语
- 内核级: 内核调用线程终止原语
- 阻塞: 请求系统服务, 启动某种操作, 新数据尚未到达