标签:
1.
2.内存管理需要达到的目的?
1)地址保护:多道程序之间互不干扰,一个进程不能随便访问另外一个进程的地址空间。
2)地址独立:程序发出的地址与具体机器的物理主存地址是独立的。
3.为什么提出了虚拟内存?
在计算机中,一个程序要运行,必须加载到物理主存中,但是物理主存的容量是非常有限的,因此我们要把一个程序全部加载到主存,我们的每一个程序大小就要限制。另外,即使我们编写的每一个程序的大小都小于物理主存的容量,但主存能够存放的程序数量也是有限的。这将大大限制多道编程的发展,所以我们发明了虚拟内存的概念!因为有了虚拟内存,我们编写程序的大小不在受主存容量的限制。
4.
5.内存管理的第一个要面对的问题就是操作系统程序本身在内存中存放的位置,或者说我们如何将内存空间在操作系统和用户程序之间进行分配?
6.多道编程的情况下,无法将程序总是加载到固定的内存地址上,也就是无法使用静态地址翻译,是在程序运行时进行地址翻译,这种翻译称为动态地址翻译。
7.多道编程下的内存管理策略有两种:固定分区和非固定分区。
8.固定分区的多道编程内存管理:将内存分为固定的几个区域,每个区域的大小固定,而这些分区的大小可以一样,也可以不一样,当程序加载时,选择一个当前未使用的最合适的固定分区加载。如下图:
这种模式下,一个新的程序想要加载,必须要在队列里等待推进,等到它有机会加载时,还要看有没有合适的分区适合它,我们不可避免的会让一个小程序占有了一个大分区,后面的大程序而不能立刻加载。所以我们想出了下面的固定分区模式,
给每一个分区一个队列,程序按大小排在相应的队列里。其实这也有缺点,就是有空闲的分区,但等待的程序不在该分区的队列中,资源就被白白浪费。
9.由于程序加载到内存的地址不是固定的,那么我们如何来进行地址翻译?
物理地址=虚拟地址+程序所在的区域的起始地址。程序所在的区域的起始地址又称为程序基址。
在多道程序编程时,为了实现程序的内存保护,只要我们访问的地址满足以下条件即为合法访问:程序所在区域的起始地址<=有效地址<=程序所在区域的起始地址+程序长度,我们只要设置两个端值:基值和极限,可以用寄存器来存放,分别称为基值寄存器和极限寄存器。基值和极限是很重要的两个参数,只有内核能够改变它们,如果切换程序,只要保存基值寄存器和极限寄存器的值按照新程序的情况重新设置即可。
10.因为虚拟内存的出现,一个程序可以一般放在磁盘上,一半放在内存中。从物理内存上说,一个程序发出的访问地址有可能在内存,有可能在磁盘。
11.固定分区的内存管理的缺点:程序大小和分区大小的匹配不容易让人满意;特殊情况,有程序比最大分区还要大,怎么解决;程序在运行时,内存需要增加怎么处理。所以我们想到了有非固定分区的内存管理。非固定分区的内存管理的思想是,除了划分给操作系统的空间外,其余的内存空间作为一个整体存在。
12.上图的划分存在的问题是:程序在执行后需要更多的空间怎么解决?所以实际应用中采取如11_12下的划分,
13.分配增长空间需要考虑的问题,程序的空间增长通常有两个来源:数据和栈。最简单的方式是数据和栈分别在自己的空间里往一个方向增长,优点是独立性强,缺点是利用率可能低。还有一种办法,就是数据和栈往相反方向增长。
14.为什么会有交换的出现?
操作系统很难知道到底一个程序要分配多少空间?很难知道一个程序要进行多少次嵌套调用?产生多少数据?所以当程序执行过程中真的发现空间不够时我们怎么办?就是给程序换一个更大的空间,我们将其倒到磁盘上,然后在加载到一片更大的空间,这种管理方式称为交换。
15.如果一个程序很大,甚至超过了物理内存,还能运行吗?
利用重叠的管理方式是可以的。
16.双基址
17.闲置空间的管理,两种方法:位图表示和链表表示。如果程序数量少,则链表比较好,因为链表项数量少,同时,它具有一定的容错能力。位图表示的空间成本几乎是固定的,不依赖与程序数量,但它没有容错能力,从时间成本上,链表表示法高于位图表示法。
标签:
原文地址:http://blog.csdn.net/tangxing1212/article/details/44152615