内存定位技术
内存定位有三种方式:绝对地址、静态重定位和动态重定位。
绝对地址:
使用绝对地址是最简单的定位方式。例如在一个程序中,执行JMP 28就会跳转到内存的28号存储单元。无论程序在内存中的什么位置都是如此。显然这种定位方式不允许内存中同时存在两个程序,否则一个程序的程序计数器很可能会跳转到另一个程序的空间中。
静态重定位:
静态重定位的处理方法为在加载程序到内存中时,将程序中所有的地址都加上在内存中的起始地址。比如一个程序被加载到从1000号开始的内存空间,而且程序中有一条指令JMP 28,那么程序被加载入内存后这条指令会变成 JMP 1028。静态重定位的难点在于区分程序中哪些值是常量,哪些值是地址。
动态重定位:
使用动态重定位的cpu有两个特殊的寄存器:基址寄存器和界限寄存器。当一个进程运行时,程序的起始地址被装载到基址寄存器中,程序的长度被装载到界限寄存器中。当程序要进行内存操作时,cpu会首先将指令中的地址加上基址寄存器中的地址,再把地址送到内存总线。此外,cpu还会检查地址是否大于界限寄存器中的值。如果访问的地址超出了界限则会出错并停止访问。
交换技术
交换就是把暂时不用的进程放到外存上,需要时再读入内存。
有些进程的数据段可以增长。因此在把进程移入内存时通常会为它分配一些额外的空间。
空闲内存管理
位图法:
把内存空间划分成大小相等的块,用一个位图来记录这些块的使用情况。某一位为0代表对应的块空闲,1代表被使用。
链表法:
使用一个双向链表记录内存的使用情况。除了指向前后节点的指针外,链表的节点中还包含三个字段:标志位(标志内存是否空闲)、内存段的起始地址,内存段的长度。
加载一个进程时,在链表中找到一个大于或等于进程大小的空闲段,修改空闲段节点,并插入进程段节点。
进程被移出内存时,删除进程段节点,根据具体情况增加或合并空闲段节点。