内存分页
分段的好处是能产生连续的内存空间,但是会出现大量内存碎片与内存交换效率低的问题
先思考一下怎么解决这两个问题,内存碎片是由多个不连续的小物理内存空间造成,如果把这些不连续的小物理内存空间组合起来,是不是解决了这个问题?同样的,内存交换的时候我们保证交换的数据小,是不是能提高内存交换的效率?
这个办法就是内存分页,分页是把整个虚拟与物理空间切成一段段固定尺寸的大小,这样一个连续并且尺寸固定的空间,我们叫页,在 Linux 下,每一页的大小为4KB。(虚拟空间是指存储一套虚拟地址的空间)
虚拟地址与物理地址是通过页表来映射,虚拟空间内的虚拟地址一定是连续的,物理地址不一定,但可以通过连续的虚拟地址把多个不连续的物理内存组合使用。
而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
分页方式是如何解决内存碎片与内存交换效率慢的问题呢?内存碎片的解决:
因为使用内存的单位变成固定大小的页,所以每个程序的虚拟空间维护的也是连续的页(虚拟地址),通过页表再映射到物理内存页,虽然映射的物理内存页不连续,但是虚拟空间是连续的,可以让它们组合起来使用,但这也只能解决外部内存碎片问题,没有解决内部内碎片问题,因为每页都有固定大小,可能某一页只使用了部分,依然会造成一些浪费。
内存交换效率慢的解决:
之前说过,减少交换数据的大小,可以提高内存交换效率,分页方式是这样解决的,如果内存空间不够时,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页释放掉,也就是加载到硬盘,称为换出,一旦需要的时候再加载进来,称为换入。所以一次性写入硬盘的也只有一个页或几个页,内存的交换效率自然就提升了。
分页方式使加载程序的时候,不再需要一次性都把程序加载到物理内存中。完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去(用大白话说,当你需要用到的时候才会去使用对应的物理内存)。
在内存分页方式下,虚拟地址和物理地址是如何映射的?
在分页机制下,每个进程都会分配一个页表,虚拟地址会分为两部分,页号和页内偏移量,页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,页内偏移量+物理内存基地址就组成了物理内存地址,如下图所示
就是下面这几步
页号找到页表中的页项
获取页项的物理页号基地址
偏移量+物理页号基地址计算出物理内存地址
全部0条评论
快来发表一下你的评论吧 !