------非连续存储分配-------
概念:将进程存储在非连续的内存空间-->进而需要将进程划分成小的部分
根据划分粒度的大小可以分为:段式/页式内存分配方式
1.页式存储管理--前提(进程并不要求逻辑地址必须连续)
注意:其实进程被分为许多片段,零散的分布在内存中不存在确定的顺序
* 页式存储管理具体操作
# 将物理空间等分为固定长度的数据块--称为页帧(frames)-f
# 将逻辑空间等分为长度固定的数据块--称为页面(pages)--p
注意:页面和页帧的大小保持一致;通常页面大小是2的幂
大小在512B--8192B之间
# 页表:是一个数组:下标是:页号;元素是:页帧。
# 将逻辑地址翻译成物理地址的过程
1.将逻辑地址空间2^m 页面长度2^n,总页面个数2^(m-n);后n位对应的
2^ n为该页面偏移量d
2.页号:逻辑地址的前(m-n)位,通过页号查找页表,找到该页面
对应的页帧f。
3.物理地址= 页帧值*页面大小+页面偏移量 realadd = f*2^(2^n) + d;
2.页式内存管理中OS所起的作用、负责的是什么
* OS负责监控所有的空闲页帧
若进程需要n个逻辑页面,OS分配n个空闲页帧给进程,使得进程
可以将数据和代码装进内存
* OS分配页表所需要的物理空间,布置好页表定义映射函数;
注意:页式分配存在内部碎片
3.如何实现页表?
* 页表必须常驻内存(寄存器大小有限)数组实现
* 页表的基地址寄存器--必须指向页表的首地址
* 页表的长度寄存器表示页面占的内存空间大小
4.如何提高页式存储分配的速度?
* 按照页表在内存中,地址转化需要访问两次内存;解决两次内存访问
TLBs:translation look-aside buffers
借助TLBs快表实现对页表部分内容的缓存;减少一次访问内存(空间局部)
TLB本质是一个硬件设备---是关联存储器(该结构支持并行搜索-速度超快)
TLB支持对地址(p,d)翻译
命中:p在TLB里面,直接获取页帧
不命中:p不再TLB里面,在内存中的页表找到页帧号,并将该页桢copy进tlb
5.页式分配--内存保护
在页面的每个页表项中,为每个页设置一个包含位代表--有效、保护
有效:表示该页面在进程的逻辑地址范围,因此是合法页面可以访问
无效:表示该页面在进程的逻辑地址范围外,不可以进行访问
保护位:操作的类型限制;只读等。
6.共享页面
共享代码:只读的代码(可重入)只需要存储一份,供若干个进程共享
对于所有进程来说共享的代码必须位于逻辑地址相同的位置
进程自有代码数据:进程各自拥有一份,为自有的代码数据分配的页面
可以分布在逻辑地址空间的任意位置
7.对于页表过大的处理
# 采用多级页表
# 采用反向页表