OS总结

操作系统的概念
操作系统是计算机系统最基础的系统软件,管理软硬件、资源,控制程序执行,改善人机界面,合理组织计算机工作流程,为用户使用计算机提供良好的运行环境。
简而言之,操作系统是方便用户管理和控制计算机软硬件资源的系统程序集合
操作系统是连接用户与计算机硬件的桥梁
广义的操作系统系统概念范畴:操作系统供应商提供的操作系统发行版中包含的所有程序和数据
狭义的操作系统定义:从计算机加电运行后一直在内存里运行的那个程序(又称内核,core/kernel)
操作系统是对计算机资源进行管理的软件。 从用户的观点来看,操作系统是控制和管理计算机资源的软件。 操作系统是一种系统软件。
操作系统核心模块
CPU管理: • 进程管理:对任务在CPU上的执行进行抽象,形成进程概念 • CPU调度:对如何为任务分配CPU时间 • 进程同步控制:在多任务环境下对进程的并发执行进行同步控制
内存管理: • 内存分配 • 虚存管理
文件系统: • 文件系统接口设计 • 文件系统实现
设备管理: • 设备分类 • I/O软件 • 设备驱动模型
操作系统的分类与发展
操作系统简史

操作系统的分类
单道程序操作系统 代表:DOS 优点:解决人机矛盾和CPU与IO设备速度不匹配问题,提高系统资源的利用率和系统吞吐量。 缺点:不能充分的利用系统资源,现很少使用 特点:
在任何时候,位于内存中的程序可以使用系统中的一切资源,不可能有其他程序与之竞争
内存中只有一个程序,各个程序是按次序执行的
资源利用率低
多道批处理操作系统 代表:Multics 优点:多道程序并发执行,资源利用率高,系统吞吐量大 缺点:平均周转时间长,无人机交互功能 特点:
CPU与外部设备充分并行
外部设备之间充分并行
CPU使用率高 吞吐量高
分时操作系统 代表:UNIX 优点:同时支持多个用户进行人机交互式操作,提供了良好的用户体验;管理和共享计算机资源,使得多个用户可以同时访问和利用系统资源;快速响应用户的请求,短时间内完成任务,提高了系统的效率和性能。 缺点:不能优先处理紧急任务 特点:
允许多个用户同时使用一台计算机,即在一台主机上连接多个终端,每个终端上有一个用户在使用。
用户与系统进行广泛的人机对话
由于采用了时间片轮转的方式,每个用户都能在短时间内得到系统的响应,从而使用户觉得系统是在即时地为他们服务。
系统中每个用户各占一个终端,彼此独立操作,互不干扰。各自拥有独立的操作空间和数据空间
可以通过添加新的功能和模块来扩展系统的功能和应用范围,从而满足用户日益增长的需求。
实时操作系统 代表:VxWorks 硬件:必须在绝对严格的规定时间内完成处理 软件:接受偶尔违反任务截止时间规定 优点:能优先处理紧急任务 特点:
具有故障检测和恢复机制,以确保在发生错误时能够迅速恢复并继续执行实时任务
支持基于优先级的任务调度,确保高优先级的任务能够得到优先处理。
能够实时地监控和控制生产过程,确保系统的稳定性和安全性。
通常提供内存锁定和同步机制,以确保实时任务在执行过程中不会被其他任务打断或干扰。
网络操作系统 代表:Windows Server、Mac OS X Server、Linux、NetWare 优点:可以监控网络上的活动;网络被管理 特点:
具有很强的异构性,可以运行在不同的硬件和软件平台上,满足不同用户的需求。
提供必要的网络连接支持,能够连接两个不同的网络,实现网络间的通信和资源共享。
通常采用防火墙、入侵检测等安全措施,以保护系统的安全。
分布式是网络操作系统的一个显著特点,意味着它可以同时运行在多个服务器上,为用户提供更多的访问路径。
分布式操作系统 代表:Kubernetes 特点:
模块化:划分为多个功能模块,每个模块负责完成特定的任务。
并行处理:节点之间可以相互组合,以分布协同的并行方式执行计算任务,提高了整体计算能力。
可扩展性:通过增加新的节点,可以轻松地扩展系统的计算能力和存储容量。
冗余容错:由于系统由多个节点组成,当一个节点出现故障时,其他节点可以继续正常工作,提高了系统的容错能力。
并行和并发的区别
并发:在单个CPU核上执行多个任务 并行:在多个CPU核上执行多个任务。
并发实际上是通过快速交替执行多个线程或进程来实现的,而非真正的同时执行。
操作系统结构

运行机制
双模式
用户模式:
是程序运行的较低权限级别。
应用程序代码和数据保存在用户空间,该空间是程序私有的,其他程序一般无法直接访问。
程序只能使用已经开放给它的系统资源,不能直接访问内核空间,从而保证了系统的稳定性和安全性。
当执行应用程序自己的代码时,系统处于用户模式。
使应用程序在受限的权限下运行,从而降低了恶意代码或误操作对系统稳定性的影响。
核心模式:
操作系统管理的程序执行时,机器所处的状态,也称为管态、系统态或核心态
正在执行的代码具有对底层硬件的完整且不受限制的访问
可以执行任何CPU指令并引用任何内存地址
保留给操作系统的最低级别、最受信任的功能
负责处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。
用户与系统交互的操作界面的基础
具有高度的权限,需要采取各种安全措施来保护核心模式的稳定运行
当运行在用户模式的应用程序需要输入输出、申请内存等比较底层的操作时,必须调用操作系统提供的API函数,从而进入内核模式;操作完成后,继续执行应用程序的代码,就又回到了用户模式。
从用户模式切换到内核模式的条件包括:异常、系统调用和外部设备的中断。
两种指令
特权指令:
指在计算机系统中,只有具有特定权限的用户或操作系统内核才能够运行的特殊命令
常用于执行一些高级操作,如修改系统配置、安装软件、管理文件、启动设备、设置时钟、控制中断屏蔽、清内存、建立存储保护等
限制普通用户对这些特权指令的访问
通常在系统态(核心模式)下执行,因为在这个状态下,它们可以访问系统的所有资源,并执行任何CPU指令。
非特权指令:
是指允许用户直接使用的指令,它们通常用于执行一般性的操作和任务
不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间。
应用程序所使用的都是非特权指令,如进行算术运算、逻辑运算、数据传送等。
非特权指令通常在用户态下执行,这是应用程序的正常运行环境。
操作系统提供的服务
UI: CLI(命令行) GUI(图形用户界面) TSI(触控界面)
程序执行: 1.磁盘=> 内存 2.CPU从内存中取指执行 3.程序退出执行 操作系统要在程序退出执行后,进行资源回收
I/O管理: 现代操作系统将I/O操作封装在内核
文件系统: 现代操作系统通过文件系统来管理各类持久化信息
通信: 任务间通信协同是必要的基本支持
错误检测: 硬件错误 软件错误
服务保障类: 资源分配:CPU资源的分配、内存资源分配、磁盘空间分配 日志:通过日志记录并统计,便于在系统出现问题时,通过技术手段找到问题根源并加以修复 系统保护与安全服务:对系统资源实施访问控制,保证系统安全
系统调用
操作系统作为软件,也需要设计软件接口,操作系统向用户态环境提供内核服务的最原始接口。
系统调用是操作系统在内核里的一些内建函数,通过系统调用接口层提供给应用层使用。
操作系统的核心服务代码都会被保护在特殊的执行模式下。应用层发起系统调用,需要经历从用户态到核心态的切换
系统调用的参数传递
系统调用过程中会发生执行模式从用户态到内核态的转变,参数传递方面需要考虑这方面因素
寄存器传参
优先选择寄存器传参,效率高
问题:可用寄存器数量有限
内存块传参
分配一块内存,存放系统调用参数,并将参数块指针作为参数传递给内核
当参数多于可用寄存器数量时采用
栈传参
用户程序中将参数压入栈
内核从栈中将参数出栈
实现原理

- 程序执行过程中执行系统调用open()
- CPU执行模式从用户态切换到核心态
- 系统根据open系统调用的编号i,在系统调用表中查找,得到指向内核中系统调用open具体实现的代码入口地址
- 转去执行系统调用open的实现代码
- 从系统调用代码返回后,CPU执行模式从核心态切换回用户态
- 应用继续执行后续代码
OS结构设计
单内核(宏内核)
所有OS功能模块均在内核态工作
代表:DOS(简单结构),UNIX(层次结构)
DOS:系统没有进行清晰的系统模块划分,应用程序与OS内核之间缺少隔离保护
UNIX:构造和调试简单化,每层只能利用较低层的功能和服务,需要对层的详细定义,效率较低
单内核是一种把所有的服务都集中在一起的内核设计。
它的优点是性能高,因为所有服务都在内核中运行,调用过程简单,效率高。
缺点:如果内核中的一个服务出现问题,可能会影响到整个系统的稳定性。维护难度大
微内核
一种极精简的OS内核设计,仅将内存地址空间管理、线程调度、进程间通信纳入内核,而将文件系统等模块置入用户空间
代表:Mach

微内核优点:可移植性高、可扩展性强、稳定统一的接口、商业、很好地支持分布式系统、结构简单,容易理解和维护
缺点:需要频繁切换模式,效率低

混合内核
单内核与微内核的混合结构
代表:Windows 2000、XNU
优点:既有宏内核的性能优势,又有微内核的稳定性优势
缺点:复杂性高,需要仔细地选择哪些服务放在内核中,哪些服务放在用户空间中
进程管理
进程概念

什么是进程
程序的执行是一个过程,OS将其抽象为一个核心概念——进程
程序:静态的存在=>纸带上的0和1,软盘/硬盘上的可执行文件
进程:动态的对象=>程序的执行
进程是一个动态的概念。进程从开始到执行结束,有一个完整的生命周期
进程是程序在给定输入数据集上的一次执行,是OS进行资源分配的基本单位
进程的组成
代码区
程序的代码(指令序列)
数据区
运行中供代码访问的各类数据
PCB(进程控制块)
PCB是OS内核中用来表示进程的唯一数据结构
PCB是OS为控制进程而设计的专门数据结构
OS通过PCB来获取进程相关的信息和对进程实施控制
进程特征
动态性
并发性
独立性:进程有自己独立的地址空间,独立获取资源
异步性:进程以不可预知的速度向前推进,可能导致运行结果不确定
结构性
进程状态

new (新建状态):进程刚被创建好时,处于new状态,等待被系统接纳
ready(就绪状态):已经被成功加载进内存并初始化完毕,等待系统分配CPU资源
running(运行状态):已经从就绪状态被调度器选中,正在利用CPU执行
waiting(阻塞状态):进程执行受到阻碍,必须暂停的状态。阻碍进程继续执行的因素可能有:I/O,等待某个事件发生
Terminated(终止状态):进程执行完毕后等待被系统清除的状态
进程调度
多任务竞争使用CPU资源,需要对它们进行协调
进程不断在变换状态,操作系统需要对不同状态的任务进行管理
上下文
当进程获取对CPU控制,以及进程退出对CPU控制时,要保存进程执行的现场(又称上下文)
用户级上下文:Code, Data, User Stack&Heap,共享内存区
寄存器上下文:通用寄存器、程序寄存器(IP)、处理器状态寄存器(如:EFLAGS)、栈指针(例如:ESP);
系统级上下文:进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈
短程调度
从就绪队列选择合适进程到CPU执行
中程调度
通过交换技术在内存和交换空间之间交换进程映像
长程调度
将作业调入内存(涉及批处理作业,现代OS不一定有)
进程间通讯

进程之间的关系可能是独立,也可能是相互协作。
进程间的协作需要互相传递信息,因此需要专门的通信机制支持
低级通信(Low-Level IPC):用于进程控制信息的传递,传输信息量相对较小
高级通信:主要用于进程间信息的交换与共享,传输信息量相对较大
线程概念

线程属性
线程是将进程的计算任务进一步细分后得到的更细粒度的计算单位
线程概念:一串执行的代码流(通常实现为线程主函数)
线程:进程中一个单一顺序的控制流。
同一进程中的线程共享该进程内的所有资源
线程是处理机调度的基本单位
线程管理数据结构:线程控制块(Thread Control Block, TCB)
线程的实现方式
线程分类
用户级线程:在用户态以线程库的形式实现,对用户级线程的操作通过调用用户态线程库API进行
优点:线程的调度不需要内核直接参与,控制简单。没有内核线程机制支持,也可以实现用户级线程
缺点:一个用户级线程的阻塞将会引起整个进程的阻塞
内核级线程:在内核态实现,OS内核直接管理,线程的创建由系统调用完成
优点:是内核中参与竞争CPU资源的基本调度单位。内核级线程所耗费的资源比进程小,切换效率比进程切换高
缺点: 比用户级线程还是更重量级,切换效率不如用户级线程
用户级线程与内核级线程比较
两者之间的差别在于性能。
内核级线程能够被内核感知,而用户级线程不能
用户级线程的创建、撤销和调度不需要内核的支持,由用户级线程库完成
用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断
线程模型
M:1 多对一
代表:GNU Portable threads
多个用户级线程绑定到一个内核级线程(M:1)
一个用户级线程引起阻塞,会导致整个进程中所有的线程阻塞
1:1 一对一
代表:NPTL(by redhat)
将1个用户级线程绑定到1个内核级线程(1:1)
需要内核级线程的数量多,消耗更多内核资源
M:M 多对多
代表:Solaris threads、oracle
将多个用户级线程绑定到多个内核级线程(M:N)
管理复杂,影响效率
CPU调度

CPU调度基本概念
并发:在单个CPU核上执行多个任务 并行:在多个CPU核上执行多个任务。
并发实际上是通过快速交替执行多个线程或进程来实现的,而非真正的同时执行。
调度的实质:对CPU资源的虚拟化
调度开销:
从当前就绪队列中选择一个最合适的任务,将其状态转为运行态
切换上下文
将程序从核心态切换回用户态
跳转到刚转入运行态的任务的下条指令,开始执行
调度时机:
1.进程转入终止态
2.进程阻塞
3.进程被唤醒
4.进程被中断(如定时器中断)
1,2: 运行态进程主动放弃CPU,因此属于非抢占点
3,4: 属于因中断等事件产生,而可能剥夺运行进程的CPU时间,因此属于可抢占点
调度算法评估标准
CPU利用率
吞吐率:单位时间内完成的进程(任务)数
等待时间:进程建立后等待被服务的时间。等待时间越短,调度算法效果越好
周转时间:进程完成时间–进程提交时间。平均周转时间越短,说明进程的总体执行效率较高,也就表明调度算法较优
响应时间:从发出服务请求,到请求被满足的时间跨度。响应时间是分时系统中的关键调度指标
调度算法
先来先服务(First Come, First Serve) FCFS
新进入就绪态的进程放在队尾,先到的先服务

Convoy Effect(护航效应):FCFS算法不稳定,长进程先于短进程到达,会导致平均等待时间拉长
短作业优先(Shortest Job First) SJF
每次进行调度时,优先选择下一个CPU周期最短的进程
以平均等待时间为指标,SJF是最优的调度

SJF存在饥饿问题:时间长的进程会被一直抢占无法进行
最短剩余时间优先(Shortest Remaining Time First) SRTF

SRTF调度可被视为SJF的抢占式版本
SRTF存在饥饿问题:长作业等待时间过长的问题
优先级调度
每个进程被赋予一个优先数,每次调度时,优先级最高的任务被选中执行
有的系统优先数越大,优先级越高,有的系统相反
优先级调度又分为:抢占式优先级调度和非抢占式优先级调度

存在饥饿或无限期阻塞:可能会继续执行高优先级进程而低优先级进程永远不会被执行。
可以采用老化机制进行饥饿的预防
轮转调度 RR
进程轮流使用CPU,将CPU的时间公平的分给进程
轮转调度是分时系统中的基础调度算法
系统将所有就绪进程按到达时间的先后次序排成一个队列
进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片
在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行


多级队列调度 MLQ
不同队列可由不同的调度算法管理 例如:将进程分为前台交互就绪队列和后台批处理就绪队列;前台进程调度使用RR算法,后台进程调度采用FCFS算法
为不同队列进程分配不同大小的时间配额 例如:前台进程队列使用80%的CPU时间,后台进程队列享用20%的CPU时间

优点:
不同类型队列自由选择调度算法(调度策略灵活)
可以为不同类别的进程队列分配不同的时间配额(CPU时间分配策略灵活)
缺点:
进程固定于特定优先级队列(不便于动态调控)高优先级队列中的进程具有优势,低优先级队列中的进程面临饥饿问题的概率高(Starvation)
多级反馈队列调度 MLFQ
MLFQ调度,设置多个不同优先级的就绪进程队列,并允许为每个优先级队列设置不同的调度算法或调度参数(与MLQ调度一致)。
与MLQ调度不同之处在于,MLFQ调度会持续分析进程的运行行为,并允许必要时对进程进行优先级调整,即允许进程在不同优先级队列间移动。
在执行完一个时间片后,任务是否会降低优先级(Demote)

进程同步

进程协作可分为两大类型:直接协作和间接协作
进程之间间接协作 多个进程竞争使用共享数据 间接作用不会强制合作进程之间遵循特定的先后顺序。间接合作进程必须保证对共享数据的一致性访问
临界区问题
多个进程并发访问共享变量 访问共享变量的代码区域,称为临界区
临界区要求以互斥方式访问
硬件临界区解法
提供TestAndSet指令(原子操作指令)
使用TestAndSet来处理上述临界区问题 . TestAndSet(lock)指令语义∶ . lock=0,则将lock置1,返回0. lock=1,则直接返回1
软件临界区解法

信号量
定义一个整型量S,对应两个原子操作P和V P:申请1个资源(若S大于0,则操作成功,S减一,若S小于等于0,则该进程阻塞等待资源,S减一) wait V:释放1个资源(S加一) signal
S若为负数,则其绝对值代表等待资源的进程个数
生产消费者问题

读者写者问题

理发师问题

管程
提供对共享资源的统一管理 提供一组对资源操作的接口 对并发进程对管程中资源访问的控制,由管程统一实现

死锁
死锁是指一种系统状态,在该状态下,存在一组进程,其中每一个进程都持有至少一种资源,并且在申请由该组进程中的另外一个进程所持有的资源。
死锁的两个根本原因:1.系统资源不足;2.进程推进顺序不当
死锁的四个必要条件:资源以互斥方式使用;持有并等待;已持有资源不可被剥夺;循环等待
死锁的预防
进程必须获取工作所需所有资源,才能开展工作——破坏持有并等待
要求进程按序使用资源——破坏循环等待
死锁避免
在程序运行起来后,通过对每次资源分配请求进行系统审核,通过拒绝为不安全的资源请求进行分配,来达到避免死锁风险的目的


死锁检测
单资源:定期启动对进程等待图的环路检测,如果发现等待图中有环,那么报告死锁发生
多资源:银行家算法
死锁解除
重新启动、撤销进程、剥夺进程资源、进程回退、视而不见
内存管理
内存管理

地址绑定
逻辑地址(CPU在程序执行期间发出的地址)映射到物理地址(内存单元的实际地址)
绑定时机:编译、加载、运行
分为静态重定位和动态重定位
静态重定位:在执行前就将逻辑地址转换为物理地址
动态重定位:在执行过程中将逻辑地址转换为物理地址
内存保护

内存扩充
覆盖和交换
交换是虚存机制的重要基础
内存分配
连续内存分配
固定分区分配
将连续内存划分为大小固定的区域
存在内部碎片
动态分区分配
存在外部碎片问题
根据进程的实际需要,动态地为之分配内存空间
首次适应算法(First Fit):进行内存分配时,从链首开始顺序查找,直到找到一块分区的大小可以满足需求时,按照该作业的大小,从该分区中分配出内存,将剩下的空闲分区仍然链在空闲分区链中
最佳适应算法(Best Fit):将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。每次从链首进行查找合适的空闲分区为作业分配内存,这样每次找到的空闲分区是和作业大小最接近的,所谓“最佳”
最坏适应算法(Worst Fit):将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。
分页
分页是一种连续内存分配方法
将进程的逻辑地址空间按页划分 将物理内存的地址也按页划分 每个页代表一组连续的地址
进程被分配的页在物理内存中不一定连续 通过一个页表来维持进程中逻辑页与物理页之间的映射关系

分页地址分为两部分:页号和页内地址
关于分页的一些名词解析
页面(页):将用户进程的(逻辑)地址空间划分为固定且大小相等的一个个区域。
页面大小:页面的一个划分区域的大小
页号:表明页面在划分区域过后的次序
位移量、偏移量、页内地址:页内地址即位移量或称偏移量,三者大小都等同于页面大小
页表:系统为每个进程建立的页面映像表(逻辑映射物理)
页表项:页表的其中一项
页表项大小:页表中一行的大小
页表长度:指页表项的个数
帧、物理块、页框:物理块即页框、帧,是将内存空间划分为与先前页面的大小相等的若干块
页内碎片:不足以划分为一页的空闲地址
页表(基址)寄存器:系统中只设置一个页表寄存器,进程执行时,将页表始地址和页表长度放入页表寄存器,将页表寄存器的开始地址和相应页号相加得到页表中映像的物理块的具体位置,然后通过该物理块对应于内存中的实际(物理)地址,将页内地址放入其中。
页式地址转换

1.根据逻辑地址算出页号p、页内偏移量offset 2.页号的合法性检查(与页表长度对比) 3.若页号合法,再根据页表起始地址、页号找到对应页表项(查页表) 4.根据页表项中记录的物理页号,offset,确定最终的物理地址 5.根据物理地址,实际访问对应的内存单元

通过页表读取物理地址中的内容需要两次访问主存,一次是访问页表获取物理地址,一次是访问物理地址获取内容
快表(TLB)存在cache内,可以减少一次主存访问(命中的话)

多级页表

单级页表占用连续物理空间过大,采用多级页表


N级页表需要N+1次访问主存(假设没有TLB)
分段

分段
存在外碎片的可能性小
将进程地址空间按照自身的逻辑关系划分为若干个段,每个段从0开始进行内部编址 每个段在内存中占据连续空间,但各个段可以不相邻
分段机制下的逻辑地址:段号(存储在段寄存器)+段内偏移(一般是一个CPU字)
段地址是二维的——因为段与段之间不连续且段长不固定
段表基址寄存器STBR-记录段表的基地址 段表限长寄存器STLR-记录段表的长度 如果s < STLR,段号s是合法的
段表
段表将二维的逻辑地址映射到一维的物理地址上。
段表项:base(段基地址)+ limit(段的大小)
1.由逻辑地址得到段号,段内偏移 2将段号与段表寄存器中的段表长度比较,检查是否越界 3.根据段表基地址和段号,查找得到逻辑地址对应的段表项 4.将段内偏移与段表中记录的最大偏移比较判断地址是否越界 5.依据段表中的"基地址+段内地址""得到最终的物理地址 6.访问目标内存单元
也是两次访问主存
分段 分页对比
分页对用户不可见,分段对用户可见 分页的地址是一维的,分段的地址是二维的 分段更易实现对一块逻辑数据区域的整体保护 分页(单级页表),分段访问:都会导致一次逻辑地址访问需要2次实际的访存操作 分段分页均需要块表TLB进行效率优化
段页式存储

在段式存储和段页式存储中,逻辑地址都是用<段号,段内偏移>来表示,只是段页式方式下,段内偏移可以被拆分成页号和页内偏移两部分,从而实现段内分页的效果。 从用户角度看,两者都是2维地址空间。
虚存和请求分页

虚存
进程初始状态时,并不一次性将逻辑地址空间的所有代码和数据加载入物理内存 进程执行过程中,根据当前执行的局部,根据需要加载所需的逻辑空间内容到物理内存
不再需要一次性加载程序的所有代码和一次运行所需的所有数据,可以节省大量物理内存 使得进程的创建更有效率减少IO操作 支持更多的并发进程 方便实施在进程间共享物理内存
实现虚存的技术:按需分配 + 惰性加载
页表机制

缺页异常(缺页中断、页故障)
执行期间,每一次访存,都会面临两种可能: (1)若访问的逻辑页未在内存,导致缺页异常——在处理缺页异常的过程中,将该逻辑页调入某物理页 (2)若访问的逻辑页已在内存,则正常访问
当访问有效位为i(未映射物理地址)的逻辑页时,由CPU的内存管理单元(MMU)发出缺页中断(页故障、缺页异常),此时进行页面的惰性加载

页置换
页置换:当物理内存已满时,要加载新的逻辑页,此时需要腾出一个已被占用的物理页
1.从磁盘上获取所需的逻辑页 2.在分配页框时,如果没有空闲页框可用了,则选择一个牺牲页。如果选中的牺牲页内有数据被修改过,那么必须将页框内的数据写回磁盘 3.分配页帧,将需要的页面调入该页帧,并同时更新页表 4.重启引发页故障的指令
FIFO
每次选择在页帧内停留最久的页面将其换出(谁先来的谁先走)



存在Belady异象

OPT
展望未来,最久未被使用的页被选为牺牲页(向前找调用队列中最久未使用的帧)
页故障率最小化



问题:难以实现
LRU
以史为鉴,最近最久未被使用的页被选中置换(向后找调用队列中最久已使用的帧)



二次机会算法 CLOCK
引用位:通过硬件为每个页面维护一个引用位 每次访问某个页面,将其关联的引用位置1 根据页置换的算法,在合理的时间将页面引用位归0


增强型二次机会算法 ECLOCK
引入修改位和引用位 
置换优先级有上到下递减
页帧分配

驻留集
表示请求页式管理中为进程分配的物理页帧的集合
页帧分配

抖动

工作集
工作集模型基本思想:观察定长时间段内进程访问的内存集合,并以此为依据确定该时间段内为该进程分配物理页(页帧)的数量 关键参数:工作集窗口大小

令D=∑wsi(t) m=t时刻操作系统为所有进程分配的物理页数 基于工作集的内存分配应保持m > D这一目标
内核内存分配
内核内存分配,用以满足操作系统内核模块的内存需求内 核内存分配器应具备高效分配大内存和小内存的能力。
伙伴算法
伙伴算法是一种动态存储器管理算法。该算法通过不断地平分较大的空闲内存块来获得较小的空闲内存块,直到获得所需要的内存块,当内存释放时,该算法尽可能地合并空闲块。
其中,在分配和合并内存块时都是以2的次幂为单位,即1,2,4,8,16,32,64,128等。所谓“伙伴”,就是指在空闲块被分裂时,由同一个大块内存分裂出来的两个小块内存就互称“伙伴”。
“伙伴”应当满足以下三个条件: 两个块大小相同 两个块地址连续 两个块必须是同一个大块中分离出来的


