1.地址重定位(非常重要)也叫地址转换、映射、翻译

之前知道:程序装载到内存才可以运行,通常,程序可执行文件格式保存在磁盘上;多道程序设计模型,允许多个程序同时激怒内存;每个进程有自己的地址空间,进程不能执行不合适的操作

要解决问题:

进程地址空间加载到物理内存,多个进程地址空间都要加载到物理内存

复习进程地址空间:内核地址空间+用户地址空间(栈,堆,数据段,代码段,其他内容:共享库,内存映射文件)

讨论:进程中的地址不是最终的物理地址,在进程运行前无法计算出物理地址(因为不确定进程被加载到内存什么地方)需要地址重定位的支持

逻辑地址(相对地址,虚拟地址):

用户程序经过编译、汇编后形成目标代码,目标代码通常采用相对地址,首地址为0,其余地址都相对于首地址而编

物理地址(绝对地址,实地址):

内存中存储单元的地址,可直接寻址

为了保证CPU执行指令时可正确访问内存单元,需要将用户程序中的逻辑地址转换为运行时可由机器直接寻址的物理地址,这一过程为地址重定位

2.

(1)静态重定位:

当用户程序加载到内存时,一次性实现逻辑地址到物理地址的转换

一般由软件完成

(2)动态重定位(常用)

在进程执行过程中进行地址变换,即逐条指令执行时完成地址转换

需要硬件部件支持

3.空闲内存管理

数据结构:位图;空闲区表、已分配区表;空闲块链表

内存分配算法:

(1)首次适配:在空闲区找到一个满足进程要求的

(2)下次适配:从上次找到的空闲区接着查找

(3)最佳适配:查找整个空闲区表,找到能够满足进程要求的最小空闲区

(4)最差适配:总是分配满足进程要求的最大空闲区

将该空间分为两部分,一部分供进程使用,另一部分形成新的空闲区

4.回收问题:

内存的回收算法:当一块归还后,前后空闲空间合并,修改内存空闲区表

5.伙伴系统(linux底层内存管理采用的一种特殊的“分离适配”算法)

主要思想:将内存按着2的幂进行划分,组成若干空闲块链表;查找该链表找到满足进程需求的最佳匹配块

算法:首先将整个可用空间看做一块 2u,假设进程申请的空间为s,如果2u-1<s<2u,则分配整个块,否则继续划分一分为2

6.基本内存管理方案:

加载的单位:进程

单一连续区,固定分区,可变分区,页式,段式,段页式(嗯……又是我背过但不知所云的)

7.单一连续区:

特点:一段时间内只有一个进程在内存中。简单,内存利用率低

8.固定分区

把内存空间分割成若干区域,成为分区

每个分区的大小可以相同也可以不同

分区大小固定不变

每个分区装一个且只能装一个进程

9.可变分区(早期手机存储)

根据进程的需要,把内存空闲空间分割出一个分区,分配给该进程

剩余部分成为新的空分区

缺点:剩的外碎片导致内存利用率下降

碎片问题的解决:

很小、不易利用的空闲区,导致内存利用率下降

方案:紧缩技术:

在内存移动程序,将所有小的空闲区合并为较大的空闲区

紧缩技术需要考虑:

系统开销&移动时机

10.交换技术:

解决问题:内存不足如何管理:大的进程地址空间无法加载入小的内存中

方案:内存“扩充”技术

内存紧缩技术(例如 可变分区)

覆盖技术

交换技术

虚拟存储技术

11.覆盖技术(主要用于早期操作系统)

解决问题:程序大小超过物理内存总和

程序执行过程中,程序的不同部分在内存中相互替代

按照其自身的逻辑结构,将那些不会同时执行的程序段共享同一块区域:要求程序各模块之间有明确的调用结构

程序员声明覆盖结构,操作系统完成自动覆盖

缺点:对用户不透明 要求程序结构

12.交换技术:

内存空间紧张时,系统将内存中某些进程暂时移动到外存,把外存中某些进程换进内存,占据前者所占用的区域

运行时创建或者修改的内容:堆栈

交换区:一般系统会指定一块特殊的磁盘区域作为交换空间,包含连续的磁道,操作系统可以使用底层的磁盘读写操作对其高效访问(windows叫做页文件)

何时交换:只要不用就换出(很少使用);内存空间不够或不够危险时换出   与调度器结合使用

考虑进程的各种属性:不应该换出处于等待I/O状态的进程

13.虚拟存储技术:

当进程运行时,先将其一部分装入内存,另一部分暂留在磁盘,当要执行的指令或者访问的数据不在内存时,由操作系统自动完成将它们从磁盘调入内存的工作

虚拟地址空间:即为分配进程的虚拟内存

虚拟地址:在虚拟内存中指令或者数据的位置,该位置可以被访问,仿佛他是内存的一部分

14.存储器的层次结构:

寄存器;高速缓存Cache L1;高速缓存 CacheL2;高速缓存 CacheL3;内存;磁盘

15.虚存与存储体系:

进程的地址空间(虚存)->寄存器 Cache 内存 磁盘

把内存与磁盘有机结合起来使用,从而得到一个容量很大的“内存”,即虚存

虚存是对内存的抽象,构建在存储体系之上,由操作系统协调各存储器的使用

虚存提供了一个比物理内存空间大得多的地址空间

16.地址保护

请确保每个进程有独立的地址空间

确保进程访问合法的地址范围(防止地址越界)

确保进程的操作是合法的(防止访问越权)

17.虚拟页式(PAGING)

虚拟存储技术+页式存储管理方案->虚拟页式存储管理系统

基本思想:

进程开始运行之前,不是装入全部页面,而是装入一个或零个页面

之后,根据进程运行的需要,动态装入其他页面

当内存空间已满,而又需要装入新的页面时,则根据某种算法置换内存中的某个界面,以便装入新的页面

具体两种方式:1.请求调页  2.预先调页

以CPU时间和磁盘空间换区昂贵的内存空间,这就是操作系统中的资源转换技术

18.页表表项设计:

页表由页表项组成

页框号(内存块号。物理页面号、页帧号)、有效位(驻留位、中断位):表示该页是在内存还是在磁盘、访问位:引用位、修改位:此页在内存中是否被修改过、保护位:读/可读写

通常,页表项是硬件设计的

19.页表:

页表页在内存中若不连续存放,则需要引用页表页的地址索引表->页目录(多级页表)

二级页表最多4G虚拟内存

20.反转(倒排)页表

地址转换:从虚拟地址空间出发:虚拟地址->查页表->得到页框号->形成物理地址

每个进程一张页表

解决思路:

从物理地址空间出发,系统建立一张页表

页表项纪录进程i的某个虚拟地址(虚页号)与页框对应

将虚拟地址的页号部分映射到一个散列值

散列值指向一个反转页表

反转页表大小与实际内存成固定比例,与进程个数无关

21.内存管理单元MMU

将虚拟地址转换成物理地址

22.快表(TLB)的引入:

问题:页表两次货两次以上的内存访问,CPU的指令处理与内存指令的访问速度差异大,CPU的速度得不到充分利用

如何加快地址映射速度,以改善系统性能

程序访问的局部性原理->引入快表(TLB)translation look-aside buffers

在CPU中引入的告诉缓存,可以匹配CPU的处理速率和内存的访问速度

一种随机存取型存储器,除连线寻址机制外,还有接线逻辑,能按特定的匹配标志在一个匹配标志在一个存储周期内对所有的字同时比较

相联存储器(associative memory)特点:按内容并行查找

保存正在云星锦城的页表的子集

快表的大小、位置(64项、128项 也可以分级;在CPU上)容量有限

23.页错误:

又称页面错误、页故障、页面失效

地址转换过程中硬件产生的异常

具体原因:

(1)所访问的虚拟页面没有调入物理内存(缺页内存)

(2)页面访问违反权限(读写,用户内核)

(3)错误的访问地址 虚拟地址指向了没有内容的地址

24.缺页异常处理:

是一种页错误

在地址映射过程中