主旨

虚拟内存将各个进程的地址空间隔离开,从而使得程序员可以安全而高效地使用物理内存。除此之外,虚拟内存还实现了进程间内存共享、写时拷贝、内存去重等功能。

共享内存

将不同进程的不同虚拟页映射到同一个物理页上,这样不同进程就可以访问同一段内存空间。

共享内存可以用于进程间通信。

写时拷贝

当一个进程复制另一个进程的内存(如创建子进程)时,并不需要全部复制数据。

只需要以只读方式复制另一个进程的页表项,即映射到另一个进程的物理页面。

当需要修改页面时再真正拷贝到自己的物理页上,并将页表项指向自己的物理页。

内存去重

OS定期扫描内存中内容相同的物理页,只保留一份,并将使用这个页的不同进程的页表项都映射到这一个物理页上。

不过如果要写这个页面又要重新拷贝,造成开销。因此最好是对只读或读多写少的数据这样做。

内存压缩

Linux支持zswap机制。

在内存中划分一块zswap区域,将准备换出的页面压缩后写到zswap区域。

可以延迟落盘,从而实现高效的批量换出,甚至可能避免磁盘IO。

大页

TLB缓存表项很有限。页越大,越节省TLB缓存表项。

Linux中支持2MB甚至1GB的页面大小。

但是页大了写不完容易造成浪费,即内碎片。另一方面造成内存管理复杂,linux有大页相关的漏洞。