总的来说虚拟内存两方面1、内存的管理 2、内存的保护
几个概念
1.物理地址-通俗的将可以理解成一个连续的字节大小的数组(每个字节有个唯一的地址)
2.虚拟内存-存放在磁盘上的一个连续的字节大小的数组(每个字节有个唯一的地址)
几个概念
1、虚拟内存和物理内存会按照一定的规则互相转换。
2、虚拟内存和物理内存都会被分页也就是固定大小的单元。
3、虚拟内存和物理内存是映射的,也就是物理内存是虚拟内存的缓存。
4、磁盘和内存之间传送页面称为交换或者页面调度
虚拟内存寻址?
CPU寻址通过地址翻译单元MMU(地址翻译)到内存去里面根据页表里面的映射翻译成物理地址,如果物理地址不存在就是缺页,如果缺页就会执行一次磁盘内容映射到物理内存的操作(触发缺页异常处理程序,内核调用程序首先去去内存单元根据LRU(最近最少被使用)算法找到一个最少被使用的物理页面作为牺牲页面,如果此页面被修改了需要把他复制到磁盘空间,然后内核从磁盘把刚刚要寻址对应的虚拟内存的磁盘内容复制到牺牲页面的物理地址,更新页表条目里面的映射地址,处理完成,异常处理程序,返回触发异常的指令处去重新执行刚刚的指令,重新执行物理寻址,获取内存内容,不会再次缺页了)
这里面为何不把磁盘内容提前换入内存里面利用的思想是,页面的交换是利用策略按需要页面调度(现代操作系统都是这样)
缺页之后要进行数据从磁盘到内存的复制(耗时是读取内存的100000倍)那为何还要这样做呢?
我们都知道计算机系统里面有个局部性的概念也就是我们操作的大部分的数据都具有局部性,可能缺页不是很多一般,但是如果我们利用的虚拟内存超出了页面集合的大小程序就会出现一种状态叫做抖动(也就是页面的换入换出)程序变慢了
方便内存管理:操作系统为每个进程提供了独立的页表,也就是每个进程有自己独立的地址空间,进程可以有相同的地址空间,但是会被映射到不同的内存空间,也可映射到相同的内存空间(内存映射),连续的虚拟内存但是物理内存可能是不连续的就算malloc也可能分配的物理内存是不练的页面。
方便内存保护:用户应用进程对于只读 的数据、或者内核的数据代码不应该可以访问,这种都可以通过页表来添加添加额外的许可位这样就可以保护物理内存里面的数据代码层面的东西。
什么事内存映射?
linux系统把虚拟内存与磁盘的对象关联初始化虚拟内存区域的过程称为内存映射。
如果进程A的虚拟内存映射到文件a,然后进程B的虚拟内存映射到文件a这个文件a就是进程A和B的共享对象