用户运行程序不需要向操作系统预定时间
系统吞吐量指的是系统在单位时间内可处理的事务的数量,是用于衡量系统性能的重要指标。
批处理的缺点是缺少交互性,交互性指用户可以控制操作系统处理指令
多道程序设计技术是为了提高系统利用率和吞吐量
内核可以执行 CPU 能处理的任何指令,而用户程序只能执行除特权指令之外的指令。所以特权指令只能由内核(操作系统)使用。
中断处理
计算机通过硬件中断机制完成从用户态到核心态的转换
中断(外中断):指 CPU 执行指令外部的事件。I/O中断、时钟中断
异常(内中断):指 CPU 执行指令内部的事件。一般都是程序报错,如地址越界、运算溢出、虚拟内存系统的缺页等。
用户态转换为核心态的情况
1)用户程序要求操作系统的服务,即系统调用
用户在使用程序时,凡是与资源有关的操作,例如存储分配、I/O传输、文件管理等操作,都必须通过系统调用的方式向操作系统发出请求。
类似于“在内存中取数”、“将运算结果装入内存”、”寄存器清 0“等指令操作,可以用汇编语言实现,所以用户态下也可以使用。
用户程序执行陷入指令(访管指令/trap指令)发起系统调用,CPU由用户态变为核心态。访管指令在用户态使用,所以不可能是特权指令。
这种机制保证了系统的稳定性和安全性,防止用户程序随意更改系统资源
2)发生一次中断:程序产生错误、用户程序企图执行一条特权指令
从核心态转用户态
需要使用到中断返回指令,由于使用的时候在核心态,所以中断返回指令是特权指令
子程序调用只需保存程序断点,即该指令的下一条指令的地址
中断处理不仅要保存断点(PC 的内容),还要保存程序状态字寄存器(PSW)的内容
2 进程与线程
PCB (Process Control Block)进程控制块
进程实体 / 进程映像 :由程序段、相关数据段 和 PCB 三部分构成
进程
进程是资源分配的单位
I/O 操作对进程的影响
I/O 操作执行时需要中断,此时进程处于阻塞态,进程需要等待 I/O 的执行结果。完成后进程等待事件就绪,变为就绪态。
程序的封闭性
是指进程执行的结果只取决于进程本身,不受外界影响。进程不管是否断续执行,执行的速度不会影响执行结果。失去封闭性后,不同速度下执行的结果不同。
进程的撤销
进程可在完成时撤销,或在出现内存错误等时候撤销
进程在时间片结束时是就绪,不是撤销
线程
将一个进程划分为多个线程,多个线程可以同时并发执行
内核级线程是处理器调度和分派的单位
线程没有自己的地址空间,它共享其所属进程的空间
信号量机制
信号量可以表示系统中某种资源的数量,比如打印机有 5 个,则信号量值为 5
原语是一种特殊程序段,执行时只能一气呵成,不可以被中断。
用一对原语实现对信号量的操作:
wait() 和 signal(),也称为 P、V 操作 (源于荷兰语 proberen 和 verhogen)
wait()、P 操作:对系统资源进行申请,并减少相应的信号量
signal()、V 操作:对系统资源进行释放,并增加相应信号量
例:
系统中有一台打印机
int source = 1; // 设置系统中可用打印机资源数量为1,是全局变量
wait() 原语的实现;P 操作
void wait(int source){
if(source <= 0) 进入等待队列; //如果系统资源数量不够,则进入等待队列
source = source - 1; //如果够用,则资源数量-1,占用一个资源
}
signal() 原语的实现;V 操作
void signal(int source){
source = source + 1; //使用完资源后,释放资源,资源数+1
}
进程 P0 :
wait(source); //num0:此时 source 为1,可以使用,执行 source = source - 1; source 的值变为 0。然后假设此时 P1 进程试图访问打印机资源,跳到 num1
使用打印机资源
signal(source); //num2:此时 P0 结束使用打印机,执行 source = source + 1; 释放资源,转到 num3
进程 P1 :
wait(source); //num1: 此时 source 为 0,执行 if 语句,进入等待队列。跳转到 num2
//num3:此时 P0 结束使用打印机,全局变量 source = 1; 执行 source = source - 1; 转到 num4
使用打印机资源
signal(source); //num4: 使用结束,执行 source = source + 1; 释放资源
这个例子中,source 就是信号量,代表系统中 打印机资源 的数量。用 wait 和 signal 两个原语对 source 的值进行更改,从而控制线程是否可用访问资源。
信号量机制实现进程的互斥和同步
互斥锁(Mutex)
进程的互斥需要用到互斥锁。互斥锁是信号量机制 source = 1 的特殊情况,同时间只允许一个进程访问资源。所以各个进程之间是互斥的,所以称为进程的互斥。
初始化 mutex = 1,像上面那样,把 wait 和 signal 中的 source 替换为 mutex 即可
进程的同步
同步指的是多个进程在同一时间段内如何有序的进行。如代码1必须在代码2前执行,我们需要用信号量机制来保证执行的顺序。
具体实现:初始化 source 为 0 ,表示当前系统没有可用资源,在代码1后使用 V(source) 来释放资源,从而使 source 为 1;在代码 2 前面使用 P(source) 操作来申请资源,如果 source 值为 0,则表示代码1还没执行完,则 P 操作会阻塞代码2的进程,将2进程放入等待序列;若 source 值为 1,则表示代码1已经执行完毕,则 P 操作执行,代码2执行。
总结:前进程后跟 V 操作,后进程前跟 P 操作 —— 前 V 后 P
同步互斥总结:同步 初始化信号量为 0 ;互斥 初始化信号量为 1
综上:
P:理解为申请、减少资源;V:理解为释放、增加资源
当要实现互斥时,在两个·进程前后加PV;当要实现同步时,在先执行的进程后加V,后执行的进程前加P;
生产者消费者问题
分析题目中存在的同步和互斥关系,然后使用信号量控制
访问缓冲区是互斥关系,同一时间只能有一个人访问;生产者和消费者互相等待对缓冲区的操作,是同步关系
“缓冲区有空余,生产者生产,缓冲区非空,消费者消费”
注:为避免死锁,实现互斥的P操作一定要在实现同步的P操作之后
避免死锁——银行家算法
1.求Need矩阵
用最大需求量矩阵(Max)减去已分配量矩阵(Allocation)
2.判断系统是否处于安全状态
如果能找到一个安全序列,则处于安全状态。
判断方法:
a.看Need矩阵中不同进程的资源需求量,先找小于系统可用资源的进程。
b.用当前进程的已分配资源+系统可用资源,得到下一步的系统可用资源。
c.重复上述步骤,如果成功得到进程序列,则该序列为安全序列。
3.判断是否能满足新请求
a.判断新请求序列是否小于系统资源,并是否小于该进程的最大需求,若都成立,则继续。
b.然后用该进程的已分配资源+新请求,系统可用资源-新请求,Need-新请求。
c.重复2.的步骤,如果成功得到安全序列,则可以满足新请求。
3 内存管理
页面置换算法
题干形如:
在一个请求分页系统中,采用最近最少使用(LRU)页面置换算法时,假设一个
作业的页面引用串为 1,3,2,1,1,3,5,1,3,2,1,5,当分配给该作业的物理块数分别为 3 和 4
时,计算在访问过程中发生的缺页次数和缺页率。
页面引用串为页面编号,物理块数为下面的行数。
缺页次数:除了空的列,剩下都是缺页,都算在缺页次数
缺页率:缺页次数/总页数
页面置换次数:发生页面替换的列数
OPT算法:最佳置换算法
做题时,在下面标出,等到要替换的时候,从该处往后面找,最后看到的该列中的元素,为最近未使用的元素,则用当前元素替换掉该元素。
LRU算法:最近最久未使用算法
做题时,在下面标出,等到要替换的时候,从该处往前面找,最后看到的该列中的元素,为最近未使用的元素,则用当前元素替换掉该元素。
FIFO算法:先进先出算法
淘汰最先进入内存的页面。替换在列中存在时间最长的页面。
5 IO管理
磁盘
磁盘调度算法
FIFO 先进先出:给定什么顺序就走什么顺序
SSTF 最短服务时间优先:找与当前磁道号间隔最短的磁道号,用两个磁道号相减再绝对值,注意只看磁道号就行
SCAN 扫描算法(电梯算法):先向上走到头,找到最大磁道号,再向下走到最小磁道号
C-SCAN 扫描算法:一直向上走,走到最大磁道号之后继续轮回,从最小磁道向上找。
磁盘计算
存储容量 = 磁头数(盘面数)x 磁道数(柱面数)x 每道扇区数 x 每扇区字节数
访问时间 = 寻道时间(会给) + 读取时间(用转速求)+ 传输时间 + 控制器时间(会给)
磁盘计算时,1 GB = 1024 MB,1 MB = 1024 KB,1 KB = 1024 B
G M K之间进位为 1024
例题
某计算机系统采用 C-SCAN(循环扫描)磁盘调度策略,使用 2KB 的内存空间
记录 16384 个磁盘块的空闲状态。
设某单面磁盘旋转速度为 6000r/min,每个磁道有 100 个扇区,相邻磁道间的平均移动
时间为 1ms。若在某时刻,磁头位于 80 号磁道处,并沿着磁道号增大的方向移动,磁道号
请求队列为 40,90,30,110,对请求队列中的每个磁道需读取 1 个随机分布的扇区,则
读完这 4 个扇区点共需要多少时间?要求给出计算过程。
首先,计算寻道时间。总共移动的磁道数为 110 - 80 = 30。磁盘道的移动时间为 30 * 1ms = 30ms。
然后,计算读取每个扇区的时间。单面磁盘旋转速度为 6000r/min,1min = 60,000ms,则一转的时间为 60,000ms/6000r = 10ms
每个磁道有 100 个扇区,所以每个扇区的读取时间为 10ms / 100 = 0.1ms。
最后,累加读取每个扇区的时间,共为 4 * 0.1ms = 0.4ms。加上磁道的移动时间,总共需要的时间为 0.4ms + 30ms = 30.4ms。