进程 & 线程
进程不是程序。进程是动态的,有生命周期的。
程序是指令的集合,是静态的。程序和进程的关系类似于类与对象的关系。
线程是特殊的进程。
PCB是常驻内存中的。
Linux系统中 fork()后 父进程和子进程谁先执行?
与具体操作系统有关,Ubuntu是先把父进程执行完。
操作系统中共有n个进程。同一时刻,处于运行态、阻塞态和就绪态的进程最多各有多少个?
运行态最多1个,阻塞态最多n个,就绪态最多n-1个。
内存管理
需求
重定位、保护(必须由硬件实现)、共享、逻辑组织(模块化)、物理组织
技术
内存管理的主要操作就是:处理器把程序装入内存中执行。
- 固定分区/动态分区:整个程序作为整体,全部加载,连续
- 简单分页/简单分段:整个程序分成小块,全部加载,不连续
- 虚存分页/虚存分段:整个程序分成小块,部分加载,不连续
重定位
系统采用动态加载方式把使用相对地址的程序加载到内存,需要将相对地址转换为物理地址。
进程运行时,有一个基址寄存器存储程序在内存中的起始地址,还有一个界限寄存器存储终止位置。遇到相对地址时,用基址寄存器中的值加上相对地址产生一个绝对地址,结果与界限寄存器中值进行比较,若不超过界限范围则继续执行,否则执行中断。
固定分区
- 存在内部碎片
- 优先换出能容纳新进程的最小分区中的进程
动态分区
- 存在外部碎片(可以通过压缩解决,但非常费时,且需要动态重定位能力)
- 放置算法
- 最佳适配:选择与新进程大小最接近的块
- 首次适配:从头开始扫描内存,选择第一个可以容纳新进程的块
- 下次适配:从上一次放置的位置开始扫描,选择遇到的第一个可以容纳新进程的块
固定分区和动态分区的折中:伙伴系统
简单分页
- 页针对的是程序(数据),页框针对的是内存(物理),二者大小相同,且都是2的整数幂。
- 操作系统要给每个进程维护一个页表,存的是这个进程每一页所在的页框位置,每一个逻辑地址包含一个页号和一个在该页中的偏移值。
- 只有每个进程的最后一页中会留下内部碎片,没有外部碎片。
- 缺页率与页尺寸关系
页尺寸很小时,可以加载进来的页数量很多,缺页率低;随着页尺寸增加而增大;直到页尺寸接近整个程序大小时,缺页率降低;页尺寸大于等于整个程序大小,缺页率为0.
简单分段
- 段与页的区别:不要求所有段大小相等。对于程序员来讲,分段有更大的可操作性。
- 操作系统维护一个内存的空闲块表,也会给每个进程维护一个段表。段表中每项包含该段的起始地址和长度。进程进入运行态后,段表地址会被装载到一个寄存器中,由内存管理硬件来管理。
虚存分页
- 页表项会增加更多控制位,比如P用于表示当前页是否在内存中,M用于表示相应页内容从上次装入内存到现在是否已经改变。
- 虚拟内存管理中,只有一部分页表位于内存中。所以页表也需要进行分页管理。通常采用两级方案组织大型页表。注意“页目录表”和“页表”的区别———“页目录表”是页表的页表。
- 倒排页表:虚拟地址的页号通过一个散列函数,映射到一个散列表,散列表中存着指向倒排页表的指针,注意倒排页表中每一项对应的就是一个物理地址而不是虚拟地址。也就是此时可以直接用页框号(而不是页号)在倒排页表中查找表项。
- 转换检测缓冲区TLB
每次地址转换需要两次内存访问:查询页表项和取数据。
用TLB之后:先在TLB中查询,若命中则直接检索页框号,形成实际地址;如果没命中,则用页号检索页表,若检索到存在位已置位(说明该页在内存中),则检索页框号、形成实际地址,并且更新TLB(因为TLB存的是最近用到过的页表项);若存在位未置位,则产生缺页中断,由操作系统装入缺失的页并更新页表。
虚存分段
基本同于简单分段
段页式
用户内存被程序员分成许多段,每段划分为大小相等的页,页的大小与内存中的页框大小也相等。逻辑地址仍然由段号和偏移量组成,而段偏移量又可以解释为页号加页偏移量。每个进程有一个段表和一些页表,每个进程段有一个页表。
置换策略
总目标:换出最近最不可能访问的页
页框有一个锁定位,被锁定的不能被换出
最佳 OPT
OPT要求操作系统必须知道接下来将访问的页,所以可以实现换出下次访问时间距当前时间最长的页。
OPT导致的缺页中断最少,但他是不可能实现的算法,主要用于与其他算法进行比较。
最近最少使用 LRU
换出上次访问距现在最久的页。给每一页添加一个最后一次访问的时间戳,每次访问该页时进行更新。也可以维护一个被访问页的栈。
性能接近OPT,但开销很大难以实现。
先入先出 FIFO
换出驻留在内存中时间最长的页。有一个指针在被分配了的页框区内,初始时指向第一个页框。每次缺页时换出指针当前指着的页,然后把指针指向下一个页框。
是最容易实现的算法。
时钟 Clock
把所有页框放进一个环。有一个指针指向下一个可能被替换的页;每个页框有一个使用位,这个位在某页首次装入内存时为1;该页后续被访问时,使用位也置1。
出现缺页中断时,先看指针所指的页框的使用位,若为0,该页被换出;若为1,则置为0,该页不能被换出,指针指向下一个再判断。如果所有页框使用位都是1,则指针循环一周(此时所有页框的位都被置为0),再换出开始循环时指向的页框。
内存访问次数
简单分页/分段
都是2次
- 第一次:访问内存中的页表,利用逻辑地址中的页号找到页框号,与页内偏移值拼接成物理地址
- 第二次:根据物理地址再访问内存,存取指令或数据
多级页表
无快表情况下,对于n级页表,需要访问内存n+1次。
段页式
3次
- 第一次:访问内存中的段表,查询页表的起始地址
- 第二次:访问内存中的页表找到页框号,得到物理地址
- 第三次:根据物理地址再访问内存,存取指令或数据
有快表
快表是硬件实现的,不在内存中。
- 若快表命中,直接得到页框号,可以直接得到物理地址并访问内存,进行指令或数据存取,只需要访问一次内存
- 若快表未命中,需要先访问内存中的页表,得到物理地址,再访问内存进行指令或数据存取,需要访问两次内存
注意:
- 读出页表项后将其存入快表;
- 有些处理机是先查快表,快表不命中再去查内存;有些是快表和内存同时查找,快表命中就终止内存查找;
- 以上所说内容不考虑缺页中断。
虚拟内存
最大容量与实际容量
虚拟内存最大容量由计算机地址结构长度(CPU寻址范围)决定的,实际容量是最大容量和内存外存容量之和的较小值。虚拟内存的访问速度接近内存访问速度(快),成本接近外存(低)。
期末
第二章
- 操作系统概念?操作系统与普通程序的差别?
操作系统是控制应用程序执行的程序,是应用程序、用户和计算机硬件之间的接口。
差别:
1)操作系统是应用程序与硬件间的接口,普通程序在操作系统的支持下运行。(操作系统可以直接安装在硬件上,普通软件不能直接安装在无操作系统的电脑中)操作系统能直接控制硬件,应用软件不能直接控制硬件
2)操作系统负责内存管理、任务调度、进程管理等多种任务,普通程序一般只专注于特定的任务。 - 操作系统的功能
对下:管理资源(包括硬件)
对上:提供服务(作为用户/程序与计算机硬件间的接口)
作为用户/计算机接口的操作系统;作为资源管理器的操作系统;易扩展性 - 操作系统的构成模块
1)进程管理
管理计算机进行的操作,包括进程控制、进程同步、进程通信、死锁处理等
2)存储管理
进行内存分配和管理,包括内存分配、地址映射、内存保护与共享等
3)文件管理和I/O
包括对文件空间的管理、目录管理、文件读写管理等,以及对基本输入输出设备进行管理,包括缓冲管理、设备分配等
4)调度(CPU管理)
单处理器调度和多处理器、多核实时调度 - 操作系统发展脉络
1)无OS,程序员直接与硬件接触,串行处理
2)简单批处理系统,内存中除了OS本身,只存储一个程序
3)多道批处理系统,内存中除了OS本身,还有两个或以上的程序
4)分时系统,用户与计算机直接交互,多个用户可以通过终端同时请求服务,操作系统以时间片为单位轮流执行每个用户程序,多个程序共享计算机的资源。
5)其他,如实时系统等(火车刹车;导弹追踪等)
“计算机系统的发展有三条主线:多道程序批处理操作、分时和实时事务系统,他们在时间安排和同步中所产生的问题推动了进程概念的发展。” - 批处理系统和分时系统的差别
批处理:用户把一批程序放进计算机中之后,不再干预,由操作系统控制他们自动运行,不具有交互性
分时系统:用户与计算机直接交互(有终端),多个用户可以同时执行任务
批处理系统的主要目标是充分利用处理器,而分时系统的主要目标是减小响应时间;批处理系统的操作系统指令源是作业控制语言命令和作业提供的命令,而分时系统的操作系统指令源是终端键入的命令。 - 描述linux系统的特点
1)多用户、多任务
2)采用模块结构,一个模块实现一些特定功能,可以在内核运行过程中(动态地)链接或断开链接。主要有动态链接和可堆叠模块两个特点。主要是为了弥补单内核结构的可维护性和可扩展性较差的缺点。
3)免费且开源,用户可以根据自己需求进行修改
第三章
- 进程的概念;进程与程序的异同
进程就是一个正在执行的程序。
进程是动态的,有一定生命周期的,可以被创建和销毁的,正在执行的程序。
程序是指令的有序集合,是静态的,可以长期保存的,没有正在执行的含义。 - PCB的功能和构成
功能:
保存了进程的充分的信息,可以帮助一个被中断的进程恢复执行。与程序代码和相关数据共同组成进程。
结构:(进程标识信息、进程状态信息、进程控制信息)
进程标识符;优先级;状态;程序计数器;上下文数据等 - 进程相关控制函数
创建、销毁、切换
1)fork
创建一个子进程,一次调用两次返回,子进程返回0,父进程返回子进程的进程号(子进程进程号是父进程进程号+1)。完全复制父进程的地址空间给子进程,父子进程运行的顺序不确定。
2)exit
被动结束,exit退出之前会检查文件的打开情况,把缓冲区的内容写回文件。
3)wait
函数返回值为结束子进程的进程号,当前进程中没有子进程则返回-1。参数为子进程结束状态指针,如果单纯想等待子进程的结束而不关心进程结束状态,参数写入NULL即可;若想获得子进程结束状态,将参数地址写入即可,例如定义int status存储子进程的结束状态,函数调用wait(&status)即可。
一旦函数调用wait(),进程会立即阻塞自己,自动判断当前进程中是否有某个子进程退出,返回该子进程的状态和终止子进程的ID,所以进程总能了解是哪一个子进程终止了。 - 五状态图
注意不能从阻塞态直接变成运行态,只能先就绪再运行;也不能从运行态直接到就绪态,只能先阻塞再到就绪 - 模式切换 & 进程切换
模式切换不一定有进程切换,进程切换一定导致模式切换 - 从进程、操作系统、CPU的视角,看进程切换过程
1)CPU:只负责执行指令,不知道指令的目的
2)进程:不知道其他进程的存在,认为自己在独占所有资源持续执行
3)操作系统:知道每个进程的状态以及切换顺序 - 进程创建的流程(fork)
进程 = 加载进内存里的程序 + 进程控制块
流程:分配进程标识符;分配空间;初始化进程控制块;设置正确的链接;创建或扩充其他数据结构。
fork一次调用,两次返回
中断:与进程无关的外部设备引发的(硬件中断)
陷阱:当前进程执行过程中遇到了一个引发异常的指令
中断和陷阱统称为系统中断
进程切换必定有中断,中断不一定导致进程切换
系统调用:当前进程主动调用外部设备
第四章
- 线程的概念;线程与进程的关系和异同
为什么引入线程:进程的资源所有权与调度/执行功能独立,操作系统应该能分别处理它们。
1)进程是资源分配的基本单位,线程是资源执行的基本单位。
2)进程有独立的内存空间和系统资源,线程共享所在进程的所有资源。
3)进程切换时需要保存和加载进程状态,线程切换时只需保存和加载线程上下文信息 - 线程实现方法和优缺点
1)ULT
管理线程的所有工作都由应用程序完成,内核意识不到线程的存在,任何应用程序都可以使用线程库设计成多线程程序。
线程阻塞导致进程阻塞;一个进程中只有一个线程可以执行
线程切换不需要切换到内核模式;可以在任何OS中运行
2)KLT
内核为进程内的每个线程维护上下文信息,基于线程池完成调度。应用级没有线程管理代码,只有一个到内核线程设施的应用编程接口。
线程切换要切换到内核模式
一个线程阻塞不会导致整个进程阻塞;可以同时把一个进程中的多个线程调度到多个处理器中
3)混合
线程的创建、调度和同步在用户空间内完成,将可能频繁发生系统调用的线程或多个并发线程映射到内核空间。
线程切换开销小,一个进程的多个线程可以并行执行,一个线程阻塞不会导致整个进程阻塞
第五章
- 信号量定义
信号量是一个与队列有关的整型变量,是用于进程间传递信号的一个整数值。只可进行初始化、递减和增加三种原子操作。递减操作用于阻塞进程,递增操作用于解除进程的阻塞。 - 并发的四个问题及其描述
1)互斥
同一时刻只允许一个进程访问临界资源,这个进程可以排斥掉其他进程。
2)同步
并发进程之间在执行顺序上进行协调,有效地共享资源,使程序执行结果有可再现性
3)死锁
一组进程都在等待只有这组中其他阻塞进程才能触发的事件而导致的永久阻塞现象
4)饥饿
进程等待时间没有上界,永远无法执行 - 条件竞争 定义和例子
多个进程或线程读写一个共享数据,最终运行结果依赖于它们执行的相对时间 - 进程间关系
1)互相不知道对方存在
多个独立进程。
关系:竞争
问题:互斥 死锁 饥饿
2)间接知道对方存在
不需要知道pid
关系:共享合作,共享某些对象
问题:互斥 死锁 饥饿 数据一致性
3)直接知道对方存在
可以通过pid互相通信
关系:通信合作
问题:死锁 饥饿 - 解决同步互斥的三类方法
1)硬件
关中断;专用机器指令(testval、swap和exchange等)
2)软件
dekker、Peterson
3)操作系统
(1)信号量
一个以上的进程通过信号量传递的信号进行合作
(2)管程
不支持分布式系统
- 使用信号的
局部变量只能被管程的过程访问,不能被外部过程访问
一个进程通过调用管程的一个过程进入管程
任一时刻只能由一个进程在管程中执行 - 使用通知和广播的
- 信号量(操作系统级)和管程(系统库级)的条件变量 概念以及异同
条件变量可以一次性唤醒所有等待者,信号量不行
条件变量只能被管程的过程访问,信号量可以被所有进程访问
条件变量通常与互斥锁结合使用
线程等待条件变量时会主动进入等待状态,等待信号量时会被阻塞而进入等待状态
第六章(银行家算法)
- 死锁的概念和例子
一组相互竞争系统资源或进行通信的进程间的永久阻塞。
一组中的进程都在等待某事件,而只有这组进程中被阻塞的其他进程才可触发该事件时,发生死锁。 - 死锁的条件
必要:互斥;占有且等待;不可抢占
充要:3个必要 + 循环等待 - 死锁解决方法
1)死锁预防(不允许死锁发生)
防止四个条件中的至少一个
间接:阻止三个必要条件中任何一个条件的发生
直接:防止循环等待
2)死锁避免(不允许死锁发生)
允许三个必要条件,可以比死锁预防允许更多的并发
动态检测,通过判断当前请求是否可能导致死锁来决定是否允许当前请求,以保证不会发生死锁
- 进程启动拒绝
- 资源分配拒绝(银行家算法)
3)死锁检测(允许死锁)
死锁检测算法
死锁恢复
4)综合方法
第七章
- 内存管理技术
1)固定分区:程序整体全部加载且连续,有内部碎片
2)动态分区:程序整体全部加载且连续,有外部碎片
3)简单分页:程序分块全部加载,不连续,内部碎片
4)简单分段:程序分块全部加载,不连续,外部碎片 - 内存管理需求
重定位:每次被换出再换入时,放在内存的不同位置
保护:每个进程只能访问自己的地址空间
共享:合作的进程可以访问相同的数据结构
逻辑组织:以某种模块形式组织程序和数据
物理组织:系统负责在内外两级存储器之间移动信息
第八章
- 虚存的概念 为什么需要虚存
利用外存扩充内存,产生一个比有限的实际内存空间大得多的、逻辑的虚拟空间
虚存支持更高的并发度;能解除用户与物理内存之间没有必要的紧密联系;进程空间可以大于实际内存空间 - 虚存实现方法
1)分页:程序分块部分加载,不连续,内部碎片
2)分段:程序分块部分加载,不连续,外部碎片
3)段页式(先分段再分页)
段表再分页。地址结构:段号+段内页号+页内偏移值
查段号得到页表基地址,在页表中获取物理页号,再与页内偏移值共同得到物理地址 - 什么是缺页中断 及其处理流程(可画图)
某个表项的存在位未置位,也就是这一页不在内存中,就会产生内存访问故障,也就是缺页中断。 - 缺页率与页框大小的关系(图)
第九章
- 三种调度类型(长中短)(画图)
1)长程调度
决定哪个程序进入系统中处理,控制系统并发度
2)中程调度
交换功能的一部分(执行换入换出),根据管理系统并发度和换出进程的存储需求来换入
3)短程调度
分派器,执行最频繁,决定下次执行哪个进程 - 调度规则
面向用户,与性能相关
周转时间:提交(被调度进入内存)到完成,其实也就是“等待+从运行开始到运行完毕的时间”,因为进程不一定从开始运行就一直运行到结束,中途也可能因为各种原因阻塞再继续运行,所以不能说是“等待+运行”,但是可以说是“等待+服务”
响应时间:提交到开始接收响应(用户角度)
时限:完成的最后期限
面向系统,与性能相关
吞吐:单位时间内完成的进程数
资源利用率:处理器处于忙状态的时间百分比
面向系统,其他
【公平性:保证没有进程处于饥饿状态】 - 优先级和调度策略
纯优先级调度:总是优先选择有较高优先级的进程
抢占式:
1)轮转法RR
目的是降低响应时间(而不是周转时间)
取决于进程长度和时间片大小
2)最短剩余时间SRT
偏向短进程
3)反馈法MLFQ多级反馈队列
预测进程类型,为多个优先级各自维护一个队列
非抢占式:
1)FCFS
没有优化平均周转时间和系统吞吐
偏向长进程和处理器密集型进程
2)最短进程优先SPN
取决于预测准不准
偏向短进程
3)最高相应比优先HRRN
响应比 = (等待时间 + 预测执行时间)/ 预测执行时间
一定程度上避免了长进程的饥饿
第十章
- 实时调度算法(特点及其过程分析)
1)静态表调度
执行关于可行调度的静态分析,分析结果是一个调度,确定一个任务何时须开始执行
2)静态优先级抢占调度
执行一个静态分析,给任务指定优先级,使用基于优先级的抢占式调度
3)基于动态规划的调度
运行时动态确定可行性,如果新任务和之前所有任务都不会错过各自的最后期限,就接受并执行
4)动态尽力调度
不执行可行性分析,试图满足所有最后期限,终止所有已经开始运行但是会错过最后期限的进程 - 限期调度
EDF(最早最后启动期限),也就是先执行最晚启动时间最早的任务。如果有先验知识,可以进一步优化成为有自愿空闲时间的EDF - 速率单调调度RMS
周期越小优先级越高,每轮选择优先级最高的执行
第十一章
效率和通用性
- I/O缓冲作用和组织形式
- 面向块的设备:CD-ROM、磁盘和USB智能卡。
- 面向流的设备:终端、打印机、通信端口、鼠标和其他指示设备及其他大多数非辅存设备。
缓冲的意义在于:因为I/O设备通常比CPU慢很多,所以为了避免CPU一直等待I/O,设置缓冲区,以让CPU不至于因等待I/O而处于空闲
1)单缓冲
进程发出IO请求时,为其分配一块位于内存中系统部分的缓冲区
只有一个缓冲区所以不能同时读写
对于面向块的设备,相当于预读一个块(输出也同理
对于面向流的设备,每次传输一行或者一字节(输出同理
对于每次一行的,输入时用户进程要挂起
2)双缓冲
在单缓冲基础上,改成分配两个缓冲区
对于每次一行的,输入输出都不用挂起(除非进程速度超过了双缓冲速度
3)循环缓冲
相当于有两个以上的缓冲区,循环使用
2. 磁盘调度参数和策略(都是非抢占的)算平均寻道时间
寻道时间(最长的) + 旋转延迟 = 存取时间(访问时间)
传输时间:读/写数据时间
1)FIFO
2)优先级PRI:短作业和交互作业的优先级高,长作业会等待较长时间,有利于先执行紧急任务
3)FILO:减少磁臂运动
4)最短服务时间优先SSTF
选择从当前位置开始移动(磁道数)最少的请求
能选择当前而言寻道时间最小的请求,不能保证平均寻道时间最小
5)SCAN
先沿一个方向处理请求(磁道增大或减小),处理完后反转处理方向
对最近经过的区域不公平,局部性利用不好
6)C-SCAN
全程只沿一个方向处理请求,比如有30,50,100,150,180,从100开始,先处理150,180,然后从30开始处理30和50
7)N步SCAN和FSCAN
N步SCAN:把所有请求分成若干长度为N的队列,每次用SCAN处理一个子队列。新请求不添加到当前在请求的队列中
FSCAN:使用两个子队列,开始时所有请求在一个队列中,所有新请求插入另一个队列中
第十二章
文件权限从低到高:无;感知;执行;读;追加;更新;改变保护;删除
-
文件目录
单级;二级;层次或树状 -
文件共享
root;特定用户;user group;public -
文件分配
文件分配表FAT
预分配;动态分配
1)连续分配
连续变长分区
每个文件需要一个FAT表项存储起始盘块和分区长度
外部碎片
压缩
2)链式分配
每个盘块中存储下一个盘块的位置
每个文件需要一个FAT表项存储起始盘块
合并
3)索引分配
每个文件用一个索引块存放索引信息
每个文件需要一个FAT表项存储索引块号 -
空闲空间管理方式及特点
1)位表
每个盘块用一位(0/1)表示是否已分配
2)链式空闲区
每个空闲分区的起始盘块存储当前分区长度和下一个空闲分区的开头
查找空闲块和查找空闲分区的方法不同
3)索引法
所有空闲分区看作一个文件 -
文件组织形式概念和特点
逻辑层:
1)堆文件
没有结构,最简单,按照到达顺序收集,记录可以有不同的域,记录以及记录中的域都是变长的。
穷举查找,容易修改。
2)顺序文件
记录以及域都是定长的,记录格式相同。
顺序查找(匹配关键域)
逻辑组织直接对应物理组织。
日志文件/链表
3)索引顺序文件
按关键域顺序组织,在顺序文件基础上增加了支持随机访问的文件索引和溢出文件。
必须先查找索引。支持顺序访问和随机访问。
4)索引文件
完全索引/部分索引
增加记录时索引文件必须全部更新
5)直接文件/散列文件
记录长度固定,快速访问,通常一次访问一条记录
有关键域,使用基于关键字的散列 -
文件分配方式的特点和分配过程(图)
物理层:
1)连续分配
使用大小可变分区的预分配策略
每个文件需要一个表项
外部碎片,通过紧缩算法解决
2)链式分配
每个文件需要一个表项
没有外部碎片
适合顺序文件
局部性原理不适用
3)索引分配
支持顺序访问和直接访问
每个文件在表中有一个一级索引
基于块:没有外部碎片
基于大小可变的分区:局部性好,文件整理可以减少索引数量
空闲空间:
1)位表
向量中的每一位对应磁盘中的一块
易于寻找连续空闲块,非常小,但很长
需要驻留在内存中,一般有一个辅助查找的数据结构
2)链接空闲区
使用指向每个空闲区的指针和他们的长度值链接空闲区,不需要磁盘分配表
把数据写入块之前需要先读这个块
3)索引
使用索引表,基于可变大小的分区,每个分区一个表项
4)空闲块列表
所有空闲块序号保存在磁盘的一个保留区中
很大,需要保存在磁盘中(或者一小部分可以在内存中)
页置换策略
- OPT最佳
必须知道未来的页调用顺序,不存在于实际中,作为衡量其他算法性能的标准 - LRU最近最少使用
换出最长时间未被使用的页 - FIFO先进先出
换出置留在内存中最久的页
Belady异常:页数增加反而导致缺页率增加 - Clock时钟
有一个指针,指向当前修改位的下一位;每个页有一个使用位,刚被换入后置为1,被访问后置为1;要换出时,若当前指针所指的页为0,直接置换并把指针下移,若为1,指针指向下一个再看;若全是1,直接全部置为0,然后换出当前所指位置的页。 - NRU最近未使用
Clock的改进,有“访问”和“修改”两个位。需要换出时,从指针当前位置开始,换出遇到的第一个两个位都是0的;若找不到,第二轮扫描换出遇到的第一个访问位是0,修改位是1的页,同时把所有被跳过的页的使用位置为0;若还是找不到,再进行第一轮,这一轮一定能找到可换出页。