导论
1.定义操作系统:
操作系统是一直运行在计算机上的一些程序的集合,用于管理计算机的内部资源。主要解决CPU,内存空间,文件储存,IO设备以及作业管理功能。
2.并发与并行:
两个或多个活动在同一给定的时间间隔中进行称之为并发,并行一定是同时运行,但是并发不一定,他可以在一个时间间隔内做完一定的任务就可以了(两个任务来回切换)。
并发:某时间段多个程序都可以被执行;
并行:某时刻多个程序同时运行。
3.中断:
硬件通过中断的形式传给CPU信息,产生中断向量,执行中断程序。有外中断和内中断,一般内中断可以看成是CPU的自陷。
中断过程:
1.获取中断类型码,获取哪类中断;
2.保存CPU现场(通过PCB进程控制管),执行中断;
3.恢复现场。
4.数据交换过程:
下面是cpu和内存交换数据以及内存和硬盘交换数据的过程,其中通过RAM实现随机存取存取器,进而才能够实现cpu和内存的数据交换,在这个过程中一定要保持数据的一致性:(cache缓存区用于提高数据交换的速率)
1.写的时候将cache和RAM里面的数据全部改完;
2.数据从cache里面出来的时候将两个的数据交换。
CPU<--->cache<--->RAM<--->Disk
5.DMA结构
每块只产生一个中断来驱动设备告知I/O已经完成,提高了I/O的效率。
多道程序设计
1.作业的四个状态:
提交------>>后备------->>运行(宏观运行)------->>终止
多道程序设计中,不用等待I/O设备,提高吞吐量。
2.分时系统(主机周围连接多个中端,按时间链共享主机资源)
及时性,多路性,交互性,可靠性;
及时性就是减小响应时间(提交之后到首次响应所需要的时间),影响响应时间的是用户数和时间片,其中时间片的最小值大于中断处理时间。
3.实时系统
实时系统是一种专用系统,同时也拥有及时性,多路性,交互性,可靠性,它有严格的计时要求。
4.双模式操作系统
用户模式 用户只能执行非特权指令
系统模式 特权指令,I/O,定时器,中断管理
模式位存储在PSW(存储程序状态,就像标志寄存器)
进程
1.进程的定义
1.动态程序;
2.短暂存活;
3.进程=程序+数据+pcb;
4.进程包含多个程序;
5.程序对应多个进程。
其中进程可以分为CPU型进程的I/O型进程;
2.进程创建
(1)父进程创建子进程;
(2)系统自动创建;
(3)用户创建进程。
创建过程:
作业调度---》申请PCB,内存----》填写PCB----》进入Ready
4.进程之间的通信
(1)消息传递 send,recieve通过直接通信和间接通信完成
一堆进程之间可以有多个通信link,link可以是单向的也可以是双向的;
非阻塞:接受者阻塞,直到发送来的信息可用;
阻塞:发送进程发送完消息之后再继续。
(2)共享内存
生产者和消费者共享一定的内存,发送者不断发,接受者不断取;
CPU调度
CPU调度时间一般不超过8ms。
1.CPU调度算法的参考
CPU使用率,吞吐量,周转时间(后备等待,ready,waiting时间),等待时间,响应时间。
2.处理机调度算法
(1)先来先服务
先进入Ready队列的进程先被调度
(2)最短作业优先
分为抢占和非抢占方式,按照时间最短的进程先调度的算法来实现;
(3)优先级算法
给每个进程赋予优先级,按照优先级大小进行调度,分为抢占和非抢占式;
(4)时间片轮转算法
时间片通常为10-100ms
用完时间片或运行结束的时候退出CPU;
(5)多级队列
前台队列与后台队列(分两个队列来调度CPU),前台队列调用频率更高,优先级更高;
(6)多级反馈队列
1.多个队列不同优先级,优先级从高到低,时间片从短到长;
2.从最高优先级调度,如果运行完成则出队列,未完成则降一级;
3.最高级为空才可转次一级进行运行;
4.若在最高级队列里来了新进程,可以分为抢占式和非抢占式,抢占式(正在运行的进程回原队对尾)。
三大经典同步问题
分析步骤:
1.共享变量需要信号量;
2.确定制约关系,通过信号量来描述制约关系;
3.首先确定所有的人的动作,列出动作,确定每个动作所需要的先决条件(所需要的资源),确定每个先决条件的信号量。
(1)生产者与消费者问题
分析:1.生产者和消费者对于内存空间的访问有共享,通过metux来实现对于内存空间访问的制约,只能有一个人来访问内存空间;
2.生产者和消费者之间都有制约关系,以及多个生产者和生产者之间也存在制约关系;生产者之间的制约关系已经通过metux来实现,生产者和消费者之间的关系通过两个信号量来描述内存空间的剩余个数以及内存空间剩下的个数;
3.生产者的动作是生产Buffer,先决条件是得到metux和empty有值(有空的位置);消费者的动作是消费Buffer,先决条件是metux和full有值(有位置填了东西)。
(2)哲学家进餐问题
1.每根筷子都是另解资源所以可以通过五个信号量chopsticks[5]来进行操作;
2.每两个哲学家之间都有制约关系,可以通过chopsticks来表示;
3.每个人的操作是进餐,同时得到两个筷子才能进餐。(但是有死锁,可以通过解决死锁问题来解决)
(3)读者-写者问题
略
解决信号量问题的步骤
1.了解有多少个临界资源,给每个临界资源创建一个信号量;
2.了解不同的进程需要做的动作是什么,并且做出此类动作之前需要哪些临界资源;
3.了解制约关系,更好寻找做出动作之前需要的临界资源。
死锁
1.死锁产生原因
(1)进程推进顺序不合理;
(2)资源不足;
2.死锁的四个必要条件
(1)有互斥资源;
(2)等待并占有;
(3)不可抢占条件;
(4)形成环路等待。
3.互斥和同步的区别
解决方式分别互斥和同步问题
互斥:只允许一个访问者对其进行访问,单互斥无法限制资源使用顺序,解决互斥问题的方式是P/V之间的出现是配对的;
同步:通过其他机制实现访问者对于资源的有序访问,特别是写入资源一定是互斥的,解决同步问题的方式是P/V不配对的。
4.解决死锁问题的方式
(1)预防死锁
<1>破坏占有并等待
一次性资源分配;
<2>破坏环路
资源按照类型编号,按照一定顺序进行资源的申请。
(2)死锁避免
死锁避免算法在资源分配的时候执行
银行家算法:
安全状态:现有情况能找到一个安全序列
安全算法:
1.work和finish是长度为m和n的向量;(n表示进程数量,m表示资源数量)
work i=avilable i;Finish i=false;(对于每个资源初始化)
2.对于每个i找
(1)对于进程i的for(each资源){need i小于等于work i}
(2)对于finish i==false,如果不存在则到第四步;(找到一个可以完成的进程,然后进行分配资源之后释放;如果找不到可以完成的进程,那就看看是否全为真)
3.work=work+allocation;
finish i=true;
回到第二步;
4.对于所有的finish i都要为true则安全。
(3)死锁的检测
1.单实例可以看资源分配图是否环,与死锁有关,临界条件是每个进程都占有最大资源,但不能运行万,但是这类资源已经分配完了。(一类资源)
2.多实例可以通过死锁检测算法来看是否有死锁。(与应行家算法类似,只不过不需要假设)
(4)死锁的恢复
1.终止某些进程;
2.抢占资源。(通过进程的优先级以及一些特性决定)
内存管理
1.重定位
<1>静态重定位
进入内存之前完成重定位(编译,链接,装入的时候完成),执行效率高,但是不可以移动。
<2>动态重定位
运行的时候完成重定位,可随意移动,但是执行效率低。(现代使用较多)
2.连续分配
未分分区表:起始地址,长度。
<1>固定分区分配(分区大小,数目固定)
有内零头,但是管理过程简单。
<2>可变分区分配
通过改变未分分区表实现分配。
有外零头,存在于未分分区表一段时间不可用。
可变分区分配有三种分配算法:
(1)首次适应算法:按照起始地址大小顺序找到一个可以满足条件的空间
(2)最佳适应算法:按可用分区大小进行排序,找到一个最小的空间进行分配。
(3)最差适应算法:找一块最大的空间进行分配。
程序浮动:合并大的碎片(前提是所有的碎片求和可以放的下该程序)
3.离散分配
<1>分页分配
Frame页架:固定大小的框页
Page页:保存未分页框(页表来储存)
1.将一个job分成很多个页,页与页框大小一样;
2.物理地址空间按照2的n次方分成页框;
3.作业的逻辑地址空间按照Frame大小分成页;
4.连续也可以分配不连续页框;
5.逻辑地址表示(p,d)p=A/(2^n),d=A%(2^n);
6.每个作业一张页表用于保存进程各页在主存分配;
7.设置一堆Register(包括base和limit)页表的表目。
(1)多级页表
将页框分为多级,然后进程页表加入多个空来区分;
(2)Hash页表
用较小的主存保存所有页表表目,hash表随机散列存多个页表;
(3)反置页表
系统设置一张表,以页框构建,可以在页目中加入进程名,进程页号。
<2>分段分配
1.物理地址空间:可变分区分配;
2.逻辑地址空间(S,d);
3.每个作业一张段表,保存每个分段内存位置;
4.分配离散分配;
5.系统设置一堆寄存器表示段表的起始地址和长度。
4.地址映像
<1>直接地址映像——查页表
通过frame+d可以得到一个可以访问的物理地址,通常需要两次访问内存。
<2>间接地址映像
增加若干寄存器保存当前运行进程表目
置换缓冲(原理是程序局部性特征:1.时间局部性;2.空间局部性)
页表表目扩充:页号,页框号,保护位,有效位
5.虚存分配
逻辑地址-》物理地址空间(某些空间运行过程中不需要)
页表表目:页号,页框,保护位,有效位(是否在内存里面并且合法),+访问位(看谁用的少便于后期置换),修改位(是否需要回写)。
置换过程:
1.找一个空的页架,将需要运行的放进去;
2.修改页表;
3.重新执行(一个指令可能执行很多次)。
置换算法:
(1)First in first out
奇异现象 多框时缺页率反而更多
(2)最佳置换
置换最远将来使用的页框
(3)LRU(最近最少使用算法)
通过画图不断比较得到最好的置换的页
(4)基于计数的置换方法
分配算法:
1.固定分配:按比例分配,平均分配
2.按优先级分配:按进程优先级进行分配
抖动
大量的时间用于置换,CPU利用率减少。
道数过多会抖动
文件系统
若文件保存在顺序介质,则只能通过顺序访问(磁带),保存在磁盘上则可以直接访问。
首先查找目录找到相关的目录信息(文件名,位置)建立操作系统与文件的联系。
1.文件访问
(1)一级目录:命名冲突,访问效率低,不支持分组
(2)二级目录以及多级目录可以解决以上问题
(3)通用图可以用来描述目录但是要没有环
(4)应用程序--》逻辑文件--》文件系统--》具体物理位置--》I/O设置-
》设备(分层设计的文件系统)
2.文件组织
(1)连续分配
每个文件在磁盘上占用一个连续的块,简单可随机访问,但是浪费空间大;
(2)链接分配
一个文件占用多个块通过链表来存储,浪费小但是不可以随机访问;
(3)索引分配
用一个物理块来保存索引用表(与分页类似)
3.未分分区空间管理
(1)位示图
选取一块来表示是否已经分配,如果已经分配则值为一,否则为零
(2)空闲块链
将空闲的块用链表来串起来,需要时从链表中弹出即可
(3)组
通过空白文件目录来实现找到空闲区域
4.提高访问性能
(1)提前读(读入缓存区)
(2)即刻释放
磁盘管理
数据量与弧度有关与长度无关,一个盘面两个读写头,柱面越靠外面刻度越小
1.磁盘访问延时
寻道时间,旋转时间
2.磁盘调度
(1)FCFS
先来先服务,谁先要访问就先转到哪儿
(2)SSTF
与磁头最近的外存区域优先访问
(3)SCAN
来回处理任务
(4)C-SCAN
回的时候不处理任务
I/O系统
DMA设备控制器对于块的输入输出
1.I/O硬件
设备状态表,内核I/O系统,通道-I/O处理机(与DMA联合使用,包括字节多路,数据多路,选择通道)-可以反馈给CPU
2.假脱机
将慢速设备(打印机)改造成可以共享的虚设备
组成:输入井,输出井(都是暂存)
内存缓冲
sp0,sp1系统进程
以打印为例,将打印内容写到输出井上,进行后续操作(本质山是以磁盘来代替CPU对慢速设备的控制)
特点:
将慢速设备改造成可以共享的设备
缓解CPU与慢速设备之间的性能联系
CPU与外设并发