Linux 内存管理学习

(0 comments)

80386 CPU 保护模式下,每个地址段最大可达到4GB内存空间。用户进程可以访问4GB的线性虚拟内存空间,其中从0到3GB的虚拟地址是用户空间,用户进程可以直接对其进行访问。从3GB到4GB的虚拟地址为内核态空间,存放内核态访问的代码和数据,用户态进程不可访问。当用户进程通过中断或系统调用访问内核态空间时,就会触发处理器的特权级转换,即从操作系统的用户态切换到内核态。

上述两种空间对用户进程来说都是透明的,用户进程所访问的内存地址都是连续的4GB线性虚拟地址。用户进程创建时,已由系统调用fork()的执行函数do_fork()将内核的代码段和数据段映射到3GB以后的虚拟空间,供内核态进程访问。用户进程实际可申请的虚拟空间为0到3GB。

交换空间

当物理页面不够时,Linux存储管理系统必须释放部分物理页面,写入交换空间。实现此项功能的是内核态交换进程 kswapd。

kswapd 属于一种特殊的进程,称内核态线程(kernel thread)。Kernel thread 完全不同于通常意义上的线程,内核态线程是没有虚拟存储空间的进程,它们运行在内核态中,直接使用物理地址空间。同类型的进程还有 bdflush 和 init。

kswapd 不仅能将页面换出到交换空间,它也保证系统有足够的空闲页面以保持存储系统高效的运行。当系统中空闲页面太少时,kswapd 马上被唤醒,进行页面换出操作。

内核交换程序使用两个变量 free_pages_high和free_pages_low作为评判标准。free_pages_high和free_pages_low在系统初启时设置的,和系统中的物理页数相关。检测页面时,kswapd使用nr_free_pages记录空闲页面数,同时使用nr_async_pages记录当前正在被换出到交换空间的页数。

如果nr_free_pages与nr_async_pages之和小于free_page_low,

如果nr_free_pages与nr_async_pages之和大于free_page_low,但小于free_page_high,

如果nr_free_pages与nr_async_pages之和大于free_page_high,说明空闲页面足够,kswapd继续睡眠。

内核交换进程将依次从三条途径缩减系统使用的物理页面: - 缩减 Page Cache 和 Buffer Cache。 - 换出 SYSTEM V 共享内存占用的页面。 - 换出或丢弃进程占用的页面。

存储管理系统的缓冲机制

存储管理系统的缓冲机制主要包括:kmalloc cache, swap cache和page cache。

  • Swap Cache

如果以前被调出到交换空间的页面由于进程再次访问而调入物理内存,只要该页调入后没有修改过,那么它的内容与交换空间中的内容是一样的。在这种情况下,交换空间中的备份还是有效的。因此在该页再度换出时,就没有必要再执行写操作。

Linux 采用Swap Cache来实现这种思想。每一个物理页面都在Swap Cache中占有一表项,Swap Cache表项的总数就是物理页面文件总数。

当 Linux 将物理页面换出到交换空间时,它先查询Swap Cache,如果其中有与该页面对应的有效页表项,那就不需要将该页写入,因为交换空间中的原有的内容与待换出的页面内容是一致的。

  • Page Cache

Linux系统中Page Cache的作用是加快对磁盘文件的访问速度。文件被映射到内存中,每次读取一页,这些页就保存在Page Cache中。

分析文件系统可知,每一个Linux的文件都通过虚拟文件系统VFS的inode来描述,并且每一个inode结构都是唯一而且完整地描述一个文件。因此,通过文件的inode及文件中的偏移量就可以计算出任一文件内容在页表中的索引。

每当需要读取文件的一页时,总是首先通过Page Cache读取。如果所需页面在Page Cache中,就返回指向表示该页面的mem_map_t的指针。否则必须从文件系统中调入。接着 Linux 申请一物理页,将该页从磁盘文件中调入内存。

如果有可能的话,Linux 还发出读取当前页面的下一页的读操作请求。这种预读一页的思想来自局部性原理,即在进程读当前页时,它的下一页也很有可能被进程用到。

随着越来越多的文件页面被读取、执行,Page Cache将会变得越来越大。进程不再需要的页面应从Page Cache中删除。当Linux在使用内存过程中发现物理页面渐变稀少时,它将缩减Page Cache 。

Buffer Cache

包含了被块设备驱动使用的数据缓冲。

Currently unrated

Comments

There are currently no comments

New Comment

required

required (not published)

optional

required