1、分段
段的定义:把程序与其相关的数据划分到几个段中,比如数据段、代码段和堆栈段。段的长度有限制,但是不要求所有程序的所有段长度都一样。
分段:一个程序的所有段被装入内存中时,同样不要求这些段是连续的。分段类似于动态分区,当段放入内存中时,系统会为这些段分配容量相等的内存空间,随着大小不同的段被放入内存,渐渐会产生外部碎片,即段外部的内存小碎片。如图,放了进程1、2、3之后内存剩余4MB,很难再放入其他段了,这就是外部碎片。
段表:段表中的每一项表示一个段,由于段的长度可以不同,所以段表项不仅要给出这个段在内存中的起始位置,还要给出该段的长度。
地址转换:采用分段技术时的逻辑地址也是由段号和偏移量组成。以段号为索引,查找段表中的对应项,找到这个段的起始内存地址,再判断偏移量是否超出了该段的长度,超出则地址无效。物理地址就是该段的起始地址与偏移量之和。
2、分页
页的定义:内存被划分成大小固定、相等的块,且块比较小,每个进程也被划分成一个个这样的块,进程中的块称为页(page),内存中的可用块称为页框(frame),进程中的页可以被装载到内存的页框中(类似把照片放入相框)。
分页:每个进程占用独立的虚拟地址空间,进程的整个空间并不实际存放在内存中,内存一般只存储进程的一部分。操作系统以页的方式,将进程的一部分页面换入内存或者换出到外存。分页不存在外部碎片,进程在被划分成页时,仅进程的最后一页可能会出现未使用的空间,即内部碎片。
页表:一个进程的所有页在内存中可以不是连续存放的,操作系统为每个进程维护一个页表,页表中每一项代表一页,每个页表项指明该页对应的页框地址&#x