通过Linux理解操作系统(五):内存管理(中)

通过Linux理解操作系统(五):内存管理(中)

  前文主要讲了我们的程序是通过虚拟地址进行内存访问的,那么操作系统是如何实现了虚拟地址到实际物理地址的转换,又是如何对有限的物理内存进行管理,才能让多个进程共同在有限的内存里跑起来的呢?总的来说,系统要做的工作包括:监控物理内存的使用情况、在程序需要更多内存时进行内存分配、把不同进程的地址空间映射到物理内存的不同区域、动态地把程序运行需要的资源移进内存或把暂时不需要的资源移出内存以腾出空间,接下来将对Linux是通过怎样的机制完成这些工作做一个简要的介绍。

1、分页和页表

首先,分页的概念相信很多人都不陌生,我这里想说的是“分”的思想,学习计算机两年多,我最大的感受是计算机就是在利用有限的资源干无限的事,而这很多时候都是基于“分而治之”的思想实现的。问题规模太大,太复杂怎么办?就是要分解,分就意味着更简单,更灵活,更容易处理,我这里并不只是指算法设计,而是指解决很多实际的复杂问题,就像现在很火的大数据处理,一台机器根本无法完成这么大量的存储和计算工作,就是需要通过“分”,把数据分到多台机器上存,把计算任务也分到多台机器上完成,才有了问题解决的可能。好吧,扯远了~其实我只是想说作为程序员一定要理解分治的思想。回到正题,我们已经知道每个进程都有4G的地址空间,但是程序在运行的时候并不需要程序中所有的内容,需要的只是当前正在执行的一部分和相关的数据就可以,因此可以将整个地址空间分成一个个连续的大小固定的块(比如4KB),只要那些需要的块在内存中即可,这一个个的块就是页(page),好处就是当程序运行或者停止时,系统不用把整个进程的内容移进移出,而只要移动一个个页就可以,这样既提高了效率又节省了空间,才使得多个进程能够同时存在于内存中。注意,这里的页是指虚拟地址空间里连续的一段,而物理内存中这样连续的段则称为page frame,它们的大小相同,进程的页放进内存中时就放到一个个的page frame中。

有了page的概念后,我们再来看系统是如何实现逻辑地址到物理地址的转换的。Linux为每个进程维护了一个page table,这个表里的每一条记录表示一个page,保存了以下信息:

每条记录中通过一些位标识了这个页是否存在于实际内存中,允许什么方式的访问,是否被修改过,是否正在被使用,是否进行缓存等信息,其中最重要的就是page frame number,系统就是由此得到的该页在实际内存中的位置。在32位的机器上,一个逻辑地址有32位,它可以分成两部分,一部分用于表示页号,用于在page table中查找该page的记录,从而得到page frame number,也就是这个page在物理内存的起始位置,还有一部分是页内偏移量,这两者相加就得到了我们实际要访问的物理地址。通过这种方式系统可以实现逻辑地址到物理地址的转换,但是又带来一个问题,由于在程序运行期间需要对page table进行查找,也就是说page table也要存在于内存中,假设一个页有4KB,对于32位的机器,page table中刚好有2^20(1M)条的记录,似乎还可以接受,但是对于64位的机器,则需要2^52条记录,如果光是存个page table就用掉这么多内存,那程序也不用跑了,为了解决这个问题,Linux使用了多级索引技术:

Linux不是直接把整个page table放到内存中,而是根据页的大小将整个page table 又分成一个个小的page table,然后通过索引的方式来进行访问。具体方式如上图,虚拟地址被分成了5个部分,global|upper|middle directory, page和offset,首先根据global directory在global目录里进行查找,global目录里每一条记录保存了一个指向下一级目录的指针,在取得一个指针后,根据这个指针定位到一个下一级的upper目录,然后根据upper directory 又可以在upper目录里得到一个指针来得到一个middle目录,而middle目录里得到的指针才是指向真正的page table,此时再根据page域取得一条page table中的记录。那为什么这样能省内存?假设一个page目录里有n条记录,那么根据gloabl目录可以索引到n个upper目录,香港虚拟主机,而每个upper目录又可以索引到n个middle目录,以此类推,原来一个大的page table分成了n^3个小的page table,通过三级目录一级级往下索引就可以得到我们最终需要的那个page table,而需要放进内存的就只有在查找过程中需要的三个目录和最终的1个page table即可,虚拟主机,这样当然就省了很多内存咯。

2、页的回收

好好扮演自己的角色,做自己该做的事

通过Linux理解操作系统(五):内存管理(中)

相关文章:

你感兴趣的文章:

标签云: