方便查看篇---内存
2016-07-10 21:39
295 查看
内存篇
虚拟内存就是操作系统对存储的抽象,为每个程序提供一个比实际物理内存大得多的地址空间。
虚拟地址到物理地址的转换。
这种转换时由硬件mmu来完成的,操作系统采用的是页式存储,那么会先查页表,从页表中查找该虚拟地址对应的物理页面,如果该虚拟地址是受保护则禁止访问,或者该虚拟地址对应的物理页面没有在主存中那么就发生缺页中断,将页面由磁盘装入对应的物理页,并建立映射关系。
由于页表太庞大,那么会占用大量的内存,所以会将页表分级,二级或者三级页表。
这样可以采用将顶级的页表常驻内存,然后将不常用的页表放在磁盘上,但是这样就存在查询的效率降低,为此,加上了缓存,将查询到的结果和可能会用到的下一个页面映射关系放到缓存中去,先查缓存,未命中在查页表。而这个缓存通常也是硬件TLB(翻译快表)。
如果将新页放到内存时没有足够的内存,会发生换页,因此存在内存抖动问题。可以改善页面替换算法,或者增加内存,或者替换整个进程到磁盘。降低多道程序运行度数。
页面替换算法:
LRU算法的实现:
可以采用链表也可以采用矩阵。
每个页面被访问就将页面号对应的行置1,列置0.
每行01连接起来最小的值就是最近未被使用的。。
固定驻留集和非固定驻留集的含义。
分页内存管理的缺点:共享困难,因为一个页面上可能有代码也可能有数据。一个进程只能一个虚拟地址空间。
分段管理:
分段管理就是将一个程序按照逻辑单元分为多个程序段,比如常见的代码段,数据段等。其中每个程序段都有一个单独的虚拟地址空间。
然后会有一个段表,cpu发出的地址也会划分成页号,页内偏移。
段页式内存管理:
程序分段,段内分页。段号会通过寄存器来存放。不是通过虚拟地址来识别段号。
Linux内核的内存管理:
段,页,区,slab层。
Slab层相当于一个数据结构池,用来存放频繁创建和释放的数据结构。比如经常使用的task_struct,
每个进程内核栈都是固定大小的,而且是并不大的。
高端内存和映射
相关文章推荐
- Mention
- 【Python学习笔记】函数式编程:装饰器
- Python 模块 & 作用域
- codeforces 2A-Winner (map)
- Helvetic Coding Contest 2016 online mirror C1
- Spring (三)配置文件详解
- html+js+cgi
- 泛型的典型应用:人的信息类和接口
- Java 之多线程同步
- 方便回顾篇进程
- 最小点覆盖 hdu--1054
- 最小点覆盖 hdu--1054
- 图片相似度比较--算法
- css
- android.os.NetworkOnMainThreadException 异常处理
- 存储过程使用DDL语句
- 算法导论(3) 快速排序、计数排序、基数排序
- Android开源项目 工具库
- Python 函数式编程--偏函数
- http://ftp.gnu.org/gnu/ http://ftp.gnu.org/gnu/libc/