第二章 进程与线程
2.1 进程
- 进程模型
- 计算机上所有可运行的软件被组织成进程
- 多道程序设计即为CPU快速在多个进程之间切换
- 创建进程
- 创建
- 系统初始化
- 执行了正在运行的进程所调用的进程创建系统调用
- 用户请求创建新线程
- 一个批处理作业的初始化
- 新线程的创建都是由于已存在的线程执行系统调用(fork)
- 创建
- 进程终止
- 正常退出
- 出错退出
- 严重错误
- 被其他进程杀死
- 进程的层次结构
- 所有进程的地位相似
- 父进程得到句柄,可以控制子进程,也可以把句柄给其他进程
- 进程的状态
- 进程有自己的程序计数器和内部状态
- 运行态
- 就绪态
- 阻塞态
- 进程有自己的程序计数器和内部状态
- 进程的实现
- 为了实现线程模型,操作系统维持着一张表格(一个结构数组),即进程表,每个进程占其中一项
- 程序计数器
- 堆栈指针
- 内存分配所打开文件的状态
- 账号和调度信息
- 中断(入口:中断向量)
- 硬件储存旧堆栈程序处理器,加载新的
- 汇编保存旧寄存器,设置新寄存器
- C中断服务例程运行
- 调度程序决定下一个进程
- C返回
- 汇编运行新进程
- 为了实现线程模型,操作系统维持着一张表格(一个结构数组),即进程表,每个进程占其中一项
- 多道程序设计模型
2.2 线程
- 线程的使用
- 优点
- 线程的使用使多种应用发生的活动更简单效率
- 线程比进程更轻量级
- 提高性能
- 有限状态机
- 优点
- 经典线程模型
- 用某种方法把相关资源集中在一起
- 进程拥有一个执行的线程:堆栈指针和程序计数器被切换就可以切换到新线程
- 程序计数器
- 寄存器
- 堆栈
- 一个进程中的多个线程共享地址空间和全局变量
- 线程的状态
- POSIX线程
- 在用户空间中实现线程
- 内核对线程一无所知,将其看作一个单线程进程
- 优点
- 用户线程包可以在不支持多线程的操作系统上实现
- 允许每个进程制定自己的调度算法
- 缺点
- 发生故障后有可能影响到整个进程
- 在内核中实现进程
- 创建或撤销线程的代价比较大,一般采用线程回收
- 混合实现
- 使用内核级线程,然后将用户级线程与某些全部内核线程多路复用起来,非常灵活
- 调度程序激活机制
2.3 进程间的通信
- 竞争条件
- 两个或多个进程读写某些共享数据,最后结果取决于运行的精确时序
- 临界区
- 互斥以某种手段确保一个进程在使用一个共享变量或文件时,另一个进程不能进行同样操作
- 临界区:对共享内存进行访问的程序片段
- 避免竞争条件
- 任何两个进程不能同时处于临界区
- 不应该对CPU的速度和数量做任何假设
- 临界区外运行的进程不得阻塞其他进程