操作系统是四类资源管理者
- 处理机管理
- 存储器管理
- 设备管理
- 文件管理
最基本的基本操作系统类型
- 多道批处理系统
- 分时系统
- 实时系统
资源共享方式
- 互斥共享方式:一个时间内只允许一个进程访问
- 同时访问方式:允许多个进程访问
并行性:多个事件在同一时刻发生
并发性:多个事件在同一时间间隔内发生
进程结构:PCB(process controller block进程控制块),程序段,数据段
信号量
1.整型信号量
用一个整型的数值S记录资源数目
wait(S){
while(s<=0);
s=s-1
}
signal(s){
s=s+1;
}
2.记录型信号量
有两个数据项,数据结构描述为
typedef struct{
int value; //记录可用资源的个数
Struct process *L; //当value<=0时,将阻塞的进程存到L中,从而达到阻塞的进程不占用cpu的目的
}semaphore;
记录型信号量的PV操作:
wait(semaphore S){
S.value--;
if(s.value<0) S.L.add(this); //将该进程加入到阻塞队列中
}
signal(semaphore S){
S.value++;
if(S.value<=0){
S.L.remove(someprocess tmp); //从队列中弹出一个阻塞进程
tmp.wakeup(); //唤醒该进程
}
}
3.AND型信号量
数据结构和记录型信号量相同
PV操作:
与记录型信号量不同的是在wait中加入AND条件,又称AND同步或同时AND操作:Swait
SWait(S1,S2,...Sn){
if(S1>=1 and ...Sn>=1){
for(i=1:n){
Si=Si-1
}
}
else{
将该进程放入等待队列并将程序计数器置于Swait操作的开始位置上
}
}
Ssignal(S1,S2,...Sn){
for(int i:n){
Si=Si+1;
}
将等待队列中所有进程激活
}
调度
调度算法
-
FCFS(First come first server) 先来先服务算法
有利于长作业(进程),而不利于短作业(进程)
有利于CPU繁忙型作业(很少使用I/O ),不利于I/O繁忙型
-
短作业优先法(SJF):从后备队列中选择一个或若干个估计运行时间最短的算法调入内存运行
-
短进程优先算法(SPF):从后备队列中选出一估计运行时间最短的进程,分配处理机使它立即执行到完成或阻塞,再重新调度
SJ/PF算法的缺点:
- 对长作业不利.如果有一长作业在后备队列中,但是总是优先调度那些短作业,将导致该作业长期不能执行
- 未考虑作业的紧迫程度
- 作业的长短完全是用户决定的,所有估计执行时间而定的不一定能真正达到短作业优先
-
非抢占式优先权算法
先执行优先权最高的到该进程执行完或阻塞后再选择下一个进程
-
抢占式优先权算法
实时监控就绪队列,当出现优先级更高的进程时,就重新将处理及分配给新的优先权最高的进程
比较合理的算法:
-
高响应比优先权调度算法
引用动态优先权,并使作业优先级随着等待时间的增加而以速率a增高
该优先权的变化规律为:
优先权=(等待时间+要求服务时间)/要求服务时间
优先权=响应比=响应时间/要求服务时间
响应比就是优先权
-
多级反馈队列调度算法
(1) 为多个就绪队列赋不同的优先级:
- 第一个队列的优先级最高其余逐个降低
- 各队列中进程执行的时间片也不同,优先级越高的队列中时间片越小
(2) 新进程进入内存后,首先放入第一队列的末尾,按FCFS原则等待调度执行时,如果能在时间片内完成,便准备调离系统,如果未完成,就放到第二队列的末尾…
(3) 仅当第1~(i-1)队列都空时,才会调度第i队列中的进程运行,如果正在执行第i队列的中的某个进程时又有新的进程进入优先权高的队列中时,新进程将抢占处理机,即由调度进程把正在运行的进程放回到第i队列的末尾,然后把处理机分配到新的高优先权进程
优先权的类型
- 静态优先权:优先权从初始(创建进程时确定)开始一直不变
- 动态优先权:可以动态的改变,一般时随进程推进或等待时间而增大
确定优先权依据
- 系统进程应该高于用户进程
- 资源占用少的应该高于资源占用多的
- 用户需求
分区分配算法
在空闲分区中找一个适合的地方给请求者分配内存
-
首次适应算法FF
- 空闲分区链以地址递增的次序链接
- 从链首开始查找,知道找到一个大小能满足要求的空闲分区为止,再按作业的大小,从该分区中划出一块内存给请求者,余下的空闲分区仍留在空闲链中.如果找一遍找不到就返回失败
-
循环首次适应算法(首次适应算法会导致高地址内存的利用率比较高)
每次从上次找到的空闲区的下一个分区开始查找(满足分配均匀)
-
最佳适应算法
将所有空闲分区按其容量从小到大的顺序形成一个空闲分区链,第一次找到的空闲去必然是最佳的
分页请求管理
- 在分页系统的基础上,增加了请求调页功能,页面置换功能所形成的页式虚拟存储系统
- 它允许只转入若干页(而非全部程序)的用户程序和数据,便可启动允许
- 再通过调页功能即页面置换功能,陆续的将即将要允许的页面调入内存,同时把灾难不运行的页面换出到外存上,置换时以页面为单位
请求分页的页表机制
基本作用是将逻辑地址变换为物理地址,在页表中再增加若干项,供换入换出时参考:状态位
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
---|---|---|---|---|---|
用来标志该页面是否在内存 | 用来记录本页在一段时间内被访问的此时,或记录本页最近已有多长时间没被访问,供换出页面时参考 | 该页面调入内存后是否被修改过,如果修改过,要在外存中重写 | 用于存放该页在外存中的地址,便于调出 |
缺页中断机构
请求分页系统中每当索要访问的页面不在内存时,便要产生缺页中断,请求将所缺之页调入内存
与一般中断的区别:
- 在指令执行期间产生和处理中断信号
- 一条指令在执行期间,可能产生多次缺页中断
内存分配的三个问题
抖动:内存中频繁的换入换出
-
最小物理块数
- 能保证程序正常运行所需的最少物理块数.若系统为进程分配的物理块数少于此值时进程将无法运行
- 最少物理块数与计算机硬件结构有关,取决于指令的格式,功能和取址方式
-
物理块的分配策略
-
固定分配局部置换:为每个进程分配一固定页数的内存空间且在整个内存空间不改变,如果却页就从该进程中的页面中选出一页再调入一页
缺点:为每个进程分配多少个面的内存难以确定,若太少会导致频繁的换入换出(抖动);如果分配太多,会使内存中进程数减少,会造成CPU和其他资源的浪费
-
可变分配全局置换:先给每个进程分配一定数目的物理块,OS保持一个空闲的物理块队列,缺页时从空闲的物理块队列中取出一个分配给进程,并将欲调入的缺页装入其中,当物理块队列为空时从内存中选一页调出
!全局指的是系统给的全局物理块队列
-
可 变分配局部置换:局部是指从自身进程的页面中选出一页进行换出,如果频繁缺页中断,就再分配一个物理块
-
-
物理块的分配算法
- 平均分配算法:将系统中所有可供分配的物理块,平均分配给各个进程
- 按比例分配算法:根据进程的大笑按比例分配物理块的算法,