首页 > 代码库 > 操作系统 内存管理机制
操作系统 内存管理机制
- 虚拟地址空间 与 物理地址空间的关系
页表就像一个函数,输入是页号,输出是页桢,实现从页号到物理地址的映射。
操作系统给每一个进程维护一个页表。所以不同进程的虚拟地址可能一样。页表给出了进程中每一页所对应的页帧的位置。
PS:“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,同时,隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。
2. 页面置换
区分概念:虚拟内存、物理内存、Swap分区(硬盘存储区)
虚拟内存映射整个程序存储空间,并将当前运行的数据 通过虚拟空间 映射到 对应的物理内存上运行,物理内存不足时,将其中一部分数据交换到 硬盘交换区--swap中,当需要时,在将swap分区的内容,置换到物理内存中。
页面置换:把一个页面从内存调换到磁盘的交换区中 (swap分区,即硬盘存储区的一部分)
Swap分区在系统物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。
抖动:在具有虚存的计算机中,由于频繁的调页活动使访问磁盘的次数过多而引起的系统效率降低的一种现象。
例:操作系统同时运行多个程序,当切换到一个很长时间没有理会的程序时,会听到硬盘“哗哗”直响。这是因为这个程序的内存被那些频繁运行的程序给“偷走”了,放到了Swap区中。因此,一旦此程序被放置到前端,它就会从Swap区取回自己的数据,将其放进内存,然后接着运行。
并不是所有从物理内存中交换出来的数据都会被放到Swap中。有相当一部分数据被直接交换到文件系统。例如,对文件进行读写,当需要将这些程序的内存空间交换出去时,可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。 但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。
3. Swap分区
Swap空间是分页的(物理存储器以页帧为单位划分),每一页的大小和内存页的大小一样,方便Swap空间和内存之间的数据交换。
旧版本的Linux实现Swap空间时,用Swap空间的第一页作为所有Swap空间页的一个“位映射”(Bit map)。这就是说第一页的每一位,都对应着一页Swap空间。如果这一位是1,表示此页Swap可用;如果是0,表示此页是坏块,不能使用。这么说来,第一个Swap映射位应该是0,因为,第一页Swap是映射页。另外,最后10个(字节)映射位也被占用,用来表示Swap的版本。那么,如果说一页的大小为s,这种Swap的实现方法共能管理“8 * ( s - 10 ) - 1”个Swap页。对于i386系统来说s=4096,则空间大小共为133890048,如果认为1 MB=2^20 Byte的话,大小正好为128M。
Linux取消了位映射的方法,也就取消了128M的限制。直接用地址访问,限制为2G (不理解)
4. Swap大小的分配(对性能的影响)
如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。
通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,具体配置参见各服务器产品的说明。
因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。
在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
参考此处