本文已参与「新人创作礼」活动,一起开启掘金创作之路。
分页和分段有什么区别?
- 页式存储:将进程空间在逻辑上划分成大小相等的若干页面,相应的在物理上划分成与页面大小相同的物理块,逻辑上连续的页面物理上不一定连续。
- 段式存储:将进程空间在逻辑上划分成若干段(非等分) ,段长度由连续逻辑的长度决定(如代码段,数据段,堆栈段),分配时以段为单位,各段不一定连续。
- 段页式存储:先将进程空间在按段式存储划分成若干段,再把段内空间按页式存储等分成若干页。
区别:
- 目的不同:分页的目的是管理内存,用于虚拟内存以获得更大的地址空间;分段的目的是满足用户的需要,使程序和数据可以被划分为逻辑上独立的地址空间;
- 大小不同:段的大小不固定,由其所完成的功能决定;页的大小固定,由系统决定;
- 地址空间维度不同:分段是二维地址空间(段号+段内偏移),分页是一维地址空间(每个进程一个页表/多级页表,通过一个逻辑地址就能找到对应的物理地址);
- 分段便于信息的保护和共享;分页使信息共享受到限制;
- 碎片:分段没有内碎片,但会产生外碎片;分页没有外碎片,但会产生内碎片(一个页填不满)
什么是虚拟内存?
每个程序都拥有自己的地址空间,这个地址空间被分成大小相等的页,这些页被映射到内存;但不需要所有的页都在内存中,当程序用到不在物理内存中的页时,由操作系统将缺失的部分装入内存。这样,对于程序来说,逻辑上似乎有很大的内存空间,只是实际上有一部分是存储在磁盘上,因此叫做虚拟内存。
虚拟内存的优点是让程序可以获得更多的可用内存。
如何进行地址空间到物理内存的映射?
内存管理单元(MMU)管理逻辑地址和物理地址的转换,页表(Page table)存储着页(逻辑地址)和页框(物理内存空间)的映射表,页表中还包含有效位(是在内存还是磁盘)、访问位(是否被访问过)、修改位(内存是否被修改过)、保护位(只读还是可读写)。逻辑地址:页号+页内地址(偏移);每个进程有个页表,页表起始地址在PCB/寄存器中。
有哪些页面置换算法?
在程序运行过程中,如果访问的页面不在内存中就发生缺页中断将该页调入内存中。此时如果内存已无空闲空间,则从内存中调出一个页面到磁盘中来腾出空间。页面置换算法的主要目标是使页面置换频率最低(缺页率最低)。
- 最佳页面置换算法OPT(Optimal replacement algorithm):置换以后不需要或最久才需要的页面,是一种理论上的算法,是最优策略;
- 先进先出FIFO:置换在内存中驻留时间最长的页面。缺点:经常被访问的页面也会被换出,从而使缺页率升高;
- 最近最少使用算法LRU(Least Recently Used):选择最近且未被使用时间最久的页面进行淘汰。
- 第二次机会算法SCR:按FIFO选择某一页面,若其访问位为1,给第二次机会,并将访问位置0;
- 时钟算法 Clock:SCR中需要将页面在链表中移动(第二次机会的时候要将这个页面从链表头移到链表尾),时钟算法使用环形链表,再使用一个指针指向最老的页面,避免了移动页面的开销;
- 最近未使用算法NRU(Not Recently Used):检查访问位R、修改位M,优先置换R=M=0,其次是(R=0, M=1);
- 最不经常使用算法NFU:置换出访问次数最少的页面