我们知道当多进程在内存中共存时,如果内存足够大都够用,大家相安无事自然是最理想的事了.不过现实往往没那么美好.有些时候内存会满了,不够用了.此时必须将进程从内存移到硬盘中去.有空间时可能又会被移回内存来.专业点的说法叫 滚出(roll-out),滚进(roll-in).或者叫换出,换入.
在进行换出,换入时你可能会想到两种方法
(1)以进程为单位换出换进,这是最简单最容易想到的.但是显然不够灵活,因为一个进程所需的内存空间较大.所以这种交换技术现在用的不多
(2)只交换进程的一部分. 通过页式或段式内存管理先把进程的虚拟地址空间划分为若干页面或段,这样交换时就可就交换页或段.
所谓分页就是把进程的虚拟地址空间划分成大小均匀的一页页的(实际上就是一块块的,把进程切成几小块罢了),比如一页是1K,然后把物理内存也划分成一页页的.然后再把两者映射起来.如下图.哎发现有时说一堆话学不如一个图顶用,下面的图都是我们从别处拷来的,图片原地址http://www.doc88.com/p-982340562158.html
当然这个映射关系的信息肯定要保存在哪.都保存在寄存器中.然后通过逻辑地址找物理地址的流程如下图
分页时,就是不管三七二十一,都一刀切,把程序切成均匀的一页页的.但我们知道程序实际运转时是成为很多模块的,比如一个函数可能是一个模块.如果按程序的逻辑结构来分成更小的组成部分可能更合理.因为程序执行时也可以那样分成一个个小的单位去执行的嘛.这里我们把程序的更小单位叫作业
不过分段存储管理其实跟分页管理大的思想理念是一样的,都是把程序分成更小的单位嘛,便于交换而已.只不过分段不是均匀分成固定大小的页,而是根据实际情况分在大小不均的段.此时由于段大小不一,所以除了知道每个段的开始地址还必须要有段表长度的信息.
逻辑地址与物理地址转换如下图
分页与分段自然是各有好处.分段如果每段太大了自然不太好,那还不如干脆把整个程序交换出去得了,不用整得这么麻烦
于是有人想着把这两种方法结合起来,叫段页式存储管理.你要以在一段内再使用分页技术
我们以前讲了在32的windows上,每个程序运行时都会分配2G的虚拟地址空间.就算你调大的话也最多就3G.从这句话里我们可以延伸出这样一些结论.
1.由于32的系统寻址空间只有4G,所以你整个大于4G的内存完全是浪费资源.系统只会用到其中的4G,多出来的根本不会去用.
2.你可能想着每个进程都是2G的虚拟地址空间,那一个进程加载进内存岂不是会把内存塞满了啊.实际上不会的,因为一来嘛分配给你2G地址空间.你不一定用这么多,可能只用10M,这样加载到内存的时候只加载你实际用的.另外就是不会一次把所有进程需要的内存分配下来然后把程序加载进来,而只是加载暂时需要的程序代码或数据
3.因为每个进程地址空间最大也只能整个3G出来.所以如果你的进程一跑时需要4G的地址空间才够用.那你的电脑肯定没法支持的.所以如果一些大型游戏需要内存特别多,你32的系统不管怎么整就玩不了.
另外你就肯定会有疑问.过去个几年我们买电脑时貌似内存很多都512M,1G就算多了.然后嘛基本是32的系统.那如果某个程序实际有用到1G内存咋整? 因为虽然说程序中分配时是用的虚拟地址空间,但如果你在那2G的虚拟地址空间中实际有用到1G,最后就要映射到实际内存中去的啊.而且你1G的内存地址可是不能出现重复.这样那512内存肯定不够用的.
后面就出现了个虚拟内存的概念.就是划出一部分硬盘来当作内存用.当在虚拟内存空间中实际用到的内存大于物理内存时需要用到虚拟内存.在windows中可以在Advanced system settings那里面去设置虚拟内存的大小.不管如果是32位的话虚拟内存加上实际内存肯定也不能大于4G,不然多出来的那部分也是没有用处的.
假如还是上面的例子,512M内存,然后有1G的进程.你于是可以弄个1G的虚拟内存.然后映射的时候,先在实际的内存中映射,可能除开系统需要的一部分外就剩下300了.于是就先映射这300的内存,剩下的再去虚拟内存中映射.
反正你的用的时候只要发个逻辑地址过去.剩下的事就不用管,操作系统有个MMU(memory management unit),里面会有个页表.反正你输入逻辑地址它最终给你转换成物理内存地址或硬盘地址.
至于具体细节比较麻烦的.大概思路是,进程一般会采取分页技术,分成大小一样的很多页,每页有编号.然后页表里面会把你每页对应内存中具体的一块内存.当超过那300的实际上就对应于虚拟内存中去了.(实际上就是硬盘上的一个swp文件),肯定也有标志信息表明这部分是在硬盘上. 于是当进程运行起来时,需要用到某个地址时就映射到虚拟内存中时就会出现所谓的缺页,那页不在内存中嘛,于是就需要去硬盘上把数据读进内存来,如果内存满了就需要置换出去一些页. 所以你设置了虚拟内存,最后如果真的会有用到,那你会看到硬盘转的很快,然后程序运行速度会变慢.硬盘的操作比内存慢很多