一、进程基础
1.进程概念
当多道程序进入内存时,操作系统为方便管理这些程序为每道进程都创建了一个PCB来描述这些程序的管理信息。
2.进程组成
3.进程的特征
4.进程的状态转换(重点!)
5.进程控制相关原语
原语是原子性的(不可中断)!
靠开中断以及关中断完成
原语的功能:
1.更新PCB中的信息包括(修改进程状态标志、将运行环境保存至PCB,将PCB恢复至运行环境)
2.将PCB插入合适的队列
3.分配/回收资源
6.进程通信
6.1共享资源
6.2管道通信
6.3消息传递
二、线程基础
1.线程概念
线程也就是轻量级进程,线程是程序调度(执行流)的最小单位(进程是资源分配的最小单位)
1.1用户级线程
1.2内核级线程
1.3组合实现(重点!)
1.3.1多线程模型
三、调度
1.调度的概念
狭义上来说:调度指的是从就绪队列选择一个进程的这个过程
广义上来说:调度指的的选择加上切换过程
区别:
作业调度:将外存中的进程调入内存
进程调度:将内存中就绪队列的进程调入运行(分配CPU)
2.调度的三个级别
3.调度算法指标
- CPU利用率: 忙碌时间/总时间
- 吞吐量: 总共完成多少道作业/总共花费的时间(单位:道/秒)
- 带权周转时间:周转越短、实际越长越好
- 等待时间:周转-运行-i/o操作
4.调度算法
图例:
4.1 FIFO(先到先服务)非抢占
4.2 SJO(短作业优先)默认非抢占/抢占
周转时间: | p1:16-0=16 | p2:7-2=5 | p3:5-4=1 | p4:11-5=6 |
---|---|---|---|---|
带权周转时间-》周转/运行 | p1:16/7 | p2:5/4 | p3:1/1 | p4:6/4 |
等待时间 | p1:16-7=9 | p2:5-4=1 | p3:1-1=0 | p4:6-4=2 |
平均带权周转时间 | 带权周转时间之和/作业总数 | |||
平均等待时间 | 等待时间之和/作业总数 |
4.3 HHRN(高响应比优先算法)非抢占
4.4对比
4.5 RR(时间片轮转)抢占
注1:
若时间片结束后进入就绪队列与新进程进入就绪队列同时发生,优先后者
注2:
若时间片过大:会导致算法退化成FIFO;
若时间片过小:会导致频繁的切换进程浪费资源
4.6 优先级调度算法(非抢占/抢占)
抢占式:
注:
操作系统会偏向I/O繁忙型进程,不偏向CPU繁忙型进程;因为优先I/O可以尽早的让I/O设备投入工作,增大系统的吞吐量、效率等等
4.7 多级反馈队列
四、经典题型:
1.读者写者问题:
Sempahore rw = 1; //读写临界区的互斥
int count = 0;
Sempahore mutex = 1;
Sempahore w = 1;
//读者优先,写者可能会饿死
//写者优先,写者与读者由同等的优先级
写者:
//V(w) //写者优先
P(rw);
写
V(rw);
//P(w) //写者优先
读者:
//P(w) //写者优先
P(mutex)
count++;
if (count==1){P(rw)};
V(mutex)
//V(w) //写者优先
读
P(mutex)
count--
if(count==0){V(rw)};
V(mutex)
2.哲学家就餐问题
int[5]{1,1,1,1,1} person;
int[5]{1,1,1,1,1} util;
person[i]:
if(i!=4){
if(i%2==0){ P(i+1);P(i);}//偶数先拿左边的筷子
else{P(i);P(i+1);}//奇数数先拿右边的筷子
}else{P(0);P(4);}
五、死锁
1.死锁的概念
1.1死锁、饥饿、死循环的区别
1.2死锁产生的必要条件
2.预防死锁
3.避免死锁
3.1安全序列
安全状态:分配资源后只要能找到一个安全序列的状态就叫做安全状态
不安全状态:找不到任何安全序列
== 不安全状态下没有发生资源请求就不是死锁,并且若此时有资源释放可能会回到安全状态下==
3.2银行家算法(重点!)
3.2.1算法概念
3.2.2算法流程及其具体实现
//1.获得对应需要的5个数组
int[][] allocation = Arrayss.getAllocation(); 进程已分配资源
int[][] max = Arrayss.getMax(); 进程最大需求资源数
int[][] need = max - allocation; 进程还需要的资源数
int[][] available = Arrayss.getAvailable(); 可分配的资源数
int[][] request = Arratss.getRequest(); 进程请求的资源数
//2.判断请求数组是否虚假报数
if(request<=need){↓}else{阻塞}
//3.判断可分配资源是否大于请求资源
if(available>=request){↓}else{阻塞}
//4.假允许请求,判断请求后是否为安全状态
allocation += request; 进程已分配资源更新
need -= request; 进程需要资源更新
available -= request; 可分配的资源数更新
if(availavle > any need){↓}{剥夺这次更新,并返回阻塞该请求}
//5.安全状态,等待下次请求或资源释放,放回第二步