目录
1.进程与线程
进程
- 进程是资源分配的基本单位。
- 进程由程序段、相关数据段、PCB三部分构成进程映像(进程实体)
- 进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,
- 所谓的创建进程和撤销进程,都是指对 PCB 的操作。
线程
- 线程是独立调度的基本单位。
- 线程由线程ID、程序计数器、寄存器集合和堆栈组成。
- 一个进程中可以有多个线程,线程不拥有系统资源,但可与同属一个进程的其他线程共享进程资源。
- 例如浏览器一个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。
区别
Ⅰ 拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
Ⅱ 调度
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
Ⅲ 系统开销
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
Ⅳ 通信方面
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。
2.进程状态的切换
- 创建态:进程从无到有
- 如终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求
- 终止态:进程从有到无
- 正常结束、发生异常、外界干预
- 就绪状态(ready):得到了所有运行时需要的资源,等待CPU控制权
- 运行状态(running):获得CPU控制权,执行
- 阻塞状态(waiting):等待其他资源
注:
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。
- 就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。
- 进程的阻塞是进程自身的主动行为
3.进程通信
进程同步与进程通信很容易混淆,它们的区别在于:
- 进程同步:控制多个进程按一定顺序执行;
- 进程通信:进程间传输信息。
进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
共享存储
- 允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。
- 共享存储分为两种
- 低级:基于数据结构
- 高级: 基于存储区
- 操作系统只负责为通信进程提供可共享的存储空间和同步互斥工具,数据交换由用户自己安排读写指令
- 需要使用信号量用来同步对共享存储的访问。
消息传递
- 通信进程之间不存在可直接访问的共享空间,进程通过系统提供的发送消息和接受消息两个原语进行数据交换
- 分两种:
- 直接通信方式:直接把消息挂到接收进程的消息队列
- 间接通信方式:挂到某个中间实体,接收进程栈实体接受消息,类似电子邮件
管道通信
- 管道是用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件
- 是一个固定大小的缓冲区,容量大小通常为内存上的一页,大小不受磁盘容量大小的限制。
4.线程的实现方式
用户级线程
用户级线程中有关线程管理的所有工作由应用程序完成,内核意识不到线程的存在。
内核级线程
内核级线程中线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码内核为进程级内部的每个线程维护上下文信息。
组合方式
一个应用程序中的多个用户级线程被映射到一些(小于等于用户级线程的数目)的内核级线程上。
多线程模型
系统同时支持用户级线程和内核级线程,因此产生多线程模型来实现用户级线程和内核级线程的连接方式。
- 多对一
- 多个用户级线程映射到一个内核级线程,线程管理在用户空间进行
- 优点:线程管理在用户空间进行,效率高
- 缺点:一个线程使用内核服务时被阻塞整个进程都阻塞,多个线程不能并行地运行在多处理机上。
- 一对一
- 每个用户级线程都需要创建一个内核级线程
- 优点:并发能力强
- 缺点:开销大
- 多对多
- n个用户级映射到m个内核级线程
5.调度
调度的层次
- 作业调度/宏观调度/高级调度:
- 对外存上的作业进行选择,对选择的作业分配资源、建立进程
- 作业执行完毕时回收资源
- new、exit
- 长期
- 交换调度/中级调度/内存调度:
- 将处于外存交换区中的就绪状态或等待状态的进程调入内存
- 或把处于内存就绪状态或内存等待状态的进程交换到外存交换区
- ready suspend、Blocked Suspend
- 中期
- 进程调度/微观调度/低级调度:
- 选取一个处于就绪状态的进程占用处理机,之后,进行上下文切换以便建立与占用处理机进程相适应的执行环境。
- ready、running、blocked
- 短期
调度方式
- 非剥夺:先干着,主观上干不了了再换(完成/进入阻塞态)
- 剥夺:有更牛逼的出现你随时滚蛋
- 优先权、短进程优先、时间片
调度准则
- CPU利用率
- 系统吞吐量
- 周转时间
- 作业完成-作业提交
- 等待时间
- 响应时间
典型的调度算法
- 先来先服务 FCFS
- 不可剥夺
- 对长作业有利、对短作业不利
- 有利于CPU繁忙型、不利于IO繁忙型
- 短作业优先 SJF
- 对长作业不利,饥饿
- 不保证急迫性
- 平均周转时间、平均等待时间最少
- 优先级调度
- 非剥夺、剥夺
- 静态优先级、动态优先级
- 系统进程 > 用户进程
- 前台 > 后台
- I/O > 计算型
- 高响应比优先
- 响应比=(等待时间+要求服务时间)/要求服务时间
- FCFS和SJF的平衡
- 等待时间相同,要求服务时间越短响应比越高,有利于短作业
- 要求服务时间相同,等待时间越长响应比越高,FCFS
- 时间片轮转调度
- 剥夺式
- 为多个用户能够及时响应
- 多级反馈队列
- 牛逼
- 第二级的时间片比第一级长一倍
6.同步和互斥
p原语
void wait(semaphore S)
{
S.value--;
if(S.value<0)
{
add this process to S.L;
block(S.L);
}
}
v原语
void signal(semaphore S)
{
S.value++;
if(S.value<=0)
{
remove a process P from S.L;
wakeup(P);
}
}
- 同步:
- 某个行为要用到某种资源就在这个行为前面P一下
- 某个行为提供某种资源,就在后面V一下
- 同步信号量初值为可用的资源数
- 信号量K>0,表示还有k个可用资源
- 信号量K<0,表示有|k|个进程等待该资源。
- 互斥:
- 用之前p用之后v
- 互斥信号量初值为1