华科网安操作系统原理复习笔记
操作系统概述
操作系统的定义和特性
- 操作系统是一个大型的系统程序,负责计算机软硬件资源的管理,并发活动的控制,用户接口的提供。
操作系统的功能
- 操作系统的功能包括:进程管理,存储管理,设备管理,文件管理。
操作系统的性能
- 吞吐率,响应能力,资源利用率,可移植性,可靠性
操作系统的发展历史
- 计算机硬件发展的四个典型阶段:电子管时代,晶体管时代,集成电路时代,大规模集成电路时代。
- 操作系统发展的四个典型阶段:手工操作系统(无操作系统),单道批处理系统,多道批处理系统,分时操作系统。
- 手工操作系统:使用电子管和接线面板,用卡片纸带实现程序,CPU利用率低
- 单道批处理系统:诞生于晶体管时代,工作过程:卡片装入输入机,获取输入磁带,输入磁带装入计算机计算后得到输出磁带,输出磁带装入输出机,得到打印结果。处理多个作业时,需要持续进行装入,运行,撤出步骤。**具有串行,按批处理的特点。**相较手工操作系统可以自动识别作业进行处理。
- 单道批处理系统的一种实现方式:脱机批处理:主机负责运算,卫星机负责输入输出。系统效率高但调度不灵活。
- 多道批程序设计技术:内存中存放多道程序,当某道程序因请求资源未获取等原因不能继续运行,监控程序或操作系统便调度另一道程序投入使用,使CPU尽量忙碌,提高系统效率。
- 诞生于集成电路时代,采用多道程序设计技术实现的处理系统称为多道批处理系统。多道批处理系统中CPU和外设并行,外设之间也并行。内存同时存放多道程序,宏观上并行,微观上串行,是现代操作系统的雏形。
- 多道批处理系统提高了系统效率,但作业处理时间长,运行过程不稳定,交互能力差。
- 60年代硬件实现了中断技术和通道技术的两大进展。中断技术:CPU收到中断信号后转去处理外部事件后回到断点继续工作。通道技术:专门处理外设和内存之间的数据传输处理机。
- 大规模集成电路出现。事务性任务和程序涌现(交互性高,响应快速),多任务多用户的要求产生。
- 分时技术主机以很短的时间片为单位,轮流将CPU分配给每个作业(终端/用户),直到全部作业被运行完。因为及时响应,每个终端都认为自己在独占主机。
- 分时系统的特点:多路调制性:多用户联机使用同一台计算机。独占性:用户感觉独占计算机。交互性:及时响应用户请求。
- unix为第一个实用化的分时操作系统。实现了操作系统的可移植,脱离硬件,并将外设看作文件。
- 操作系统的进一步发展:实时操作系统/嵌入式操作系统,微机操作系统(PC机),多处理机操作系统,网络操作系统,分布式操作系统,嵌入式操作系统。
- 实时操作系统:某些任务优先紧急处理其系统安全可靠。强调作业完成的时限和可预测性。硬实时系统:必须限时完成,软实时系统:尽可能快完成。
- 微机操作系统:苹果和微软,产生了图形界面和鼠标。
操作系统的逻辑结构
- 操作系统的逻辑结构即指操作系统的设计和实现思路,包括整体式结构(单体式结构,宏内核结构),微内核结构,层次式结构。
- 整体式结构:以模块为基本单位构建,操作系统由大量过程组成,每个过程都有明确参数列表,回值类型,大多数过程可以相互间调用。优点:于模块的设计,编码和调试独立。模块之间可以自由调用。缺点:错误容易扩散,开发维护困难,可伸缩性差。unix,linux采用该方式实现,支持动态可安装模块。
- 层次结构:类似网络协议的分层。功能模块按调用次序排成若干层,各层单向依赖或单向调用。最底层:硬件相关,最顶层:用户策略/用户交互,中间层:调用次序/消息传递顺序,较低层:共性的,活跃的服务。层次优点:结构清晰,避免循环调用,整体问题局部化,系统的正确性容易保证,利于操作系统的维护,扩展,移植。
- 微内核结构:也称客户/服务器结构,客户为应用程序,服务器为操作系统,即微内核+核外服务器。微内核:足够小,提供OS最基本的核心功能和服务,实现硬件相关的处理,实现较为基本的功能,负责客户和服务器的通信。核外服务器:完成OS绝大部分功能,等待用户提出请求,由若干服务器或进程共同构成。鸿蒙系统采用该结构。Windows NT采用微内核+分层结构。
- 微内核与宏内核区别:宏内核各服务与内核运行在同一地址空间,进程间通信,状态切换效率高。内核庞大,不易裁剪,系统稳定性安全性差。微内核中内核只实现基本功能。便于剪裁和移植,系统稳定性和安全性高。进程状态频繁切换,系统效率低。
操作系统的硬件基础
计算机三总线硬件结构
- 计算机主要部件:CPU,外设,内存;三总线:地址总线,数据总线,控制总线。
CPU结构
- 包括控制单元,运算单元,寄存器单元,
处理机的态
- 支持操作系统的最基本硬件结构:CPU,内存,中断,时钟。
- 操作系统考虑的安全问题:防止进程信息被非法访问,防止进程随意存取系统资源,防止进程修改系统安全机制。
- 解决策略:1) 软件被设置为可信软件与不可信软件两类。可信软件:可以修改安全保护机制,可以存取系统资源,使用普通指令集和特权指令集。不可信软件:功能受限,只能使用普通指令集。2) 设置访问屏障,阻止可信软件和不可信软件之间的通信,CPU设置工作模式,限制可用的指令集。
- CPU的态指CPU的工作状态,对资源和指令使用的权限。CPU设置模式位,指令执行前均检查模式位是否满足。
- 特权指令:设计外部设备的输入输出指令,修改特殊寄存器状态,改变机器状态。
- 态分为核态(访问所有资源,执行所有命令)。用户态(仅能访问部分资源),管态(介于核态和用户态之间)。硬件按“态”区分CPU状态,OS按进程区分CPU状态。
- Intel CPU的态:Ring 0~Ring 3,Ring0最核心,Ring 3最外层。PL位=00,01,10,11。unix/linux仅支持0,1,3,windows仅支持0,3。
- 段:一段连续的内存,在段描述符的段属性中包括访问该段所需要的最小特权级(DPL)。
- 用户态向核态转换:用户请求OS服务,用户进程错误(内部终端),用户态企图执行特权指令,发生中断。核态向用户态转换的情形:一般是中断返回。
内存
- 存储程序和数据的部件。
- 分类:按是否和CPU直接交换信息:主存,辅存。按存储元材料:半导体存储器,磁存储器,光存储器。按读写工作方式:RAM,ROM。
- 存储体系:寄存器,高速缓存,主存,磁盘进行分层。CPU在上层未命中时会访问下一层。
中断
- 指CPU对突发的外部事件的反应过程或机制。引入中断实现并发活动,实时处理,故障自动处理。
- 引起系统中断的事件称为中断源。中断类型包括:(根据程序有无预期)强迫中断和自愿中断,(根据由CPU内部时间还是外部事件引起的)外中断和内中断,外中断分为不可屏蔽中断(CPU必须响应)和可屏蔽中断。
- 断点:程序中断的地方,将要执行的下一条指令的地址。现场:程序运行相关信息的集合:程序状态字(PSW),相关寄存器,断点。进入中断服务程序前会将现场存入栈中,退出后则将现场信息返回CPU。
- 中断响应过程:识别中断源,保护断点,保护现场,进入中断服务程序,恢复现场,中断返回。
- 中断响应实质:交换指令执行地址,交换CPU态。进行的工作:现场的保护和恢复,参数传递。
基本输入输出系统
- BIOS位置:C0000-FFFFF,系统BIOS位置:F0000-FFFFF。
- 系统BIOS功能:加电自检及初始化(POST),CMOS设置,系统自举/加载OS,基本I/O服务(BIOS中断)。
- POST:初始化基本硬件,自检错误的通过喇叭提示。
- POST之后:查找显卡BIOS,调用显卡BIOS,依次查找其他设备执行相应设备的BIOS,显示启动画面,根据用户指定顺序启动OS,OS启动后由OS接管计算机。
操作系统的启动
- 实模式:程序按8086寻址方法访问0~FFFFF的1MB空间,CPU单任务运行。
- 保护模式:寻址方式包括16位段地址和32位偏移地址,寻址4GB。使用虚拟地址,进程和封闭空间,应用程序和操作系统的运行环境都被保护,CPU支持多任务。
- 操作系统的启动过程:1) 初始引导:把OS装入内存并使之开始接管计算机系统。过程:加电自检,跳入BIOS的启动程序,运行引导程序将OS内核读取到内存,OS内核逐渐加载剩余部分直至完全控制计算机。2) 核心初始化:OS内核初始化系统的核心数据(寄存器,存储系统,页表的初始化,核心进程的构建)。3) 系统初始化:为用户使用系统做准备,使系统处于待命状态(文件系统,网络系统,控制台,图形界面的初始化)。
- linux启动过程:POST,MBR,KERNEL映像,KERNEL映像自解压并执行,内核初始化,内核启动。内核完成引导后加载init程序。init进程是所有进程的祖先,进程号=1。init进程执行/etc/inittab脚本进行系统初始化。设置键盘,字体,装载模块,设置网络等。
- 操作系统的安装过程:把OS映像拷贝到存储空间(硬盘)中。写入启动相关代码和数据(写在MBR,PBR扇区,写512字节)。
操作系统的生成
- 根据硬件环境和用户需要,配置和构建操作系统。
- 操作系统生成前提:操作系统由可拆装模块构成,有交互式配置工具,有映像构建工具。
- linux操作系统的生成:获取linux内核的源代码,选择和启动内核配置程序,根据需要配置内核模块和参数,重新编译新的内核,编译和安装内核,启动新的内核。
用户界面
用户环境
- 用户环境指用户工作的软件环境:桌面环境,命令行环境。
- 用户环境构造指按照用户要求和硬件特性安装和配置操作系统。
用户界面
- OS提供给用户控制计算机的机制,也称用户接口。
- 用户界面类型:操作界面,系统调用(程序界面)。
操作界面
-
类型:图形用户接口,操作命令,批处理与脚本程序。
-
Shell是操作系统与用户交互的界面,表现为通过控制台执行用户命令的方式。
-
重定向操作:
-
管道:特殊的重定向操作,程序的输出作为另一个程序的输入。操作符为"|",左边程序输出变为右边程序输入。
-
脚本程序保存在文本文件中,是Shell命令语句的集合。Bash不区分变量类型,本质上变量均为字符串,变量值仅有数字时为整型。
-
运行脚本程序的三个方法:直接运行(用默认版本的shell运行脚本程序),使用某个特定版本的shell(开头写运行程序名),在脚本首行指定shell(#!/bin/bash)
-
脚本程序支持的语法:变量,条件测试和判断语句,循环,函数,调试方法。1.let COUNT=0,使用let给变量直接赋值,2.echo输出字符串,3.read FILE获取输入,4.if语句:if[ 条件判断(括号两端必须有空格) ];then … fi。5. 赋值以外的变量引用需要在变量名前添加$。6.while … do … done …。
系统调用
- 例子:printf,exit,文件操作,字符输出输入。
- 调用操作系统内核为应用程序提供的一系列服务或函数。在内核里实现。操作核心资源或硬件。调用时产生自愿中断。
- 系统调用形式:访管指令:SVC N(N为系统调用的编号)。DOS中系统调用实现:INT 21H,linux:INT 80H,向AH或EAX存入系统调用编号。
- linux增加新系统调用过程:编写新系统调用函数,注册新的系统调用,编译新的内核,编译安装模块,启动新的linux内核。
进程管理
进程概念
- 进程是程序在某个数据集合上的一次运行活动。
- 进程的特征:动态性(进程是程序的一次执行过程),并发性(进程可同其他进程一起推进),异步性(按各自速度推进),独立性(进程是系统分配资源和调度CPU的单位)。
- 进程是动态的,暂存的,程序是静态的,长存的。一个程序可能有多个进程。
- 进程分类:按功能特点:系统进程,用户进程。
进程的状态
-
进程状态包括:运行状态(在CPU上运行),就绪状态(具备运行条件,但由于无CPU暂时无法运行),阻塞状态(因等待某项服务完成或信号到来而不能运行的状态)。
-
进程状态可以一定条件相互转化:运行状态因被进程被抢占或时间片结束转入就绪状态;因需要等待信号或正在请求服务可以转为阻塞状态。就绪状态可被调度称为运行状态。阻塞状态可因服务完成或信号到来而转为就绪状态。阻塞状态无法直接到运行状态,就绪状态无法变成阻塞状态。
-
考虑新建状态和终止状态:
-
支持挂起和解挂的操作进程状态:阻塞和就绪分为活动的(正常的)和静止的(被挂起)。运行状态和就绪状态均可被挂起形成静止就绪状态,阻塞状态被挂起成为静止阻塞状态。若期待的事件发生或信号到来,静止阻塞状态也可转化为静止就绪状态。静止阻塞状态和静止就绪状态均可分别解挂为活动阻塞状态和活动就绪状态。
-
linux进程的状态:可运行态(分为就绪和正在运行),睡眠态(分为深度睡眠:不能被中断唤醒,浅度睡眠:可被中断唤醒),僵死态(进程终止执行),挂起态(进程被挂起)。
进程控制块
- 进程控制块PCB:描述进程的状态,资源和相关进程的关系。PCB是进程的标志,创建进程时创建PCB,进程撤销后PCB同时撤销。进程=程序+PCB。
- PCB的基本成员:ID,状态,优先级,程序地址,下一个PCB指针,堆栈,进程通信机制,家族,资源清单。
- linux中和进程标识相关的成员变量:进程ID:PID,父进程ID:PPID,进程组ID:PGID,用户ID:UID,用户组ID:GID。
- 进程的上下文即进程运行环境,约等于PCB。分时系统中进程切换过程:进程的上下文在CPU中交换,换入进程的上下文从栈+PCB来,换出进程的上下文到栈+PCB上去。
进程控制
- 进程控制即在进程生存全期间对其全部行为的控制。四个典型的进程控制:创建进程,撤销进程,阻塞进程,唤醒进程。
- 进程创建:创建一个具有指定标识的进程。具体过程:创建空白的PCB,赋予进程ID,为进程分配空间,初始化PCB,插入相应的进程队列(新进程插入就绪队列)。
- 进程撤销:撤销一个指定的进程,回收其资源并撤销其PCB。
- 进程阻塞:停止进程执行,PCB中状态变为阻塞态,插入对应的阻塞队列,转入调度程序。阻塞时机:请求系统服务,启动某种操作,新数据未到达,无新工作可做。
- 进程唤醒:唤醒处于阻塞队列当中的某个进程。
- 进程控制原语:创建原语,撤消原语,阻塞原语,唤醒原语。
windows进程控制
- 创建新进程:CreateProcess,结束进程:ExitProcess,TerminateProcess。
linux进程控制
- 创建进程:fork()。新建进程为子进程,fork的调用者为父进程。子进程是父进程的复制,父进程子进程并发运行。子进程中fork返回0,父进程中fork大于0(为子进程ID),返回-1表示出错。
- exec函数族:在子进程空间运行指定的可执行程序。
- 阻塞进程:wait()。检测有无子进程结束,若没有则继续阻塞,有则收集该子进程信息并彻底销毁它后返回。
- 结束进程:exit()。进程终结时释放资源并向父进程报告。变为僵尸状态,保留部分PCB信息供wait收集。调用调度函数,开始新进程。
- 进程休眠:Sleep()。进程暂停执行n秒。
线程
- 线程提高了系统的并发性能。线程间通信更灵活,线程管理成本更低。大多数操作系统都采用了线程技术。
- windows创建线程:CreateThread。
- 线程应用场景:多个功能需要并发,需要改善窗口交互,需要改善程序结构,在多核CPU上发挥多核CPU潜力。
进程相互制约关系
- 进程的互斥关系:多个进程共享具有独占性的资源时,必须确保各进程互斥地存取资源。
- 临界资源:一次仅允许一个进程独占访问的资源。临界区:进程中访问临界资源的程序段。
- 进程的同步关系:合作进程需要协调运行步伐。互斥关系属于特殊的同步关系。
同步机制
- 同步机制的功能:某个进程无法继续则暂停,若其条件被满足则立即唤醒其继续。
- 访问临界区的硬件办法:中断屏蔽:进入临界区前关中断,离开临界区后开中断。
- 访问临界区的软件办法:锁和信号量。
- 锁:进入临界区前检查是否可用,可用则进入并标为不可用,不可用则持续等待。离开临界区后将锁标志设为可用。无法实现让权等待。
- 设计临界区访问机制的四个原则:忙则等待,空闲让进,有限等待,让权等待。
- 信号灯机制:进程因信号灯的状态被阻塞或被唤醒。信号灯的状态可以被进程改变。信号灯定义为二元矢量(S,q),S为信号量,q为PCB队列。信号灯包含两个操作,P操作和V操作。S是临界资源的数量。
- P操作:S值减1,若S大于或等于0,则进程继续若S小于0.则阻塞该进程并加入q中,转入调度函数。
- V操作:S值增加1,若S大于0,该进程继续,若S小于等于0,则该进程继续同时从q中唤醒一个进程。
资源分配与调度
- 死锁:两个或多个进程无限期地等待永远不会发生的另一种系统状态,导致每个进程都永远阻塞。
- 陷入死锁的进程至少是两个,参与死锁的进程至少2个已占有资源。参与死锁的所有进程都在等待资源。
- 死锁的必要条件:互斥条件,不剥夺条件,部分分配条件,环路条件。
- 预防死锁:破坏死锁必要条件。限制严格导致资源利用率和吞吐量降低。
- 避免死锁:资源分配分析是否导致死锁。例如银行家算法。
- 检测和恢复死锁:允许死锁发生,并及时检测出死锁并清除死锁。
- 预先静态分配法:进程仅当其所需全部资源可用时才可运行。
- 有序资源分配法:为系统中每个资源分配一个唯一序号,每次只能申请序号更大的资源。
处理机调度(进程调度)
进程调度概念
- 在队列中按某种策略选择一个最合适的对象。分为:长程调度/宏观调度/作业调度,中程调度/交换调度,短程调度/进程调度,I/O调度/设备调度。
- 进程调度:在合适的时候以一定策略选择一个就绪进程运行。
- 周转时间t:进程提交给计算机到完成所花费的时间。
- 带权周转时间:周转时间/进程的运行时间。得到进程在系统中的相对停留时间。
进程调度算法
- 先来先服务调度FCFS:按作业进入系统的先后次序来挑选作业,先进入系统的作业优先被运行。不利于晚来但很短的作业。
- 短作业优先调度算法SJF:选取时间最短的作业投入运行。忽视作业等待时间,早来的长作业会长时间等待。
- 响应比:作业的响应时间与运行时间的比值,即1+等待时间/运行时间,也即即时的加权周转时间。
- 响应比高者优先调度算法:调度时计算每个作业的响应比,选择响应比最高的作业优先投入运行。每次调度时都要重新计算和比较作业的响应比。
- 优先数调度算法:把CPU分给进程优先数最高的进程。优先数包括静态优先数和动态优先数。
- 循环轮转调度法:所有就绪进程按先进先出原则排列,新来的进程添加到队列末尾。进程已时间片q为单位轮流使用CPU,运行了一次的进程排进队列末尾。进程之间公平。
- 调度方式根据更高优先级进程需要运行时系统是否暂停当前进程分为非抢占方式和抢占方式。
linux进程调度
- 基于优先级调度。支持普通进程,也支持实时进程,实时进程优先于普通进程。普通进程公平使用CPU时间。
主存管理
存储管理的功能
- 三级存储体系:内存不够时辅存支援,并由cache提高效率。
- 存储器需要容量大,速度快,信息永久保存,满足多道程序并行。并行带来问题:禁止越界访问,做好资源共享。
- 存储管理功能:地址映射,存储扩充(虚拟存储),内存分配,存储保护。
- 地址映射:将程序中的逻辑地址交换成真实的内存地址的过程。方式有固定地址映射,静态地址映射,动态地址映射。
- 固定地址映射:编程或编译时确定逻辑地址和物理地址的关系。容易产生地址冲突,不利于多道程序环境。静态地址映射:程序装入时,由操作系统完成逻辑地址到物理地址的映射。物理地址MA=逻辑地址VA+装入基址BA。程序无法移动,且占用连续的地址空间。
- 动态地址映射:程序执行过程中将逻辑地址转化为物理地址。MA=BA+VA。切换进程的同时切换基址寄存器BAR。程序分配到多个不连续的内存块中存放,并按段编译,按段装入,每个段维护一个段寄存器,存储有重定位信息。程序占用空间可变,不要求连续的内存空间,便于多个进程共享代码。
- 存储扩充:为解决问题:程序过大过多时内存不够,多个程序并发时地址冲突。虚拟内存的基本原理:借助辅存在逻辑上扩充内存,解决内存不足。将要运行的部分装入内存,把不运行的部分暂存到辅存上。利用了程序的局部性原理。
- 内存分配:为程序分配足够的内存空间。需要处理程序放至何处,合适调入内存,迁出哪些内存。
- 存储保护:防止访问越界越权。实现:界址寄存器:上/下限寄存器,基址寄存器和限长寄存器。适用于连续的物理内存。存储键保护:适用于不连续物理分块的情形。
物理内存管理
- 方法:单一区存储管理(被一个程序占着,内存浪费),分区存储管理(分区后供不同程序使用),内存覆盖技术,内存交换技术。
- 分区存储管理:分为固定分区和动态分区。固定分区:系统初始化时将内存划分为若干大小不等的分区,大小和位置都固定。分区表记录分区位置,大小和是否被占用。动态分区:程序装入时创建分区,分区大小与程序大小相等。可能会产生内存碎片。
- 内存碎片:外部碎片:分区外的碎片,由动态分区产生。内部碎片:分区内剩下部分,由固定分区产生。
- 放置策略:根据空闲区表给用户程序选择空闲分区的策略。从排好序的空闲区表选择第一个满足要求的分区。
- 空闲区表的排序原则:按空闲区位置递增排序(首次适应算法),按空闲区位置递减排序,按空闲区大小递增排序(最佳适应算法),按空闲区大小递减排序(最坏适应算法)。
- 分区分配:选中分区分给客户,若有剩余部分则作为空闲区登记至空闲区表。分割空闲区表时一般将低地址部分分给用户。
- 分区回收:适当处理后登记到空闲区表。若与现有空闲区相邻则需要合并。
- 解决碎片:规定门限值,若剩余部分小于门限值则不进行分割而是全部给用户。内存拼接:将所有空闲区集中成大的空闲区,系统开销大。拆分程序装入不同分区,充分利用碎片。
虚拟内存管理
- 虚拟内存即进程空间,容量4G,为程序员编程所使用的地址,进程之间无地址冲突。典型的虚拟内存管理方式有:页式虚拟存储管理,段式虚拟存储管理,段页式虚拟存储管理。
- 页式虚拟存储管理:程序和内存都划成等大小的小片:页面和页框。程序以页面为单位装入内存,内存以页框为单位使用。原则:局部装入,不断更新。页在内存中占用的页框不必相邻。
- 虚拟地址按页式地址组织表达,通过地址映射转化为物理地址,发生缺页则缺页中断,调入页面,页框不足则淘汰页面。
- 虚拟地址VA分成页号P和页内偏移W。VA=PX+W,X为页面大小。若X为2的n次方,则可用移位实现。
- 地址映射通过**页面映射表(页表)**来实现。页表以页号为主题,记录其对应的页框号和其它页面特性。
- 虚拟地址映射到物理地址:通过VA计算P和W,查页表将P换为页框号P`,根据P`和W计算物理地址。
- 快表是普通页表的部分内容的复制,地址映射优先查找快表,若命中则返回,若未命中,则访问慢表并更新快表。合理的页面调度能使快表命中率较高。
- 页面共享:同一程序打开多个进程,数据段各自独立,代码段可以在内存中共享。在进程页表中填上共享页框的页框号实现页面共享。
- 页表:操作系统为每一个进程建立一个页表,页表基址存储在PCB中,页表的内容由内核负责填充和更新。当前进程的页表留在内存中,页表基址存放在页表基址寄存器中。扩充带有访问位和修改位,标记该页最近是否被访问或修改。同时带有中断位(0表示在内存,1表示不在内存)和辅存地址。
- 缺页中断:访问的页不在内存时系统发生的异常。
- 缺页中断处理程序:把所缺的页从辅存地址调入内存的某个页框中,并更新其页框号,修改中断位为0。
- 访存指令的执行过程(含缺页中断处理):
- 缺页中断和普通中断处理过程相同,但处理时机不同。缺页中断在指令进行中执行,普通中断则在指令完成后进行。
- 页表实现时无法找到连续的1k个页,因此引入页目录。将页表分拆成数个小页表,每个小页表的大小为1页。设置页目录记录每个小页表的页框号。称页目录为一级页表或外部页表,小页表为二级页表或页表。
- 二级页表的地址映射过程:获取虚拟地址,得到其页号P,由于页表分散,无法直接找到页号P对应位置,查询页目录,根据页号P找到页表信息所在的页框,再根据页号P找到其对应的内存的页框号。以32位系统为例,虚拟地址表示页内偏移的后12位在查找逻辑地址的页框号时无用,其前二十位则可分为前十位和后十位,分别用来在页目录中找到二级页表和在二级页表中找到对应条目。(二级页表实际上就是对页表按页分块)
- 选择淘汰哪一页的规则被称为淘汰策略。页面抖动指页面在内存和辅存中频繁交换的现象,抖动会导致系统效率下降。好的淘汰策略缺页率较低,页面抖动也会低。
- 常用的淘汰算法:最佳算法OPT,先进先出淘汰算法FIFO,最久未使用淘汰算法LRU,最不经常使用淘汰算法LFU。
- 最佳算法:淘汰最远将来才会用到的页面。理论上最佳,实际上无法实现。
- 先进先出淘汰算法FIFO:淘汰在内存中停留时间最长的算法。实现简单,进程按序访问地址空间时抖动较少。
- 最久未使用淘汰算法LRU:淘汰最长时间未被使用的页面。利用页表访问位,软件周期性地将所有访问位置为0,淘汰时如访问位为0则可以淘汰。
- 最不经常使用淘汰算法LFU:选择到当前时间为止被访问次数最少的页面。每页设置访问计数器,每当页面被访问时该页面访问计数器加一。发生缺页中断时,淘汰访问计数器最低的页面,并将访问计数器清零。
- 影响缺页次数的因素:淘汰算法,页框数(页框数越少,越容易缺页),页面大小(页面越小越容易缺页)。程序编制:局部性越好越不易缺页,跳转分支越多越容易缺页。
- 页式系统的不足:页面划分无逻辑含义,页的共享不灵活,会产生页内碎片。
- 段式存储管理:把进程按逻辑意义划分为多个段,每段有段名。每段内存连续,段段不必相邻。
- 段表:记录每段在内存映射中的位置。包括段号,段长,段在内存的基址。
- 段式系统VA包括段号S和段内偏移W,映射到物理地址时根据段号获取段基址B和长度L,物理地址为MA=B+W。若偏移大于段长会失败。段表也可扩充有访问位,修改位,中断位,R/W/X。
- 共享段在内存中只有一份,被每个进程写入段表。需要共享的模块都可单独成段。段式系统需要连续的存储空间,辅存中管理可变大小的段比较困难。
- 页式系统为一维地址空间,段式系统为二维地址空间。段式系统相对方便共享,段是用户可见的,段有偏移溢出,页面无偏移溢出。
- 段页式存储管理:在段式存储管理中结合页式存储管理。地址包括段号S,页号P和页内位移W。系统为每个进程建立一个段表,每个段建立一个页表,段表该处每段的页表基地址和页表长度,页表给出每页对应的页框。内存按页分配。
i386和linux存储管理
- 计算机加电前一段时间处于实模式。实模式20位物理地址,1MB内存空间,分段机制:段地址16位,偏移地址16位。
- 实模式寄存器:与汇编中x86寄存器一致。实模式的地址寻址也与x86一致,段地址左移4位+偏移地址。
- 保护模式逻辑地址是段地址16位,偏移地址32位,但物理地址计算与实模式不同。段基址包含描述符相对描述符表的偏移地址,物理地址的基址在段描述符中,加上段偏移即可得到物理地址。
- 保护模式寻址:优化分段管理,支持分页管理,有4GB的内存空间。CPU支持多任务和特权机制。扩展寄存器并新增寄存器。
- 寄存器:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI,EIP,CS,DS,SS,ES,FS,GS,EFLAGS,GDTR,IDTR,LDTR,五个控制寄存器CR0-4,TR。
- 描述符属性:段基址32位,段长20位,DPL2位(描述符特权级别),P1位(是否在内存中,1在内存中,与页表中断位表示相反),G(段的粒度,段长计量单位。0表示字节,1表示一页),S|TYPE表示描述符的类型和特性。
- 描述符表类型:全局描述符表GDT,局部描述符表LDT,中断描述符表IDT。
- 保护模式中段地址即选择子,高13位为在描述符表中的索引,第14位表名在GDT(0)中还是LDT(1)中,最后两位表示请求特权级域。选择子放在段寄存器中。
- GDT全局唯一一个,每个进程可见,LDT每个进程都有一个,表内含有各种私有段的描述符。LDT作为段的描述符在GDT中。
- GDTR48位,基址32位,限长16位。LDTR16位,也是选择子,选择GDT中LDT段的段描述符。
- 段页机制:线性地址的应用。通过段式映射得到线性地址,若不采用段页机制,则其位物理地址,若采用段页机制则线性地址需要经过页式映射才能成为物理地址。