您的位置:首页 > 其它

方便查看篇---内存

2016-07-10 21:39 295 查看

内存篇

 

虚拟内存就是操作系统对存储的抽象,为每个程序提供一个比实际物理内存大得多的地址空间。

 

虚拟地址到物理地址的转换。

这种转换时由硬件mmu来完成的,操作系统采用的是页式存储,那么会先查页表,从页表中查找该虚拟地址对应的物理页面,如果该虚拟地址是受保护则禁止访问,或者该虚拟地址对应的物理页面没有在主存中那么就发生缺页中断,将页面由磁盘装入对应的物理页,并建立映射关系。

由于页表太庞大,那么会占用大量的内存,所以会将页表分级,二级或者三级页表。

这样可以采用将顶级的页表常驻内存,然后将不常用的页表放在磁盘上,但是这样就存在查询的效率降低,为此,加上了缓存,将查询到的结果和可能会用到的下一个页面映射关系放到缓存中去,先查缓存,未命中在查页表。而这个缓存通常也是硬件TLB(翻译快表)。

 

 

如果将新页放到内存时没有足够的内存,会发生换页,因此存在内存抖动问题。可以改善页面替换算法,或者增加内存,或者替换整个进程到磁盘。降低多道程序运行度数。

 

 

页面替换算法:

 

LRU算法的实现:

可以采用链表也可以采用矩阵。

 

每个页面被访问就将页面号对应的行置1,列置0.

 

每行01连接起来最小的值就是最近未被使用的。。

 

固定驻留集和非固定驻留集的含义。

 

分页内存管理的缺点:共享困难,因为一个页面上可能有代码也可能有数据。一个进程只能一个虚拟地址空间。

 

 

分段管理:

分段管理就是将一个程序按照逻辑单元分为多个程序段,比如常见的代码段,数据段等。其中每个程序段都有一个单独的虚拟地址空间。

 

 

 

然后会有一个段表,cpu发出的地址也会划分成页号,页内偏移。

 

 

段页式内存管理:

程序分段,段内分页。段号会通过寄存器来存放。不是通过虚拟地址来识别段号。

 

 

 

Linux内核的内存管理:

段,页,区,slab层。

 

Slab层相当于一个数据结构池,用来存放频繁创建和释放的数据结构。比如经常使用的task_struct,

 

每个进程内核栈都是固定大小的,而且是并不大的。

 

 

高端内存和映射

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: