内存管理
1、什么是内存管理
操作系统对内存的划分和动态分配就是内存管理,主要可以分为:
- 内存空间的扩充(实现虚拟性)
- 内存空间的分配与回收
- 地址转换:操作系统负责实现逻辑地址到物理地址的转换
- 存贮保护:保证各进程在自己的内存空间内运行,不会越界访问
2、内存管理机制和内存管理方式有哪些?
- 分块管理
- 是连续管理的一种,把内存分为几个大小相等且固定的块,每个进程占用其中一个,如果进程很小的话,会浪费大量的空间。已经淘汰。
- 分页管理
- 把内存分为若干个很小的页面,相对比分块的划分力度更大一些。提高内存利用率。减少碎片,页式管理通过页表对应逻辑地址和物理地址。
- 分段管理
- 把内存分为几个大小不定的有实际意义的段,比如 main 函数段,局部变量段,通过管理段表来把逻辑地址转为物理地址。
- 段页式管理
- 结合了段式管理和页面管理的优点,把主存先分为若干个段,每个段又分为若干个页,也就是说段页式管理的段与段以及段的内部都是离散的。
3、什么是分页?
- 把内存空间划分为大小相等且固定的块,作为主存的基本单位。因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录映射关系,以实现从页号到物理块号的映射。
- 访问分页系统中内存数据需要两次的内存访问 (一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。
4、什么是分段?
- 程序是由若干个逻辑分段组成的,可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段的形式把这些段分离出来。
- 分段机制下的虚拟地址由两部分组成,段号和段内偏移量。
- 由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。
5、分页机制与分段机制异同
共同点:
- 1、分页机制和分段机制都是为了提高内存利用率,减少内存碎片。
- 2、页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。
区别:
- 1、分页对用户不可见,分段对用户可见
- 2、分页地址空间一维,分段地址空间二维。分段更容易实现信息的共享与保护
- 3、分段会产生外部碎片;分页内存利用率更高,不会产生外部碎片
- 4、页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序
6、讲一讲虚拟内存
传统存储管理方式的特征、缺点:
- 一次性:作业必须一次性全部装入内存后才能开始运行,这会造成两个问题:
- 作业很大时,不能全部装入内存,导致大作业无法运行;
- 当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
- 驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。
- 事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。
虚拟内存的定义和特征:
- 程序不需全部装入即可运行,运行时根据需要动态调入数据,若内存不够,还需换出一些数据;
- 特征:
- 多次性︰无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
- 对换性︰无需在作业运行时一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
- 虚拟性 : 从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
7、虚拟内存的三种实现技术
- 请求分页式存储管理:
- 建立在分页管理的基础之上,为了支持虚拟内存实现了请求调页和页面置换功能。其具体流程是这样的:
- 首先作业运行时,仅装入当前要执行的部分页面即可。
- 假如在运行的过程中,发现要请求的页面不在内存中,那么处理器通知操作系统按照对应的页面置换算法把相应的页面调入到内存中。
- 如果发现在把页面调入内存时,内存已满,同时也可以把不用的页面置换出去,以便腾出空间装入新的页面。
- 请求分段式存储管理:
- 和分页是一样的,把页换成段即可。
- 请求段页式存储管理
8、缺页中断?
- 缺页概念:内存管理时我们采用的是虚拟内存,虚拟内存并不能与实际内存建立完全的映射关系。缺页就是虚拟内存无法与实际内存建立映射的一种情况。我们通过页表的状态位判断是否产生缺页。缺页发生时,我们就需要将虚拟内存对应的外存中的那一页调入内存。而整个的实现过程是通过中断进行的。
- 这里的缺页中断的流程与普通中断没有区别。就是当系统发现缺页,从而产生中断。需要保存当前的状态,然后进入缺页中断处理程序,之后再恢复原来的状态,继续运行程序。
- 具体的缺页中断处理也要分为两类:第一类是此时内存中还有空闲块,我们直接将缺页从外存中调入内存;第二类是内存已满,需要采用页面置换算法淘汰某页再进行调入。
9、页面置换算法有哪些?
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
- 最佳置换算法(OPT):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
- 先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面。
- 最近最久未使用置换算法(LRU):每次淘汰的页面是最近最久未使用的页面 。
- 时钟(CLOCK)置换算法:
- 当内存中无对应数据,访问位为0即可置换,再变换访问位为1,然后指针下移。
- 当内存中无对应数据,访问位为1不置换,再变换访问位为0,然后指针下移。
- 当内存中有对应数据时,访问位变换,指针下移。
10、讲一讲快表?
快表是一种访问速度比内存快很多的高速缓存,用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
引入快表后,地址的变换过程:
- 首先根据逻辑地址的高位拿到页号,将页号与快表中的所有页号进行比较。
- 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访存即可。
- 如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块
号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,
若快表未命中,则访问某个逻辑地址需要两次访存(注意:在找到页表项后,应同时将其存入快表,
以便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换)
快表的好处:
- 由于查询快表的速度比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间。
- 因为局部性原理,一般来说快表的命中率可以达到 90% 以上。
11、讲讲虚拟地址和物理地址?为什么要有虚拟地址空间?
我们在写程序的时候打交道的都是虚拟地址,比如 C 语言的指针,这个虚拟地址由操作系统决定,而物理地址指的是真实内存地址寄存器的地址。现代处理器通常使用虚拟寻址,用 MMU 把虚拟地址翻译成物理地址才能访问到真正的物理地址。
那么为什么要有虚拟地址呢?
- 如果没有虚拟地址空间的话,我们操作的都是直接的物理地址,这样用户程序可以直接访问到底层的物理地址,很容易破坏操作系统,造成操作系统崩溃。
- 想要同时运行多个程序特别困难,多个程序可能对同一个寄存器进行操作,会发生崩溃。
通过虚拟地址就会得到如下优势:
- 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的内存缓冲区。
- 程序可以使用一系列虚拟地址访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小的时候,内存管理器会将物理页面保存到磁盘里。数据或代码页会根据需要在物理内存和磁盘之间移动。
- 不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一个进程使用的物理内存。