操作系统复习

复习思路:课本习题,抓住自己不懂的核心知识来探索。找往年卷子。最后看看自己的实验报告。

【哈工大】操作系统 李治军

1.1 什么是操作系统

1.操作系统是什么?
是计算机硬件和应用之间的一层软件。

2.操作系统管理哪些硬件?
CPU、内存、文件、磁盘(终端、网络、电源、多核...)

3.x86 PC开机时做了什么事?
CPU处于实模式,CS=0xFFFF,IP=0x0000,寻址0xFFF0(ROM BIOS映射区),检查RAM/键盘/显示器/软硬磁盘,把磁盘0磁道0扇区读入到0x7c00处,设置cx=0x7c0,ip=0x0000
【注:ROM BIOS的代码是固定写好的,负责检查上面说的一些硬件】
0扇区存的就是引导扇区代码,bootsect.s
把0x7c00处代码复制到0x90000处,腾出空间
jmpi go, INITSEG,jmpi前面放IP后面放CS,这一步实际上就是继续执行bootsect.s后面的代码。
然后int0x13读磁盘,读boot扇区后面的4个setup扇区,读到0x90200
,然后读入system模块
所以boot的工作就是读setup,读system(OS核心代码)
然后跳转执行setup的代码

1.3 操作系统的启动

1.setup.s做了什么事?
int0x10取出光标位置到0x90000处,int0x15获取扩展内存大小,存到0x90002处,类似地,读显卡参数,读根设备号....
然后把0x90000后面的一系列代码移动到0地址处。这样,操作系统就在内存最前面了。
最后setup执行jmpi 0,8,这是怎么回事?切换成保护模式,32位寻址模式,这是通过cr0寄存器做到的,它的第0位PE是0,则为实模式,是1则为保护模式;第31位PG是1则启动分页。具体来说,intel使用gdt ,全称Global Descriptor Table,全局描述表,是x86保护模式下的一个重要数据结构,在保护模式下,根据CS查GDT表+ip来寻址,故CS也叫选择子。GDT在内存中有且只有一个。GDT的数据结构是一个描述符数组,每个描述符8个字节,可以存放在内存当中任意位置。
setup需要初始化gdt表。
然后跳转到0地址,操作系统处执行。

2.system模块是什么样的?
关于用Makefile控制Image的编译链接
setup跳到0地址处的system的第一部分,head.s
head.s进行IDT、GDT的初始化
现在保护模式中,都是32位汇编代码了。
head.s结束后,要调用main.c
怎么做的呢?push三个参数:0,0,0,然后push l6作为调用main的返回地址,再push一个main的地址,然后ret,从而切换到main。
main里有一大堆初始化工作。
以mem_init()为例,进行内存的初始化,利用传入的内存大小参数,初始化一个mem_map数组,每4kb作为一页。

1.4 操作系统接口

1.POSIX是什么?
Portable Operating System Interface of UNIX,规定了很多系统调用
如fork, execl, pthread_create, open, EACCS...

1.5 系统调用的实现

1.什么是内核态和用户态?
是一种CPU硬件层面的设计。
CS寄存器最低两位不用于寻址,称为CPL,0代表内核态,3代表用户态。
同理,DS的最低两位为RPL。
DPL,表示目标内存段的特权级。
检查:DPL>=CPL、RPL

2.怎么进入内核态?
int中断。

3.int0x80是怎么处理的?
IDT获取函数入口,跳转执行。

1.6 操作系统历史

1."上古神机"IBM7094是什么样子的?
造价昂贵。批处理操作系统IBSYS。本质上是一个监控系统。

2.OS/360特点是?
支持多道程序,最多可同时运行15道程序。为了便于管理,OS/360把中央存储器划分为多个(最多15个)分区,每个程序在一个分区中运行。

3.MULTICS特点是?
multics是一个分时操作系统,目的是为了开发出一套安装在大型主机上多人多工的操作系统。
核心是任务切换。
虚拟内存,复用思想。

4.UNIX特点?
简化了multics。Ken Thompson和Dennis Ritchi。

5.Linux怎么来的?
UNIX->MINIX->Linux

6.另一条线,Windows是怎么来的?
CP/M->QDOS
BASIC解释器、FAT磁盘管理
->MS-DOS->Windows

2.1 CPU管理

1.什么是并发?
一个CPU交替执行多个程序。
切换时要做很多。PCB保存信息。

2.什么是进程?
进程是进行中的程序,不是静态的。进程会走走停停,需要记录ax,bx等。

2.2 多进程图像

1.为什么说多进程图像从启动开始到关机结束?
main中最后的指令是if(!fork()){init();}
init再执行shell,shell再启动其他进程

2.多进程如何组织?
PCB+状态+队列
就绪队列,等待队列(打印机还没准备好)

3.进程状态图怎么画?

4.生产者/消费者问题?
锁/信号量...

5.进程切换的工作过程能描述一下吗?

1、(中断/异常等触发)正向模式切换并压入PSW/PC 。 (Program Status Word 程序状态字。program counter 程序计数器。指向下一条要执行的指令)

2、保存被中断进程的现场信息。

3、处理具体中断、异常。

4、把被中断进程的系统堆栈指针SP值保存到PCB。(Stack Pointer 栈指针。Process Control Block 进程控制块。)

5、调整被中断进程的PCB信息,如进程状态)。

6、把被中断进程的PCB加入相关队列。

7、选择下一个占用CPU运行的进程。

8、修改被选中进程的PCB信息,如进程状态。

9、设置被选中进程的地址空间,恢复存储管理信息。

10、恢复被选中进程的SP值到处理器寄存器SP。

11、恢复被选中进程的现场信息进入处理器。

12、(中断返回指令触发)逆向模式转换并弹出PSW/PC。

2.3 用户级线程

1.举个线程应用例子?
浏览器显示页面

2.不同线程能共用一个栈么?
不能

3.创建一个线程的流程?
申请TCB,申请一段栈,把栈指针设为初始地址,把SP的值和TCB相关联

4.为什么说是用户级线程?
image

5.用户级线程的优缺点?
优点:
线程切换不涉及模式切换(代价小);
调度算法的选择较灵活。
缺点:
同一进程的多个线程不能同时在多个处理器上运行;
一个线程的阻塞将导致整个进程的阻塞非抢占式调度。

2.4 内核级线程

1.内核级线程的优缺点?
能够在多个处理器上同时执行多个线程。
某个进程中一个线程被阻塞,不会影响其他线程的运行。
线程间的切换代价高,需要涉及两次模式切换。

2.并发和并行的区别?
并发:实质是交替执行
并行:多处理器同时处理多个线程

3.核心级线程是怎么实现的?
两套栈。
内核管理TCB,内核中切换线程。
用户栈——中断——内核栈——阻塞——内核栈切换——iret——用户栈切换
【如果是进程切换,还涉及地址映射表的问题】

2.5 内核级线程的实现

fork(),内核栈不同,用户栈共用同一个

2.7 CPU调度策略

不同思路:
周转时间短?
用户操作响应时间短?
吞吐量大?

1.为什么对调度程序而言,区分CPU约束型进程和I/O约束型进程很重要?
CPU约束型进程可以利用整个时间片,且不会做任何阻碍I/O操作的工作;另一方面,I/O约束型进程有在运行I/O操作前只运行很少数量的计算机操作的性质。这种进程一般不会使用很多的CPU。所以,通过给I/O约束型进程优先权和允许在CPU约束型进程之前运行,可以很好地利用计算机资源。
我们当然应该给I/O约束型进程更高的优先级。

2.介绍一些调度算法?
FCFS
SJF短作业优先 缩短周转时间
时间片轮转
优先级方法
最高响应比优先算法(HRRF):最高响应比优先算法是介于先来先服务算法(FCFS)和最短作业优先算法(SJF)之间的一种算法,它既考虑了作业的等待时间,又考虑了作业的处理时间。 调度规则:响应比最高的作业先运行。 优点: HRRF对于作业的时间分配比较均匀,既照顾了短作业,又不至于使长作业等待时间过长。响应比=作业周转时间/作业处理时间。

3.多种类型任务怎么办?

前台任务关注响应时间,后台任务关注周转时间。

两个队列,前台任务RR时间片轮转,后台任务SJF短作业优先,前台任务没有时才进行后台任务

2.8 schedule函数

counter实现时间片轮转/优先级调度

2.9 进程同步与信号量

1.生产者-消费者问题用PV信号量实现?

Semaphore mutex = 1;  // 用于对缓冲区的互斥访问
Semaphore empty = N;  // 用于跟踪空闲缓冲区数量
Semaphore full = 0;   // 用于跟踪已满缓冲区数量

procedure producer {  
    while (true) {
        item = produce_item();
        P(empty);
        P(mutex);
        insert_item(item);
        V(mutex);
        V(full);
        sleep();
    }
}

procedure consumer {
    while (true) {
        P(full);
        P(mutex);
        item = remove_item();
        V(mutex);
        V(empty);
        consume_item(item);
        sleep();
    }
}

2.解释下顺序?
两个P的顺序必须如此,否则会发生死锁,V无所谓。
consume_item(item);和V能不能交换?
答:

2.10 信号量临界区保护

1.讲讲软件算法?

原则:互斥进入,有空让进,有限等待

临界资源每次只能被一个进程访问。而临界区则是能够访问临界资源的代码片段。

一个典型进程的通用结构:

do{
    进入区
        临界区
    退出区
        剩余区
}while(TRUE)

轮换法?标记法?非对称标记?

Peterson算法是一种经典的基于软件的临界区问题算法,可能现代计算机体系架构基本机器语言有些不同,不能确保正确运行。结合了标记、轮转两种思想。
只能解决两个进程的问题。

int turn;  //变量turn表示哪个进程可以进入其临界区,即如果turn==i,那么进程Pi允许在其临界区内执行。
bool flag[2];  //数组flag表示哪个进程想要进入临界区,如果flag[i]为true,即Pi想进入其临界区。
do{
 
   flag[i]=true;
   turn=j;
   while( flag[j] && turn==j ); //一直等
 
       临界区
 
   flag[i]=false;
 
       剩余区
 
}while (true)

多个进程怎么办?
面包店算法,仍然是标记+轮转。

do{
    choosing[i]=true; //进程i正在取号
    number[i]=max(number[0],number[1]...number[n-1])+1;
    choosing[i]=false; //进程i取号完毕
    for(j=0;j<n;j++){
        while(choosing[j]);//判断这个进程是否在取号
        while((number[j]!=0)&&(number[j],j)<(number[i],i));//等价于只有当j进程在排队且j进程的优先级高于i进程,i进程自旋等待,等待j进程申请完临界区后退出临界区。
    }
    
    临界区代码
 
//退出临界区
    number[i]=0;
}while(true)

2.讲讲关中断方法?

另一个思路,用关中断阻止调度。但多核的情况下不好使。

3.讲讲硬件原子指令法?

思考上锁的本质,希望一段指令不被打断。原子指令!这才是最直接的方法。。。

【原子指令】
TestAndSet(boolean &x){
    boolean rv = x;
    x = true;
    return rv;
}
while(TestAndSet(&lock));
临界区
lock = false;
剩余区

4.思考:原子指令法对多CPU的情况好不好使?

取决于这个原子指令的实现够不够原子。。。
单CPU中,能够在单条指令中完成的操作都可以认为是“原子操作”,在多CPU就不同了,由于系统中有多个处理器独立运行,即使能在单条指令中完成的操作也有可能受到干扰。在X86平台生,CPU提供了在指令执行期间对总线加锁的手段。CPU上有一根引线#HLOCK pin连到北桥,如果汇编语言的程序中在一条指令前面加上前缀”LOCK”,经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。

5.什么是互斥锁?

访问共享资源前加锁
加锁后访问共享资源
访问后解锁
加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放

特性
原子性:互斥锁是一个原子操作
唯一性:如果一个线程锁定了一个互斥锁,在它解除锁之前,其他线程不可以锁定这个互斥锁
非忙等待:如果一个线程已经锁定了一个互斥锁,第二个线程又试图去锁定这个互斥锁,则第二个线程将被挂起且不占用任何CPU资源,直到第一个线程解除对这个互斥锁的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥锁

6.什么是自旋锁?
如果进线程无法取得锁,进线程不会立刻放弃CPU时间片,而是一直申请CPU时间片轮询自旋锁,直到获取为止,一般应用于加锁时间很短(1ms左右或更低)的场景。

自旋锁与互斥锁功能相同,唯一不同的是自旋锁阻塞后不会让出CPU,会一直忙等待,直到得到锁
自旋锁在用户态较少用,而在内核态使用的比较多
自旋锁的使用场景:锁的持有时间比较短,或者说小于2次上下文切换的时间

总结:当加锁失败,互斥锁使用线程切换应对,自旋锁用忙等待应对。更高级的锁都会选择其中一个实现

2.11 信号量代码实现

1.PV信号量怎么实现的?
image
非常简单。

2.Linux怎么实现的?
image
非常妙!!

2.12 死锁处理

1.死锁的必要条件?
互斥使用、不可抢占、请求和保持、循环等待(存在环路)

2.死锁的处理?

预防思路:进程执行前一次性申请所有需要的资源。问题:难以预知未来、资源利用率低。

避免思路:银行家算法,判断请求是否会引发死锁

检测恢复思路:类似银行家算法,恢复时进行回滚

死锁忽略方法:Windows和Linux都采用,代价小,死锁概率低,可以重启解决,避免复杂编程。

3.1 内存使用与分段

1.什么是重定位?

https://www.cnblogs.com/sewain/p/15127022.html
神博客!

思考过程:载入时进行重定位,比编译时重定位灵活一点,坏处是,程序一旦载入内存就不能动了。进程挂起放下,所以程序载入后是会移动的(交换机制)。。。
因此,重定位最合适的时机,是运行时重定位!每执行一条指令都要从逻辑地址算出物理地址再执行。这样,同样的程序放到内存任何地方都能正常执行了。base+offset,base放在PCB里。
还缺了点啥。引入分段。分治思想。

3.2 内存分区与分页

可变分区,用空闲分区表管理
多个空闲分区,选哪一个?(三种算法)

这种方法会造成内存碎片的问题。合并又太耗时间。

分页!!!妙啊。

我要给一个段申请空间,我把段分成页。与此同时,内存分成若干对应大小的页框。mem_map,4kb是一页(32位操作系统)。
这个时候要用到页表进行重定位。MMU(内存管理单元)来干这件事。

3.3 多级页表与快表

表项太多了。
如果只存放用到的页,二分查找,时间太长。

多级页表,页目录表(章)+页表
但多级页表增加了访存的次数。TLB,快表,解决时间问题。

3.4 段页结合的实际内存管理

引入虚拟内存!妙啊。
重新考虑重定位过程。
故事从fork()开始。

3.5 内存换入—请求调页

实现虚拟内存比物理内存大
请求的时候才换入、建立映射
实现原理:请求换页
一旦发生缺页(没有对应的物理内存),操作系统请求换页,中断!14号中断。这个中断PC指针不会+1.

1. 为什么请求调页而不是请求调段?

请求调页的粒度更细,更能提高内存效率。

3.6 内存换出

算法指标:希望缺页次数少
FIFO:有可能出现刚换出又换进的情况
MIN:理论最优方案,选最远要使用的页换出。但未来常常不可预测。
LRU:用过去历史预测未来,选最近最长一段时间没有使用的页淘汰

LRU的准确实现:时间戳法?代价太大。页码栈法。
LRU近似实现:每个页加一个引用位。组织成循环队列。二次机会算法。也叫Clock算法。

给进程分配多少页框/帧?
分配多了,内存利用率低。
分配少了,缺页率增大,频繁换入换出,引起系统的颠簸现象。

4.1 IO与显示器

怎么让外设工作?
形成文件视图、发出out指令、执行中断处理程序。
操作系统统一提供一段操作外设的程序。

怎么做驱动程序?
out指令编写(如显示字符的核心是mov pos, c),注册函数。

4.2 键盘

敲了键盘就中断
中断处理程序中,inb指令,从端口读扫描码,进函数放入队列,还有回写

4.3 生磁盘的使用

4.4 从生磁盘到文件

4.5 文件使用磁盘的实现

操作系统第五版费祥林-课后习题

计划:5.28开始,每天至少5页。

重要题型

概论
多道程序程序运行图的绘制

处理器管理

PSW的理解
进程状态,三态模型和五态模型以及加上挂起的状态图理解
进程上下文的理解
线程的用户级实现、内核级实现的理解:多核?灵活度?切换代价?
不同调度算法(周转时间计算...)
判断是否可调度
最少裕度调度算法的应用(赶DDL

文件管理

CHS寻址
FAT和EXT文件系统寻址过程的理解
文件权限相关
连续存储和链接存储
描述UNIX一些文件系统相关的系统调用的实现过程:create, unlink, open, close, read, write, dup, lseek, ln, ln -s, mmap, unmmap

内存管理

请求调页的内存替换算法
可变分区管理的不同算法
已知虚拟存储命中率求访问时间
会读段表、页表,进行地址转换
全局页面替换算法【最佳算法、工作集算法】
Belady异常举例...?

并发控制

除了PV信号量操作的临界区管理实现:关中断、TSL、XCHG
各种生产者-消费者问题【单个生产者和单个消费者一个/多个缓冲区、单一产品的多个生产者和多个消费者共享多个缓冲区、多类产品的多个生产者和多个消费者共享多个缓冲区】的代码编写
各种读者-写者问题【】的代码编写
已知PV信号量操作代码,预测结果
五个哲学家进餐问题的PV代码编写、问题、解决方案
判断某个临界区管理算法是否符合“无空等待、有空让进、择一而入、算法可行”的条件(一次至多只有一个进程进入临界区内执行、如果已有进程在临界区中试图进入临界区的其他进程应等待、进入临界区内的进程应在有限时间内退出以便让等待队列中的一个进程进入。)

死锁的避免:银行家算法的应用
死锁的检测

不太懂

  1. 请你设计一种先进的计算机体系结构,它使用硬件而不是中断来完成进程切换,则CPU 需要哪些信息?请描述用硬件完成进程切换的工作过程。
    答:该计算机有一个专用硬件寄存器,它始终存放指向当前运行进程的PCB 的指针。当系统中发生了一个事件,如FO 结束事件,CPU 便可把运行进程的上下文保存到专用硬件寄存器指针指向的PCB 中保护起来,然后,CPU 转向中断向量表,找到设备中断处理程序入口,让专用硬件寄存器指针指向(设备)中断服务例程,于是,便可启动中断服务例程工作。

  2. 设计一条机器指令和一种与信号量机制不同的算法,使得并发进程对共享变量的使用不会出现与时间有关的错误。

  3. 有一个分页虚存系统,测得CPU 和磁盘的利用率如下,试指出每种情况下的存在问题和可采取的措施:( 1 ) CPU 利用率为13 % ,磁盘利用率为97 % ( 2 ) CPU 利用率为87 % ,磁盘利用率为3 % ( 3 ) CPU 利用率为13 % ,磁盘利用率为3 %。 答:( 1 )系统可能出现抖动,可把暂停部分进程运行。(2 )系统运行正常,可增加运行进程数以进一步提高资源利用率。(3 )处理器和设备和利用率均很低,可增加并发运行的进程数。

  4. 考虑下面的程序:for ( i = 0;i < 20 ; i++) For(j=0;j<10;j++) a [ i ] : = a [i] ×j 试举例说明该程序的空间局部性和时间局部性。 答:当数组元素a [0] , a[1] ,… ,a [ 19 ] 存放在一个页面中时,其空间局部性和时间局部性较好,也就是说,在很短时间内执行都挂行循环乘法程序,而且数组元素分布在紧邻连续的存储单元中。当数组元素存放在不同页面中时,其时间局部性虽相同,但空间局部性较差,因为处理的数组元素分布在不连续的存储单元中。

  5. 假设多个用户共享一个文件目录系统,用户甲要用文件A、B、C、E,用户乙要用文件A、D、E、F。已知用户甲的文件A与用户乙的文件A实际上不是同一个文件;用户甲的文件C与用户乙的文件F实际上是同一个文件;甲、乙两用户的文件E是同一个文件。试问你是否可以拟定一种文件目录组织方案,使得甲、乙两用户既能共享文件而又不造成混乱?
    答:采用多级目录结构,文件目录分解为基本目录和符号目录,只要在不同文件符号目录中使用相同文件内部标识符,甲、乙两用户既能共享文件而又不造成混乱。

  6. 若某操作系统仅支持单级目录,但允许该目录有任意多个文件,且文件名可任意长,试问能否模拟一个层次式文件系统?如能的话,如何模拟。
    【参考答案】 可以,文件名中可以用插入多个“/”来模拟文件分层。例如/usu1/datafile/data1和/user1/datafile/data2。但在此操作系统中,这些仅仅是包含“/”的单个文件名。

  7. 证明信号量与消息传递是等价的: ( 1 )用信号量实现消息传递; ( 2 )用消息传递实现信号量。 答:( l )用信号量实现消息传递; 1 )把消息队列组织成一个共享队列,用一个互斥信号量管理对该队列的入队操作和出队操作. 2 )发送消息是一个入队操作,当队列存储区满时,设计一个同步信号量阻塞send 操作。 3 )接收消息是一个出队操作,当队列存储区空时,设计另一个同步信号量阻塞receive 操作。 ( 2 )用消息传递实现信号量。 l )为每一个信号量建立一个同步管理进程,它包含了一个计数器,记录信号量值;还为此信号量设立一个等待进程队列 2 )应用进程执行P 或V操作时,将会调用相应P 、V库过程。库过程的功能是:把应用进程封锁起来,所执行的P 、V 操作的信息组织成消息,执行send 发送给与信号量对应的同步管理进程,之后,再执行receive 操作以接收同步管理进程的应答。 3 )当消息到达后,同步管理进程计数并查看信号量状态。如果信号量的值为负的话,执行P 操作的应用进程被阻塞,挂到等待进程队列,所以,不再要送回答消息。此后,当V 操作执行完后,同步管理进程将从信号量相应队列中选取一个进程唤醒,并回送一个应答消息。正常情况下,同步管理进程回送一个空应答消息,然后,解锁执行P 、V 操作的应用程序。

  8. 系统有同类资源m 个,被n 个进程共享,问:当m > n 和m≤n 时,每2222个进程最多可以请求多少个这类资源时,使系统一定不会发生死锁? 答:当m≤n 时,每个进程最多请求1 个这类资源时,系统一定不会发生死锁。当m > n 时,如果m/n 不整除,每个进程最多可以请求”商+1 ”个这类资源,否则为”商”个资源,使系统一定不会发生死锁【一句话:m/n的上取整个】

其他知识

中断相关

外中断特点:与现行指令无关
发生时间与CPU所处状态无关
两条指令之间才能响应中断
可被屏蔽
可嵌套

异常(内中断)特点:
由现行指令执行而引起
在目态发生
可在一个指令周期内处理
不可屏蔽
不可嵌套
可细分为:出错,处理完后回到当前出错指令;
陷入,处理完后执行下一条指令(常用于系统功能调用)

中断和异常的一般处理过程
发现中断源(硬件)
保护现场(硬件)
转向中断/异常事件处理程序(软件)
恢复现场恢复现场(硬件)

PSW

16位的标志寄存器FLAGS。
状态标志从低位到高位:
进位标志CF(Carry Flag)、奇偶标志PF(Parity Flag)、辅助进位标志AF(Auxiliary Carry Flag)、零标志ZF(Zero Flag)、符号标志SF(Sign Flag)、溢出标志(Overflow Flag)。
方向标志DF。
中断允许标志IF(Interrupt-enable Flag)或简称中断标志,用于控制外部可屏蔽中断是否可以被处理器响应。
陷阱标志TF(Trap Flag)也常称为单步标志,用于控制处理器是否进入单步操作方式。

调度算法

2022年概念考点!

高级调度(作业调度)
先来先服务算法FCFS
最短作业优先算法SJF
最短剩余时间优先算法SRTF
响应比最高优先算法HRRF【在FCFS和SJF之间的折中,既考虑作业的等待时间,而考虑作业的运行时间。优点:防止了饥饿发生。响应比=作业周转时间/作业处理时间=(作业等待时间+作业处理时间)/作业处理时间=1+(等待时间/处理时间)】
优先数法分类调度算法
用磁带与不用磁带的作业搭配

低级调度(进程调度)
先来先服务(First-Come, First-Served)
时间片轮转(Round-Robin Scheduling)
优先数调度(Priority Scheduling)【占用CPU时间长,优先数小;等待CPU时间长,优先数大】
最短进程优先(Shortest Process Next)【估算下次进程执行时间,aging算法】
多级反馈队列调度(Multiple Queues …)【多级就绪队列,优先权较高的队列分配的时间片较短,同一队列先来先服务】
保证调度(Guaranteed Scheduling)
彩票调度(Lottery Scheduling)

这算法简称最好也记一下。

FAT文件系统

FAT磁盘物理上分为以下四部分组成:

  1. 保留区(含MBR–Main Boot Record)
  2. 保留区(含DBR–DOS Boot Record)
  3. FAT区
  4. 数据区

FAT有FAT12,FAT16,FAT32三个阶段。区别在于文件分配表的大小不同。

关于“簇”
FAT文件系统用 “簇” 作为数据单元。一个“簇”由一连串的扇区组成,簇所含的扇区数必须是2的整数次幂。所有簇从2开始进行编号,每个簇都有一个自己的编号。用户文件和目录都存储在簇中。文件系统分配磁盘按照簇进行分配。

关于FAT表
FAT32中簇地址是用4字节进行编址的,故在FAT表中,是以4个字节为单位进行划分,每个单元存储一个簇地址。0号地址与1号地址被系统保留并存储特殊标志内容。从2号地址开始,第i号地址对应数据区中i号簇。我们称FAT表中的地址为FAT表项,FAT表中记录的值为FAT表项值。
当文件系统被创建时,FAT表会被清空,在FAT1和FAT2表中的0号地址与1号地址会被写入特定值。由于创建文件系统的同时会创建根目录,也就是在数据区为根目录分配一个簇的空间(2号簇,起始簇)在FAT表中2号地址写入一个结束标记。
当FAT表中第i号地址对应的簇未被使用时,表项值为0
当FAT表中第i号地址对应的簇是记录一个文件或文件夹的最后的簇时,表项值为0xFFFFFFFF。

关于目录项
FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录着文件名、大小、文件内容起始地址以及一些其他元数据(简单来说就是文件或文件夹本身的属性)。

UNIX文件系统

image
image
image
三图足矣!

可变分区存储管理

区分内碎片、外碎片。

可变分区存储管理在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。

可以克服固定分区管理的“内碎片”问题。

必须有表来记录分区的情况。
程序进入内存时的例行工作就是分配空闲区和装入程序,并修改相应的空闲表和已分配区表。
一旦一个内存分区被分配给一个进程,该进程可以被装入该块中执行,装入时需重定位。

最先适应分配算法
算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
评价:易于释放时合并相邻空间分区。比较容易的满足大作业的需要。但完成一次分配平均需要的搜索次数较大。

最佳适应算法
算法思想:优先使用更小的空闲区。
实现步骤:
空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区表,找到大小能够满足要求的第一个空闲分区。
评价:会产生很多的外部碎片。

最坏适应算法
算法思想:为了解决太多难以利用的小碎片,可以在每次分配时,优先使用最大的连续空闲区,这样分配后的空闲区就不会太小,更方便使用。
实现步骤:
空闲分区按照容量递减次序链接。每次分配内存时顺序查找空闲分区表,找到大小能满足要求的第一个空闲分区。
评价:工作一段时间后,不能满足大作业对空闲区的请求。

可变分区内存回收
为了及时减少“外碎片”。只比固定分区管理增加了合并相邻空闲区的操作。

多级页表问题

页面替换算法

(a) 最近不使用页面替换算法:最近最少使用页面替换算法的模拟,看引用位是0的里面淘汰,如果不止一个则看修改位;NFU

(b) 先进先出页面:字面意思;会产生Belady异常。FIFO

(c) 最近最少使用页面替换算法:维护优先级队列,只看最后访问时间;性能好代价高。LRU

(d) 二次机会页面替换算法:先进先出的基础上,给二次机会。

Clock: 二次机会的模拟,不再用FIFO队列,而是换成环形
Aging:最近最少使用算法的模拟,要会啊!!每个页对应一个多位寄存器。【https://www.cnblogs.com/gaosheng-221/p/6168596.html】
讲的非常好。本质上就是比LFU更长的历史记录。
Aging算法想模拟LRU,位数越多越好,周期越短越好,但相应的代价也会变大。

最不常使用LFU

工作集模型

页面抖动(颠簸现象)

概念:刚刚换出到外存的页面马上要换入内存,刚刚换入的页面马上要调入到外存。

产生原因:系统为进程分配的物理块大小不足

导致的问题:系统会花大量时间进行换入、换出操作,而真正用于进程实际运行的时间大大减少

为了解决抖动问题,提出了工作集的概念

工作集:在某段时间间隔内,进程实际访问页面的集合(区别于驻留集,驻留集是指请求分页管理存储中给进程分配的物理块大小)

操作系统会根据"窗口尺寸"来算出工作集。如:某进程的页面访问序列是:24,15,18,23,24,12,17,18,14,18,17,若窗口尺寸为3,那么对于18来说,其工作集就是24 15 18,对于12来说,其工作集就是23 24 12。【要算上自己】

驻留集的大小不能小于工作集大小,否则会导致频繁缺页。【这个确实,看模拟过程能意识到这种情况没有从根源上避免】

模拟算法:老化(Aging)算法、缺页频率替换算法【如果两次缺页之间间隔够大,则这个间隔内所有没被引用的都移出去,闭区间】、时间戳算法

image

判断是否删掉页面的方法,可以看时间,也可以看工作集滑动。

UNIX文件属性中的权限

drwxr-x--- 分为4个部分d、rwx、r-x、---。

d:表示文件类型
-:普通文件,d:目录文件,l:链接文件,b:设备文件,c:字符设备文件,p:管道文件

rwx:表示文件所有者的对该文件所拥有的权限;

r-x:表示文件所属组对该文件所拥有的权限;

---:表示其他用户对该文件所拥有的权限。

读(r)read,写(w)write,执行(x)execute

进程通信

信号通信

信号通信又称软中断,是一种简单的通信机制,通过发送一个特定的信号来通知进程某个异常事件发生信号
可以是内核发送给进程,也可以是一个进程发送给另一个进程
例:SIGLD、SIGHUP、SIGKILL、SIGCHLD等信号用于进程的终止

共享文件

即管道。

普通管道机制的缺陷:
仅能连接具有共同祖先的进程
管道具有临时性,难以提供全局服务

UNIX采用有名管道或FIFO通信机制,这一种永久性通信机制,具有Unix文件名、访问权限,并且性能与普通的管道相同。

共享存储区

向系统共享存储区申请一个分区段,并指定关键字;若系统已为其他进程分配了该分区,则返回对应的关键字给申请者。

send&receive
一对进程间进行的消息传递由 send 和 receive 这两个消息通信操作来支持,它们均用目的地和消息定义。进程通信时由一个进程发送一个消息(字节序列)到目的地,在目的地的另一个进程接收消息。每个消息目的地与一个队列相关,发送进程将消息添加到远程队列中,接收进程从本地队列中移除消息。

进程之间的通信可以是同步的也可以是异步的,在同步(synchronous)形式的通信中,发送进程和接收进程在每个消息上同步。此时 send 和 receive 都是阻塞操作,发送进程发出一个 send 操作后将一直阻塞,直到发送了相应的 receive 操作为止。每次发送一个 receive 后,进程将一直阻塞,直到消息到达为止。

在异步(asynchronous)形式的通信中,send 操作是非阻塞的,只要消息被复制到本地缓冲区,发送进程就可以继续进行其他处理。receive操作有阻塞型和非阻塞型两种形式:在不阻塞的 receive 操作中,接收进程在发出 receive 操作后可继续执行它的程序;在支持多线程的系统环境中,在一个线程发出阻塞型 receive 操作时,该进程中的其他线程仍然是活动的。非阻塞型的通信看上去更有效,但接收进程需要从它的控制流之外获取到达的消息,这涉及额外的复杂工作。

死锁相关

什么情况下会导致死锁?
顺序不当,PV操作使用不当,资源分配不当,对临时资源试用不加限制

死锁的必要条件
互斥、占有和等待、不剥夺、循环等待
静态分配策略破坏占有和等待,但资源利用率低。
层次分配破坏循环等待。

静态分配策略:一个进程在执行前就申请他所需要的全部资源,只有得到需要的所有资源时进程才会执行,此方法是破坏条件中的第二条,因为得不到全部的资源时进程不会执行,因此进程不会因得不到资源进入等待状态。
层次分配策略:将资源分为不同等级的层次,进程在申请高层次的资源时必须先申请低层次的资源,在释放低层次的资源时必须先释放高层次的资源,在申请同一层资源中的另一资源时需要释放已得到的该层资源,通过这种方法破坏条件中的第四条。

也别只学银行家算法
还有
资源轨迹图:缺点是只能两个进程,每个资源最多一个实例

资源分配图
如果每个资源类型只有一个实例,那么资源分配图中出现环则意味着出现死锁
如果每个资源类型有多个实例,那么环并不意味着已经出现死锁
资源分配图中的环是死锁存在的必要条件,而非充分条件

解除死锁:进程终止/资源抢占

posted @   藤君  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示