进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
系统为参与并发执行的程序配置一个专门的数据结构,称为进程控制块(PCB)用于控制管理进程,程序段、相关数据段和PCB三部分构成了进程映像。
进程映像是静态的,进程是动态的。
PCB是进程存在的唯一标志!
运行态:进程正在处理机上运行,单处理机,每个时刻最多只有一个进程在运行态
就绪态:处于就绪的进程可能有多个,通常排成一个队列,即就绪队列 。仅缺少处理机
阻塞态:又称等待态,进程正在等待某一事件而暂停运行,即使处理机空闲,进程也不能运行
创建态:进程正在被创建,还未转到就绪态。
结束态:进程需结束运行时,首先要置该进程为结束态,然后进一步处理资源释放和回收等工作
就绪态到运行态
运行态到就绪态:处于运行态的进程时间片用完后,让出处理机,转为就绪态
运行态到阻塞态:进程请求某一资源的使用或等待某一事件的发生
阻塞态到就绪态
进程由运行态变为阻塞态是主动行为,由阻塞态变为就绪态是被动行为
进程控制具有创建新进程、撤销已有进程、实现进程状态转换等功能。一般进程控制用的程序段称为原语
进程创建
进程终止
进程阻塞和唤醒
只有处于运行态的进程才可能将其转换为阻塞态
阻塞原语
唤醒原语
进程切换
调度是分配行为,切换是执行行为
操作系统通过PCB来对进程进行控制
程序可被多个进程共享,即多个进程可以执行同一个程序
PV操作是低级通信方式,高级通信方式三类
操作系统提供可共享使用的存储空间和同步互斥工具
要想让两个用户进程共享空间,必须通过特殊的系统调用实现
共享存储中的共享空间变为了缓冲区,只允许一边写入,另一边读出
属于半双工通信
线程是轻量级进程,自己不拥有系统资源。引入线程后,进程只作为除CPU以外系统资源的分配单元,而线程作为处理机的分配单元
线程与进程的比较
线程有利于提高系统并发性,减少了每次切换所需的开销
多线程模型
处理机调度是多道程序操作系统的基础,是操作系统设计的核心问题
需要进程调度
不能进程调度
切换过程
进程调度、切换是有代价的,并不是调度越频繁并发度越高
CPU利用率=忙碌时间/总时间
系统吞吐量=单位时间内完成作业的数量
周转时间=作业完成时间-作业提交时间
等待时间 指进程/作业等待处理机状态时间之和
响应时间 从用户提交到首次产生响应所用的时间
先来先服务算法 选择最先进入队列的
短作业优先 选择完成时间最短的
优先级调度 选择优先级别最高的
高响应比优先调度 选择响应比最高的
时间片轮转调度 总是选择就绪队列中第一个进程,但仅能运行一个时间片
多级反馈队列调度 时间片轮转调度算法和优先级调度算法的综合和发展
一个时间段内只允许一个进程使用的资源称为临界资源
//对临界资源的互斥访问
do{
entry section; //进入区 上锁
critical section; //临界区 实际访问资源的代码
exit section; //退出区 解锁
remainder section; //剩余区
}while(true)
互斥访问需要遵循的原则
违背空闲让进原则
先检查后上锁,但两操作无法一气呵成
由于进程是并发的,可能两个进程同时访问临界区,违反了忙则等待的原则
先上锁后检查
违反了空闲让进和有限等待的原则,可能会产生饥饿
//两个标志
flag[n];
turn=;
在进入区中先主动争取,再谦让,最后检查。没有遵守让权等待的原则
在某进程开始访问到结束访问都不允许被中断。
优点:简单高效
缺点:不适用于多处理机,只适用于操作系统内核进程,不适用于用户进程
是用硬件实现的,执行过程不允许被中断,适用于多处理机环境
检查、上锁一气呵成
不满足让权等待
跟TSL逻辑一样
所有方案都无法实现让权等待的功能
信号量是一个变量(可以是一个整数,也可以是更复杂的记录型变量)
对信号量的操作只有3种:初始化,P操作,V操作
整型信号量
检查、上锁一气呵成,避免了并发、异步导致的问题。不满足让权等待,会发生忙等
记录型信号量 (超高频考点)
可以用记录型信号量实现进程互斥、进程同步
typedef strcut{
int value;
strcut process *L;
}semphore;
void wait(semphore S){
S.value--;
if(S.value<0){
block(S.L);
}
}
void signal(semphore S){
S.value++;
if(S.value<=0){
wakeup(S.L);
}
}
信号量机制实现互斥
信号量机制实现同步
信号量机制实现前驱关系
原文:https://www.cnblogs.com/1012wenquan66/p/14054887.html