一、程序装载过程中遇到的两个问题
1)可执行程序加载到内存后的空间应该是连续的。
因为执行指令的时候,程序计数器是一条一条指令顺序的执行下去。这意味着指令需要连续的存储在一起。
2)多道程序。加载多个程序的同时,意味着我们不能指定进程一定加载到内存的某个位置上去。
二、内存映射
在内存中找到一块连续的空间(物理内存),将这段连续的空间和程序中指令的空间对应起来的行为(虚拟内存)叫做内存映射。
三、内存分段
将不同大小的程序一段接着一段,完全载入内存当中。这里的段,指的是分配给整个程序的内存,但是这样子会有一个问题。当中间的某一段程序结束运行后,会空出一块内存。如果新的程序的大小大于这块内存的大小,则新的程序无法被载入这个内存当中,会造成内存碎片。
四、内存交换
如何解决内存碎片呢?将后面的程序先移入到磁盘当中,以磁盘作为中间程序暂时放置的地方。
然后再将这个程序载入内存,载入地址从紧挨着上一个程序开始。
但是这样又有一个问题:磁盘和内存交换需要花费的时间较多,会造成程序运行的卡顿。
五、内存分页
将内存以一定的大小均匀的分成若干段,程序也以同样的大小分成若干段,每次只载入需要运行的几段。如果运行到了那一段却没有载入则 CPU 会引发一个缺页错误。
操作系统捕捉到这个错误会将程序剩下的页从磁盘中载入到内存当中使得程序可以接着运行。
通过引入虚拟内存,页交换,内存分页这些机制,程序在运行的时候不再需要考虑到真实的地址空间的位置。