绪论
操作系统的作用:
1. 作为用户与计算机硬件系统之间的接口:三种方式:图标-窗口、系统调用、命令行。
2. 作为系统资源的管理者:四类系统资源:处理机、存储器、I/O设备、文件,
分类:
1. 单批道:由Monitor监管下的对作业控制权的不停转移,以“批”为单位,连续作业,但资源利用率低。
2. 多批道:提高资源利用率,后备作业队列,调度算法,共享资源,利用CPU空挡时间。
3. 分时:人机交互,用多路卡(分时多路复用)周期性扫描终端>>及时接收;时间片轮转调度>>及时处理。
4. 实时系统:及时反馈,多媒体信息处理,票务查询系统等。
基本特征:
1.Concurrence:宏同微异,在同一时间间隔内执行;
2.Sharing:由于限定资源的访问时间,访问地点,存在竞争访问,需要系统管理:同时共享与互斥访问。
3.Virtual:在用户端上,时分复用虚拟>>并发执行带来单位时间内多方处理,空分复用>>虚拟存储。
4.Asynchronism:由于等待阻塞等原因多个进程在有限处理机下的交替执行,“走走停停”地完成。
进程控制
顺序执行:①顺序性:A结束B开始,B结束C开始..;②封闭性:运行时独占资源,执行结果不受外界影响;③可再现性:重复执行,结果一致。
并发执行:①间断性:程序由于依靠并发程序的结果产生暂停;②失去封闭性:多个程序共享资源;③不可再现性:结果不一致;
进程状态:
1. Ready:就差CPU了,存在就绪队列;
2. Running:执行中;
3. Block:如I/O申请失败等原因暂停执行,存在阻塞队列。
PCB(最重要的记录型数据结构)
PCB中的记录包含状态,中断时的现场信息,要求资源清单,同步信号量等作为独立单位的信息,供OS查询分配。
进程同步(对多个进程进行次序协调,达到可再现性)
信号量机制
整型:
wait(S){
while(S<=0); //不断测试是否有一个资源恢复可用,不然就一直执行循环S--;
}
signal(S){
S++;
}
记录型:
typedef struct{
int value;
struct pcb *list;//想访问此资源的进程链表指针
}semaphore;
wait(semaphore *S){
S->value--;
if(S->value<0) block(S->list);//若是给占没了value的绝对值就成了等着的进程数
}
signal(semaphore *S){
S->value++;
if(S->value <= 0) wakeup(S->list);//要是小于零就是还有进程在等着,赶紧唤醒
}
“AND”型(避免死锁):
AND条件体现在对一个进程要求的多个资源须同时分配,即同时满足S>=1;
信号量集(扩充“AND”设置资源分配下限)
进程通信:
1. 共享存储器:在内存中划出共享区域,各进程对其读写进行进程间通信;
2. 管道通信:存在读进程与写进程间的管道文件,需要互斥与同步协调;
3. 消息传递系统:以格式化消息传递;
4. C/S系统:Socket;
线程(为把调度分派与资源开销分开来,线程切换代价更小)
处理机管理
1. 长程调度:作业调度,从外存的后备队列中挑选作业进行进程创建、资源分配等;
2. 短程调度: 进程调度,从内存的就绪队列中使部分进程进入执行态;
3. 中程调度: 从内存对换出暂时不用的进程至外存,提高内存利用率。
常见调度算法
①FCFS:先来先服务,经常与其他算法结合使用;
②SJF:短作业优先;
③HRRN:高响应比优先调度,根据多个参数计算出动态优先级;
④多级反馈队列:多个就绪队列,优先级递减,时间片递增,允许抢占。
死锁
1. 竞争不可抢占资源;
2. 竞争可消耗性资源;
3. 进程推进顺序不当;
必要条件
1. 互斥条件:临界资源的单独访问;
2. 请求和保持:已占用了还想占;
3. 存在不可抢占资源;
4. 循环等待;
常用死锁的避免
银行家算法:
尚需资源数 = 预设最大需求书 - 已分配资源数;
对每次进程请求的资源数做判断是否满足上式的尚需资源数目,若符合则分配相应资源,调整数据结构的值,然后执行安全检测算法;
即对每个历史进程分配的资源数进行统计并标记直至每个历史进程都有运行完成的资源数,则当下为安全状态;
存储器管理
程序的装入:编译器编译源程序>>若干module>>由链接器把一组组模块以及所需库函数链接成完整的装入模块>>由装入程序装入内存;
静态可重定位装入:编译后的module一般是从0开始,一般用户作业调用程序的地址也是逻辑地址(从0开始)而此时在内存中的0始址一般都被占了,所以需要采用可重定位装入;
动态可重定位装入:在对换存在下,内存中的程序经常改变,需推迟重定位至执行前;用重定位寄存器存储一个偏移量,用户访问逻辑地址时内部加上这个值就是物理地址;
连续分配存储管理方式(为程序分配挨着的连续空间)
1. 固定分区(相等或不等的固定分区);
2. 动态分区,依次检索空闲分区表(链表)找出与请求大小匹配的分区分配并修改表(链表); 回收分区则是前后挨着空闲分区则合并否则在表(链表)上新建分区;
顺序搜索动态分区算法:
1. First fit:找到一个能装下的就停;
2. Next fit: 为减少每次查找从第一个开始的开销,设置起始指针,下次由此开始;
3. Best fit:以容量递增,找个最小适应的;
4. Worst fit:找最大的。
分页储存(地址单位标准化)
Note:即使页被统一为标准单位但内部仍有地址,例如1kb的页面地址为0~1023,即页内地址,其与物理块内地址为一一对应关系,因此对于地址变换机构(页表)来说,无需考虑内部地址的转换,只涉及页号到块号的转换。
由于指令转换频繁,须有单一寄存器加内存的页表实现,即平时储存在PCB里的页表始址与长度在进程被访问时被存进寄存器里其两者乘积与页号相加从页表查询得到块号进而得到物理地址。由于页表以及物理块的两次访问内存的较大开销,可利用缓存快表存放近期使用的页表项。
虚拟存储(请求调入、置换,从逻辑上扩充内存,建立在离散内存分配基础上)
请求页表(仍然在内存):
增加了四个页表项:是否已调入内存位P,若发现此位为0则请求缺页中断,供置换算法参考的最近访问次数位A,是否被修改位M,用来判断是否需要备份到外存(因为外存要时刻备份内存的copy,修改过的话要立即备份)以及外存物理块号位;
!缺页中断是立即执行的;
页面置换算法:
1. LRU(Least Recently Used):根据页面调入内存后的使用频率做对未来使用频率的近似。
2. Clock置换算法:将内存页面串成循环队列,循环检查各页面访问位,0就换,1就下一个;
工作集的概念:单位时间内,进程实际所需要访问的页面集合(过去单位时间内访问的页面集合)
“抖动”(大量进程频繁缺页导致CPU效率降低)的预防:
1. 局部置换,缺页时候置换缺页进程的内存页,即使“抖”了也不对其他进程产生影响;
2. 工作集算法,调入新的进程前预先检查每个进程预留的内存页,多可以调入否则先分配物理块;
3. 选择性暂停,根据缺页率把低的进程先换出去腾地方给高的进程。
输入输出系统
Adapter模式的应用:I/O设备经过与设备控制器的信号转换,才能到CPU执行相应指令;
设备控制器
由与处理机接口,I/O逻辑,和与设备接口三部分组成。
1. 轮询:反复查询状态位看是否完成打印输入,完成了则进行读取,进内存等操作;
2. 中断:需要I/O时候想设备控制器发一个指令然后回来继续干刚干的,即Cpu与I/O设备并行执行,之后读完了或者写完了在发个中断给Cpu,再执行排错等指令;
3. DMA(Direct Memory Access)直接存储访问:从中断的以字节为单位到以数据块为单位,存在DMA控制器,所传输的数据由其控制直接进出内存,无需CPU进行额外干预;
4. I/O通道:又从以单个数据块为单位发展为以一组数据块为单位,I/O通道也可以与设备和Cpu并行执行,可以理解为I/O的Cpu。
关于中断
!中断处理:(Cpu是在处理完当前的单位指令才去处理中断的,虽然对于进程来说可能是正进行至一半)保护被中断进程的CPU环境,包括处理机状态字,PC下一条指令的地址,寄存器内容等统统被压入栈中;
多源中断处理办法:
1. 屏蔽其他中断;
2. 嵌套中断,中断优先级。
用户层I/O
Spooling(假脱机):存在进程与I/O设备之间的输入输出缓存,即输入井输出井(磁盘上的两块独立划分的区域),这样在用户端任务就显示为执行中虽然真正情况是在队列中等待输入输出,即实现了设备虚拟。
文件与磁盘管理
文件的打开关闭操作:属于系统调用,把该文件的属性从外存拷贝到内存上,即与用户建立连接;
FAT:文件分配表,在每个分区(c盘、d盘...)有两张同样的,在每个FCB上有FAT的文件始址之后在FAT里通过链接一个个盘块完成对一个文件的组成。
增量式索引:对于大中小文件的存储分别采用,多级索引,单级索引,FCB直接索引等方式(unix v)。
位示图:用来表示外存上哪些盘块是可分配的(空闲的),基本可理解为二维数组,涉及盘块号转换,分配,回收;
成组链接法:对空闲盘块分组,每组1~n-1个盘块在空闲盘块号栈里对应存储,n(第一个盘块)为下一个栈(n+1开始)的索引链接,一直这样链到最后一组空闲盘块。
单级目录:单个表标注每个文件的各个属性,查找慢,不允许重名。
两级目录:每个用户拥有自己的UFD空间,下有子目录。