interview

内存管理

存储器工作原理

应用程序如何在计算机系统上运行的呢?首先,用编程语言编写和编辑应用程序,所编写的程序称为源程序,源程序不能再计算机上直接被运行,需要通过三个阶段的处理:编译程序处理源程序并生成目标代码,链接程序把他们链接为一个可重定位代码,此时该程序处于逻辑地址空间中;下一步装载程序将可执行代码装入物理地址空间,直到此时程序才能运行

程序编译

源程序经过编译程序的处理生成目标模块(目标代码)。一个程序可由独立编写且具有不同功能的多个源程序模块组成,由于模块包含外部引用(即指向其他模块中的数据或指令地址,或包含对库函数的引用),编译程序负责记录引用发生的位置,其处理结果将产生相应的多个目标模块,每个模块都附有供引用使用的内部符号表和外部符号表。符号表中依次给出各个符号名及在本目标模块中的名字地址,在模块链接时进行转换

程序链接

链接程序(Linker)的作用是根据目标模块之间的调用和依赖关系,将主调模块、被调模块以及所用到的库函数装配和链接成一个完整的可装载执行模块。根据程序链接发生的时间和链接方式,程序链接可分为以下三种方式:

运行时链接将链接推迟到程序执行时,可以很好的提高系统资源的利用率和系统效率。

程序装载

程序装载就是将可执行程序装入内存,这里有三种方式:

磁盘中的装载模块所使用的是逻辑地址,其逻辑地址集合称为进程的逻辑地址空间。进程运行时,其装载代码模块将被装入物理地址空间中,此时程序和数据的实际地址不可能同原来的逻辑一致。可执行程序逻辑地址转换为物理地址的过程被称为 “地址重定位”

重定位寄存器:用于保存程序内存起始地址。

连续存储管理

固定分区存储管理

固定分区存储管理又称为静态分区模式,基本思想是:内存空间被划分成数目固定不变的分区,各分区大小不等,每个分区装入一个作业,若多个分区中都有作业,则他们可以并发执行。

为说明各分区分配和使用情况,需要设置一张内存分配表,记录内存中划分的分区及其使用情况。内存分配表中指出各分区起始地址和长度,占用标志用来指示此分区是否被使用。

可变分区存储管理

可变分区存储管理按照作业大小来划分分区,但划分的时间、大小、位置都是动态的。系统把作业装入内存时,根据其所需要的内存容量查看是否有足够空间,若有则按需分割一个分区分配给此作业;若无则令此作业等待内存资源。

在可变分区模式下,内存中分区数目和大小随作业的执行而不断改变,为了方便内存空间的分配和去配,用于管理的数据结构可由两张表组成:已分配区表和未分配区表。当装入新作业时,从未分配区表中找出一个足够容纳它的空闲区,将此区分为两个部分,一部分用来装入作业,成为已分配区;另一部分仍是空闲区(若有)。这时,应从已分配区表中找出一个空栏目登记新作业的起始地址、占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时,已分配区表中的相应状态改为空闲,而将收回的分区登记到为分配区中,若有相邻空闲区再将其连接后登记

常用的可变分区分配算法

分页存储管理

分段存储管理

分页和分段的主要区别:

段页式存储管理

用户程序先分段,每个段内部再分页(内部原理同基本的分页、分段相同)

内存分配

虚拟地址先经过分段机制映射到线性地址,然后线性地址通过分页机制映射到物理地址

虚拟内存–请求分页虚拟存储管理

请求调页,也称按需调页,即对不在内存中的“页”,当进程执行时要用时才调入,否则有可能到程序结束时也不会调入。

页面置换算法

内存抖动现象:页面的频繁更换,导致整个系统效率急剧下降,这个现象称为内存抖动(或颠簸)。抖动一般是内存分配算法不好,内存太小引或者程序的算法不佳引起的。

交换区:用于保存请求分页淘汰出来的页面。