进程与线程
进程组织
- 进程控制块 PCB
- 程序段
- 数据段
进程的状态
- 阻塞 运行 就绪
- 开始 结束
状态切换
- 就绪状态 -> 运行状态 : 获得处理机时间片
- 运行状态 -> 就绪状态 : 1. 时间片用完,让出处理机 2. 在可剥夺操作系统中,优先级高的先执行.
- 运行状态 -> 阻塞状态 : 进程等待某一资源的使用或者分配或某一个事件发生,由运行变成阻塞.
- 阻塞状态 -> 就绪状态 : 当进程等待的资源/事件到来. 进程就从阻塞状态变成就绪状态.
处理机调度的层次
- 作业调度(高级调度): 按一定的原则,从外存上处于后备状态的作业中,挑选一个或多个,分配内存等资源.创建相应的进程.让他们获得竞争处理机的机会.
- 内存调度(中级调度): 引入内存调度是为了提高内存利用率和系统吞吐量.那些暂时不能运行的进程,调至外存等待.将其线程状态设置为挂起状态.当内存空间宽松时,通过中级调度选择具备运行条件的进程,将其唤醒.
- 进程调度(低级调度): 按照某种方法或策略,从就绪队列中选取一个进程,将处理机分配给它.
进程的调度算法
- 先来先服务
- 短作业优先
- 优先级调度 (抢占式与非抢占式)
- 时间片轮转
- 高响应比
- 多级反馈队列调度算法
什么是进程
- 进程是运行起来的程序.
- 进程是系统进行资源分配的最小单位. 每个进程拥有独立的地址空间
- 一个进程无法访问另一个进程的数据.若要访问.需要进行进程间通信.
什么是线程
- 进程是系统进行 资源调度 的基本单位.
- 线程是轻量级的进程.它是CPU执行单元.
- 线程是进程的一个实体,是被系统独立调度和分派的基本单位.线程自己不拥有系统资源.它与同属一个进程的多个线程之间共享进程拥有的所有资源.
线程与进程的区别
- 调度上:
- 线程是独立调度的基本单位. 进程是资源拥有的基本单位.
- 同一个进程内的线程切换不会造成进程切换. 不同进程的线程切换会导致进程切换.
- 拥有资源:
- 进程是拥有系统资源的基本单元.而线程不拥有系统资源. 线程可以访问隶属进程的资源.
- 并发性:
- 引入线程后,不仅进程间可以并发执行,线程间也可以并发执行.操作系统拥有更好的并发性.提高了系统的吞吐量.
- 系统开销:
- 由于创建和销毁进程,系统需为之分配或回收资源.如内存.IO设备等. 远大于创建和撤销线程时的开销.
- 地址空间和其他资源:
- 进程间的地址相互独立. 同一个进程的各个线程间共享进程的资源.
- 一个进程至少有一个线程.
- 通信:
- 进程间通信IPC需要 进程同步与互斥来辅助.
- 线程间通信可以直接通过读写数据段来通信.
进程之间私有和共享的资源
- 私有: 地址空间 堆 栈 全局变量 寄存器
- 共享: 代码段 公共数据 进程目录 进程ID
线程之间私有和共享的资源
- 私有: 线程栈 寄存器 程序寄存器
- 共享: 堆 地址空间 全局变量 静态变量
进程间通信 的方式以及优缺点
管道
- 无名管道 : 一种半双工的通信方式,只能用于有亲属关系的进程间(父子进程)
- 优点: 简单方便
- 缺点:
- 局限于单向通信
- 能创建在它的进程以及其有亲缘关系的进程之间
- 缓冲区有限
- 有名管道(FIFO) : 一种半双工的通信方式,可以在无亲属关系的线程间通信
- 优点: 在任何进程间通信
- 缺点:
- 长期存于系统中.使用不当容易出错
- 缓冲区有限
消息队列
- 消息队列,是消息的连接表.存放在内核中.并由消息队列标识符标识.
- 优点:
- 可以实现任意进程间的通信,无需考虑同步问题.
- 消息队列是面向记录的.其中个的消息具有特定格式与优先级.
- 缺点:
- 信息的赋值需要额外消耗CPU时间.不适宜信息量大或操作频繁的场合.
- 优点:
信号量
- 信号量是一个计数器. 用于实现多个进程间的互斥与同步.而不是用于存储进程间通信的数据
- 优点:
- 可以同步线程. 与共享内存配合实现线程间数据传递
- 缺点:
- 信号量有限
- 优点:
共享内存
- 共享内存,指的是多个线程共享的一个给定存储区.
- 优点:
- 无须复制. 最快的通信方式. 因为进程可以直接对内存进行存取.
- 信息量大
- 缺点:
- 需要多个进程协作.需要进程同步.一般与信号量同步.
- 只能同一个计算机内通信,不方便网络通信.
套接字
- 套接字 : 用于不同计算机之间的进程通信
- 优点 : 传输数据时间段.性能高. 可加密
- 缺点 : 需要解析数据 转换
线程之间通信(同步) 方式
临界区 互斥对象 信号量 事件
- 临界区
- 在一个时刻只允许一个线程对共享资源进行访问.
- 互斥量
- 互斥对象和临界区很像! 只有拥有互斥对象的线程才能够对共有资源进行访问.
- 信号量
- 它允许多个线程在同一个时刻访问同一个资源.但是需要限制此类资源的最大数数目
- 事件
- 通过通知操作方式来保持线程的同步,HIA可以实现多个线程优先级比较的操作
锁机制
- 互斥锁(mutex) / 读写锁(reader-writer lock) / 自旋锁(spin lock) / 条件变量 (condition)
- 互斥锁 : 提供了排他方式防止数据结构被并发修改
- 读写锁 : 允许多个线程同时读取数据,而对写操作是互斥的.
- 自旋锁 : 与互斥锁类似,都是为了保护共享资源.互斥相当于资源被占用,申请者进入睡眠状态. 自旋锁则是循环检测保持着是否已经释放锁.
- 条件变量 : 可以以原子的方式阻塞进程.知道某个特定条件满足.对条件的测试是在互斥锁的保护下进行的.条件变量始终与互斥锁一起使用.:
信号量机制
- 无名线程信号量
- 命名线程信号量
信号机制
- 类似于进程间的信号处理
屏障
- 屏障允许多个线程等待,直到所有的线程都到达某一点.然后从该点继续执行
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制
协程
- 是一种 比线程更轻量级的存在. 一个线程可以有多个协程.
- 协程不被操作系统内核管理,完全由程序所控制.
- 协程开销远小于线程; 携程不需要线程切换的上下文开销;
- 协程拥有自己的寄存器上下文和栈. 携程调度切换时,将寄存器上下文和栈保存到其他地方. 切换回来,再进行恢复.
- 每个协程表示一个执行单元. 有自己的本地数据. 与其他共享全局数据和其他资源.
- 不需要多线程锁机制; [为什么?]