操作系统——内存管理之内存分配(分页,分段,段页)
多级页表与快表
共享内存可以用虚拟内存来实现。
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信。因为是通过内存操作实现通信,因此是一种最高效的数据交换方法。
虚拟内存是一种技术,它的作用就是让上层程序看起来是内存是分段的,但是实际上是分页的
目前程序越来越大,越来越多,内存不可能用把所有程序段都加到内存中,用到了虚拟内存。
他可以保证在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。用到了局部性原理
先把程序分段,比如分成 main函数、子函数、全局变量,然后把这些放在不连续的内存块中,再把这个内存块分页存储
基本思想:用户程序使用了一段内存,那么首先会在虚拟内存上面找到一段空的内存,然后将用户程序使用的内存映射到这段内存上,然后虚拟内存再将这段内存映射到物理内存上。
第一次映射:需要段表
第二次映射:需要页表
出现的问题:页表越来越大,内存浪费。
解决方案:多级页表
建立一个页表索引,页表索引肯定在内存中,再根据页表索引加载需要的页表到内存中,不要的可以先放在硬盘里
出现问题:级数过多,造成访问次数增加,(cpu执行速度很快,执行指令的时间与访问内存的时间相比不足一谈)
解决方案:在cpu和内存中再加一个寄存器,用来放最近访问过的页码(又是局部性定理)
分页仅仅是由于系统管理的需要而不是用户的需要。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;
而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
网友评论