Operating System 理论复习(前三章)
一、系统引导
1.大多数BootLoader
都分为stage1
和stage2
两大部分,依赖于cpu
体系结构的代码(如设备初始化代码等)通常都放在stage1
且可以用汇编语言来实现;stage2
则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
2.程序地址空间(4G)
划分为四大区域:
名称 | 占据空间大小 | 特征 |
---|---|---|
Mapped (kseg2) | 1GB | 只能在核心态下使用并且要经过MMU的转换。 |
Unmapped uncached (kuseg1) | 512MB | 高三位清零可映射到相应的物理地址;唯一在系统重启时能正常工作的地址空间。 |
Unmapped cached (kuseg0) | 512MB | 最高位清零,即可映射到物理地址段;操作系统的核心地址段。 |
32-bit user space (kuseg) | 2GB | 一概被MMU作转换。 |
3.MIPS
启动过程
大多数
BootLoader
都分为stage1
和stage2
两大部分,U-boot
也不例外。依赖于
cpu
体系结构的代码(如设备初始化代码等)通常都放在stage1
且可以用汇编语言来实现;stage2
则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
- 第一步启动:
- 第二步启动:
- 调用
board.c
中的函数board_init_f
做一系列初始化; - 上述工作完成后,串口和内存都已经可以用了。然后进行内存划分,对堆和栈初始化,并留出
u-boot
代码大小的空间,把代码从flash
上搬到ram
上,继续执行。 - 之后进入
board.c
的board_init_r
函数,在这个函数里初始化flash
,pci
以及外设(比如,网口),最后进入命令行或者直接启动Linux kernel
。
- 调用
二、内存管理
1.存储组织
存储层次组织:(最佳状态应是各层次的存储器都处于均衡的繁忙状态)
- 寄存器
- 快速缓存
- 主存
- 外存
2.存储管理的基本目标:①地址独立:程序发出的地址与物理地址无关;② 地址保护:一个程序不能访问另一个程序的地址空间。
3.存储管理的功能:①存储分配和回收;②地址变换;③存储共享和保护;④存储器扩充。
4.地址空间与存储空间
- 地址空间:源程序经过编译后得到的目标程序,存在于它所限定的地址范围内,这个范围称为地址空间。简言之,地址空间是逻辑地址的集合。
- 存储空间:存储空间是指主存中一系列存储信息的物理单元的集合,这些单元的编号称为物理地址或绝对地址。简言之,存储空间是物理地址的集合。
5.单道程序的内存管理:(用户程序的地址在运行之前可以计算)
- 静态地址翻译:即在程序运行之前就计算出所有物理地址。(可以由加载器实现)
6.多道程序的存储管理:
-
分区式分配:把内存分为一些大小相等或不等的分区,每个应用程序占用一个或几个分区。操作系统占用其中一个分区。(难以进行内存分区的共享)
-
碎片:内存中无法被利用的存储空间称为碎片。
- 内部碎片:指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片;内部碎片无法被整理,但作业完成后会得到释放。
- 外部碎片:指系统中无法利用的小的空闲分区。如分区与分区之间存在的碎片。这些不连续的区间就是外部碎片。动态分区管理会产生外部碎片。外部碎片可以被整理后清除。(消除外部碎片的方法:紧凑技术)
-
固定(静态)式分区:(程序适应分区)
-
把内存划分为若干个固定大小的连续分区。
-
采用的数据结构:分区表——记录分区的大小和使用情况
单一队列的分配方式;多队列分配方式。
-
-
可变(动态)式分区:(分区适应程序)
- 分区的边界可以移动,即分区的大小可变。
-
伙伴系统:(介于固定分区与可变分区之间的动态分区技术)
系统初启时,只有一个最大的空闲块(整个内存)。当一个长度为n的进程申请内存时,系统就分给它一个大于或等于所申请尺寸的最小的2的幂次的空闲块。如果\(2^{i-1}<n≤2^i\),则在空闲分区大小为\(2^i\)的空闲分区链表中查找。
-
可重定位分区分配(紧凑):
定时的或在内存紧张时,移动某些已分配区中的信息,把存储空间中所有的空白区合并为一个大的连续区。
-
多重分区分配:
一个作业往往由相对独立的程序段和数据段组成,将这些片断分别装入到存储空间中不同的区域内的分配方式。
-
7.闲置空间的管理
-
位图表示法(分区表)
(给每个分配单元赋予一个字位,用来记录该分配单元是否闲置)
-
链表表示法(分区链表)
(将分配单元按照是否闲置链接起来,这种方法称为链表表示法)
8.基于顺序搜索的分配算法(适合于较小的系统)
-
首次适应算法(First Fit):
每个空白区按其在存储空间中地址递增的顺序连在一起,在为作业分配存储区域时,从这个空白区域链的始端开始查找,选择第一个足以满足请求的空白块。
-
下次适应算法(Next Fit):
把存储空间中空白区构成一个循环链,每次为存储请求查找合适的分区时,总是从上次查找结束的地方开始,只要找到一个足够大的空白区,就将它划分后分配出去。
-
最佳适应算法(Best Fit):
为一个作业选择分区时,总是寻找其大小最接近于作业所要求的存储区域。
-
最坏适应算法(Worst Fit):
为作业选择存储区域时,总是寻找最大的空白区。
9.基于索引搜索的分配算法
-
快速适应算法(分类搜索法):
把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。
(仅需要根据程序的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可)
10.程序的链接和装入
-
链接
- 静态链接:用户一个工程中所需的多个程序采用静态链接的方式链接在一起。当我们希望共享库的函数代码直接链接入程序代码中,也采用静态链接方式。
- 动态链接:用于链接共享库代码。当程序运行中需要某些目标模块时,才对它们进行链接,具有高效且节省内存空间的优点。但相比静态链接,使用动态链接库的程序相对慢。
-
装入:一般采用动态运行时装入方式。
装入程序把装入模块装入内存后,并不立即把装入模块中相对地址转换为绝对地址,而是在程序运行时才进行。这种方式需要一个重定位寄存器来支持,在程序运行过程中进行地址转换。
11.程序段
text
和data
段都在可执行文件中,由系统从可执行文件中加载,而bss
段不在可执行文件中,由系统初始化。
一个装入内存的可执行程序,除了bss
、data
和text
段外,还需构建一个栈(stack
)(存放、交换临时数据的内存区)和一个堆(heap
)(存放进程运行中动态分配的内存段)。
12.Linux
下可执行文件的格式(ELF
)
-
可重定位(
relocatable
)文件:保存着代码和适当的数据,用来和其他的object
文件一起来创建一个可执行文件或者是一个共享文件。 -
可执行(
executable
)文件:保存着一个用来执行的程序,该文件指出了exec(BA_OS)
如何来创建程序进程映像。 -
共享
object
文件:保存着代码和合适的数据,用来被下面的两个链接器链接第一个是链接编辑器(静态链接),可以和其他的可重定位和共享
object
文件一起来创建object
文件;第二个是动态链接器,联合一个可执行文件和其他的共享object
文件来创建一个进程映象。
13.程序、进程和作业
一个作业可划分为若干个进程来完成,而每一个进程由其实体——程序和数据集合组成。
- 程序:静止的,是存放在磁盘上的可执行文件。
- 进程:动态的,包括程序和程序处理对象(数据集),是一个程序对某个数据集的执行过程,是分配资源的基本单位。通常把进程分为系统进程和用户进程两大类:
- 系统进程:完成操作系统功能的进程
- 用户进程:完成用户功能的进程
- 作业:用户需要计算机完成的某项任务,是要求计算机所做工作的集合。
14.分页式存储管理
把一个逻辑地址连续的的程序分散存放到若干不连续的内存区域内。
-
纯分页系统
在分页存储管理方式中,如果不具备页面对换功能,必须把它的所有页一次装到主存的页框内;如果当时页框数不足,则该作业必须等待,系统再调度另外作业。(程序不必连续存放)
-
地址结构:
- 已知逻辑地址求页号
P
和页内地址d
(从0开始编号):\(P=INT[\frac AL]\) \(d=[A]modL\)
- 已知逻辑地址求页号
-
数据结构:
- 进程页表:每个进程有一个页表,描述该进程占用的物理页面及逻辑排列顺序。
- 物理页面表:整个系统有一个物理页面表,描述物理内存空间的分配使用状况。
- 请求表:整个系统有一个请求表,描述系统内各个进程页表的位置和大小,用于地址转换,也可以结合到各进程的PCB里。
15.地址变换机构
-
逻辑地址:把相对地址分为页号和页内地址两部分。
-
页表定位:页表始址 + 页号 × 页表项长度。
-
查询页表:读出块号。
-
物理地址:块号 + 块内地址。 (块内地址 = 页内地址)
16.多级页表
-
一级页表:
例如,对于 32 位逻辑地址空间的分页系统,如果规定页面大小为 \(4KB\) 即 \(2^{12}\) B,则在每个进程页表就由高达 \(2^{20}\) 页组成。设每个页表项占用4个字节,每个进程仅仅页表就要占用 \(4MB\) 的内存空间。
特点:页表的大小与逻辑地址空间大小成正比。
解决方法:
- 动态调入页表: 只将当前需用的部分页表项调入内存,其余的需用时再调入。
- 多级页表
-
两级页表:
-
多级页表:
多级页表结构中,指令所给出的地址除偏移地址之外的各部分全是各级页表的页表号或页号,而各级页表中记录的全是物理页号,指向下级页表或真正的被访问页。(内存访问效率的严重下降)
17.页表快速访问机制——MMU
-
其内部主要部件:
页表
Cache
:又称为TLB
,用于存放虚拟地址与相应的物理地址。(
TLB
控制单元:TLB
内容填充、刷新、覆盖,以及越界检查) -
页表(遍历)查找单元:
若
TLB
未命中,自动查找多级页表,将找到的物理地址送与TLB
控制单元。(若快表中内容满,则按某种算法淘汰某些页)
另外,有的
TLB
允许有些条目固定下来。通常内核代码的条目是固定下来的。
18.反置页表
反置页表不是依据进程的逻辑页号来组织,而是依据该进程在内存中的物理页面号来组织(即:按物理页面号排列),其表项的内容是逻辑页号 P
及隶属进程标志符 pid
。
反置页表的大小只与物理内存的大小相关,与逻辑空间大小和进程数无关。如: \(64M\)主存,若页面大为 \(4K\),则反向页表只需 \(64KB\)。
19.页共享
若共享数据与不共享数据划在同一块中,则:有些不共享的数据也被共享,不易保密。
实现数据共享的最好方法:分段存储管理。
20.段式储存管理
方便编程、信息共享、信息保护、动态增长、动态链接
动态链接:在程序运行时才把主程序和要用到的目标程序(程序段)链接起来。
一个段可定义为一组逻辑信息,每个作业的地址空间是由一些分段构成的,每段都有自己的名字(通常是段号),且都是一段连续的地址空间。
-
逻辑地址结构:
-
段表:保存在内存中,记录了段与内存位置的对应关系,段表的基址及长度由段表寄存器给出。
-
地址变换过程:
21.分页与分段的比较
- 分页的作业的地址空间是单一的线性地址空间,分段作业的地址空间是二维的。
- “页”是信息的“物理”单位,大小固定。“段”是信息的逻辑单位,即它是一组有意义的信息,其长度不定。
- 分页活动用户是看不见的,而是系统对于主存的管理。分段是用户可见的(分段可以在用户编程时确定,也可以在编译程序对源程序编译时根据信息的性质来划分)。
22.段页式存储管理
-
基本思想:用分段方法来分配和管理虚拟存储器,而用分页方法来分配和管理实存储器。(每个进程一张段表,每个段一张页表)
-
实现原理:段页式存储管理是分段和分页原理的结合,即先将用户程序分成若干个段(段式) ,并为每一个段赋一个段名,再把每个段分成若干个页(页式) 。
-
地址结构:
-
实现地址映射:
23.覆盖与交换
-
覆盖:
“覆盖”管理,就是把一个大的程序划分成一系列的覆盖,每个覆盖是一个相对独立的程序单位。把程序执行时并不要求同时装入主存的覆盖组成一组,称其为覆盖段,这个覆盖段被分配到同一个存储区域。这个存储区域称之为覆盖区,它与覆盖段一一对应。
-
交换:
广义的说,所谓交换就是把暂时不用的某个(或某些)程序及其数据的部分或全部从主存移到辅存中去,以便腾出必要的存储空间;接着把指定程序或数据从辅存读到相应的主存中,并将控制转给它,让其在系统上运行。
24.虚拟储存技术
- 基本原理
- 按需装载:在程序装入时,不必将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。
- 缺页调入:在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页或段调入到内存,然后继续执行程序。
- 不用调出:另一方面,操作系统将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段――具有请求调入和置换功能,只需程序的一部分在内存就可执行,对于动态链接库也可以请求调入。
- 特征
- 离散性:物理内存分配的不连续,虚拟地址空间使用的不连续(数据段和栈段之间的空闲空间,共享段和动态链接库占用的空间)
- 多次性(分时复用):作业被分成多次调入内存运行。正是由于多次性,虚拟存储器才具备了逻辑上扩大内存的功能。多次性是虚拟存储器最重要的特征,其它任何存储器不具备这个特征。
- 对换性:允许在作业运行过程中进行换进、换出。换进、换出可提高内存利用率。
- 虚拟性:虚拟存储器机制允许程序从逻辑的角度访问存储器,而不考虑物理内存上可用的空间数量。
虚拟性以多次性和对换性为基础,多次性和对换性必须以离散分配为基础。
25.与Cache-主存
机制的异同
-
同
- 出发点相同:二者都是为了提高存储系统的性能价格比而构造的分层存储体系,都力图使存储系统的性能接近高速存储器,而价格和容量接近低速存储器。
- 原理相同:都是利用了程序运行时的局部性原理把最近常用的信息块从相对慢速而大容量的存储器调入相对高速而小容量的存储器。
-
异
-
侧重点不同:
cache
主要解决主存与CPU
的速度差异问题;虚存主要解决存储容量问题,另外还包括存储管理、主存分配和存储保护等方面。 -
数据通路不同:
CPU
与cache
和主存之间均有直接访问通路,cache
不命中时可直接访问主存;而虚存所依赖的辅存与CPU
之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU
最终还是要访问主存。 -
透明性不同:cache的管理完全由硬件完成,对系统程序员和应用程序员均透明;而虚存管理由软件(OS)和硬件共同完成,由于软件的介入,虚存对实现存储管理的系统程序员不透明,而只对应用程序员透明(段式和段页式管理对应用程序员“半透明”)。
-
未命中时的损失不同:由于主存的存取时间是
cache
的存取时间的5~10倍,而主存的存取速度通常比辅存的存取速度快上千倍,故主存未命中时系统的性能损失要远大于cache
未命中时的损失。
-
26.请求式分页管理的页表
-
驻留位:1表示该页位于内存当中,0,表示该页当前还在外存当中。
-
保护位:只读、可写、可执行。
-
修改位:表明此页在内存中是否被修改过。
-
访问(统计)位:用于页面置换算法。
27.调入
-
预调页:预调页同时将所需要的所有页一起调入内存,从而阻止了大量的页错误。预调页有时效果比较好,但成本不一定小于不使用预调页时发生页错误的成本,有很多预调页调入内存的页可能没有被使用。
-
按需调页:当且仅当需要某页时才将该页调入内存的技术称为按需调页(demand paging) ,被虚拟内存系统采用。
28.缺页错误处理过程
当进程执行过程中需访问的页面不在物理存储器中时,会引发发生缺页中断,进行所需页面换入。
-
现场保护:陷入内核态,保存必要的信息(OS及用户进程状态相关的信息)。
-
页面定位:查找出来发生页面中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析该指令,通过分析找出发生页面中断的虚拟页面。
-
权限检查:检查虚拟地址的有效性及安全保护位。如果发生保护错误,则杀死该进程。
-
新页面调入
1
:查找一个空闲的页框(物理内存中的页面),如果没有空闲页框则需要通过页面置换算法找到一个需要换出的页框。 -
旧页面写回:如果找的页框中的内容被修改了,则需要将修改的内容保存到磁盘上。(注:此时需要将页框置为忙状态,以防页框被其它进程抢占掉)
-
新页面调入
2
:页框“干净”后,操作系统将保存在磁盘上的页面内容复制到该页框中。 -
更新页表:当磁盘中的页面内容全部装入页框后,向操作系统发送一个中断。操作系统更新内存中的页表项,将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态。
-
恢复现场:恢复缺页中断发生前的状态,将程序指针重新指向引起缺页中断的指令。
-
继续执行:程序重新执行引发缺页中断的指令,进行存储访问。
28.页面置换策略
-
最优置换:置换掉未来最久不被使用的页。
需要引用先验知识,因此无法被实现。
-
先进先出
First-in, First-out
:记录每个页被调入内存的时间,选择最旧的页换出。Belady
现象:在使用FIFO算法作为缺页置换算法时,分配的页面增多,但缺页率反而提高。(改进:)
-
Second Chance
:如果被淘汰的数据之前被访问过,则给其第二次机会。 -
Clock
:通过一个环形队列,避免将数据在FIFO队列中移动。
-
-
最近最少使用
Least recently used
:如果数据最近被访问过,那么将来被访问的几率也更高。 -
老化算法(
AGING
):LRU
的简化,但性能接近LRU
。
29.工作集与驻留集管理
-
进程的工作集:当前正在使用的页面的集合。
引入工作集的目的是依据进程在过去的一段时间内访问的页面来调整常驻集大小。
-
工作集策略:
\(w(k,t)=|WS(k,t)|\) 指工作集大小即页面数目。(第
t
时刻k
个最近的内存引用使用的页数)工作集大小的变化:进程开始执行后,随着访问新页面逐步建立较稳定的工作集。当内存访问的局部性区域的位置大致稳定时,工作集大小也大致稳定;局部性区域的位置改变时,工作集快速扩张和收缩过渡到下一个稳定值。
-
-
进程的驻留集:虚拟存储系统中,每个进程驻留在内存的页面集合,或进程分到的物理页框集合。
30.改善时间性能的途径
- 降低缺页率
- 提高外存的访问速度
- 高速缓存命中率
31.写时复制技术
两个进程共享同一块物理内存,每个页面都被标志成了写时复制。共享的物理内存中每个页面都是只读的。如果某个进程想改变某个页面时,就会与只读标记冲突,而系统在检测出页面是写时复制的,则会在内存中复制一个页面,然后进行写操作。新复制的页面对执行写操作的进程是私有的,对其他共享写时复制页面的进程是不可见的。
32.页目录自映射
虚拟地址空间内的映射,与虚拟地址到物理地址的映射无关。
-
页目录定义:页表页的地址映射。页目录就是
4MB
页表中的一页。 -
构建方法
- 给定一个页表基址
PTbase
,该基址需4M
对齐,即\(PTbase =(( PTbase)>> 22)<< 22\)(低22位全为0) - 页目录表基址
PDbase
:\(PDbase= PTbase | (PTbase)>>10\) - 自映射目录表项
PDEself-mapping
在:\(PDEself-mapping = PTbase |(PTbase)>>10| (PTbase)>>20\)
- 给定一个页表基址
-
计算
-
给定页表起始地址(虚拟地址,
4MB
对齐)b
,页目录起始地址 \(= b+(b>>10) = b+b/1024\)理解:右移是在下一级页表里面找第几个,或就是从下一级页表的基地址开始找。
-