程序运行都需要占用一定的内存。如何分配内存对于充分高效利用计算机资源很重要。
内存分配方式:
1. 一次运行单个程序
即把程序全部装入内存,内存一次只能运行一个程序。
2. 固定长度分区
在装入程序之前,就把把内存分为固定大小的若干分区,比如 2k,2k,4k,4k,8k,16k,32k.
在装入程序时,找到和程序大小最适应的分区大小,然后装入程序。
3. 可变长度分区
在作业装入时,根据作业的大小对内存进行分区。 与之前相比,提高了内存空间利用率,但同时这样会引入移动,合并分区的问题。移动,合并消耗大量系统资源。
4. 分页式存储
把程序按照某个固定大小分成几个部分,每部分称为一页(page). 逻辑地址=(页号,单元号)
把内存按照同样的大小分成若干个区/块,每个块称为一个页框(page frame).
在页面 与 页框 之间建立映射关系。映射关系存储在一张表中,这个表称为页表。(page table )
页表也存储在内存中,并且需要相当大的连续的存储空间,为了改变这种局面,也需要将页表进行分页。每页的大小是一个页面的大小,称为页表页。
记录页表页的表,称为页目录。这样,页表也可以离散地存储在内存中了。
通过查询页目录,页表页,可以将页面号,转换成页框号。这样就完成了逻辑地址到物理地址的转换。
同时,为了提高内存的利用率,对程序可以采用部分装入,部分对调的方式。即每次只将程序运行的部分调入内存中,而不是将程序整个调入内存中。当页表中没有页记录时,再进行缺页处理,然后调入页。
通过这样一系列的方式,物理内存就能够处理比自身大得多的程序。在进行程序设计时,程序也就不必被实际物理大小所限制,相当于程序具有了一个比实际内存大得多的存储,这个就称为虚拟存储器。
虚拟存储器包含的地址空间就叫做虚拟地址空间。
5. 程序的分段存储管理
首先,程序的分段是从程序的逻辑相关性上考虑的。
分段式存储管理的实现可以基于可变分区存储管理的原理,可变分区以整个作业为单位划分和连续存放,也就是说,一个分区内作业是连续存放的,但独立的作业之间不一定连续存放。而分段方法是以段为单位划分和连续存放,为作业的每一段分配一个连续的主存空间,而各段之间不一定连续。
虚拟存储管理:
1.请求分页式虚拟内存管理: 最佳页面大小(512B------4K,一般是4K)
2.请求分段式虚拟内存管理
请求分段虚拟存储管理也为用户提供比主存实际容量大得多的虚拟主存空间。请
求分段虚拟存储系统把作业的所有分段的副本都存放在辅助存储器中,当作业被调度
投入运行时,首先把当前需要的一段或几段装入主存,在执行过程中访问到不在主存
的段时再把它们动态装入。因此,在段表中必须说明哪些段已在主存,存放在什么位
置,段长是多少。哪些段不在主存,它们的副本在辅助存储器的位置。还可设置该段
是否被修改过,是否能移动,是否可扩充,能否共享等标志。
3.请求段页式虚拟内存管理:
结合两者的优点。
1. 物理地址,内存按照固定大小分成一个一个的页框。
2. 虚地址:程序分成若干段。
3. 线性地址:将每一段划分成与页框大小相等的页面。
3. 程序装入内存时,完成虚拟地址到物理地址的转换。
逻辑地址(段号+段内地址)--------->线性地址(段号+段内页号+页内地址)------------>物理地址
页表机制是将逻辑地址映射成物理地址的一种方式。
逻辑地址:即段内偏移地址。
线性地址:段基址+逻辑地址,就是线性地址。
物理地址:页目录(10 bit)+页表(10 bit)+线性地址(12 bit), 就是物理地址。共32位,可表示4G空间。