《码农翻身》读书笔记一:局部性原理、虚拟地址、页框、页、页表、段
环境
《码农翻身》
前言
一直对,操作系统的底层概念不是很了解,看着那些枯燥的概念,过不了多久就会忘记。最近看了看这本有趣的书,做个笔记加深这几个概念的理解
局部性原理
时间局部性:在一段时间内,访问了这段程序,那么未来也很有可能访问这段程序
空间局部性:近期访问了这段空间,那么未来也很有可能访问这段空间。
书中定义
:
① 时间局部性:如果程序中的某条指令开始执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后,该数据可能再次被访问。
②空间局部性:指一旦程序访问了某个存储单元,则不久之后,某个附近的存储单元也将被访问。
可以看出,书读完了,我视乎没理解透,只是理解了个大概的。
页框
程序如果都同时加载进入内存,明显是种资源的浪费,拿java
类加载举例,都是按需加载的。
所以操作系统加载程序时,是把程序分为一小块一小块来加载的。
我们把这一个个小块叫做页框
,每个是4KB
大小。
也可以理解成,其把物理空间,分成了一个个小块,每块是
4KB
大小。
虚拟空间 和 虚拟地址
因为局部性原理的存在,程序没必要全部都加载进入内存,所以我们可以假装给每个程序都分配了4G
的内存。(假设电脑内存就为4G
,虚拟机的话,这个值一般可以设置。)
我们把这种假装给的内存叫做 虚拟内存
。程序在这个空间中使用的地址,就叫做虚拟地址
。
页
因为程序时分块加载进来的,所以虚拟空间也应该是分块来使用的。
我们把虚拟空间的分块叫做页
。
页表
虚拟空间终究是虚拟的,需要和物理空间映射才能使用。
我们把这个映射关系称之为页表
。
上图中,
① 页号:记录的是虚拟页面地址;
② 页框号:记录的是物理页面地址;
段
分段 是对程序的特性提出的概念;
一个程序通常会有:
① 代码段
② 数据段
③ 堆栈段
④ 共享段
等等 …
每个段的内部,依然是按照分页来处理的。
翻译地址的过程也变复杂了:
首先 程序知道逻辑地址:段号
和偏移量
① 通过段号找到基址
,然后和偏移量相加得到一个线性地址;
② 再将这个线性地址通过分页系统转换,得到物理地址;
具体如下图:(来自书中
)
偏移量 个人理解就是 基址寄存器里面的值。
内存满了怎么办?
如果内存满了,操作系统就要判断,把内存已有的数据,根据算法规则来置换到硬盘中
程序访问了没有被装载的页?
如果程序访问了没有被装载的页,会产生缺页的中断,由操作系统去硬盘中调取。
总结
用自己的话来写一遍,更深刻了些。