虚拟内存技术与 swap 分区

Swap 分区在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到 Swap 分区中,等到那些程序要运行时,再从 Swap 分区中恢复保存的数据到内存中。

从效果上看,像是突破了物理内存的限制一样。

本质上是使用的存储区,但从系统角度看,swap 就像额外的内存一样,当然速度比正常内存也慢了不少。

物理内存和 swap 分区都是 kernel 中的虚拟内存子(VM)系统来管理。

tmpfs 文件系统

百度百科解释的不错

临时文件系统,是一种基于内存的 fs,不像普通的 fs 建立在块设备上,而是直接向 VM 申请分配,既可以使用物理内存,也可以使用上面提到的 SWAP。随着操作的文件增多,会动态增加文件系统的空间。

下面的命令就可以直接挂载一个 tmpfs 到/mnt/tmpfs:

mount tmpfs /mnt/tmpfs -t tmpfs

tmpfs 常驻内存,访问速度闪电,但是生命周期随内存,掉电即没。

默认情况,tmpfs 会挂载在/dev/shm中。

为防止 tmpfs 使用了全部 VM,有时候要限制其大小。在etc/fstab中:

tmpfs /dev/shm tmpfs size=32m 0 0

区分系统调用mmap, Posix shm_open 及 SysV shmget

mmap并不是为了用于共享内存而设计。它提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作,减少 copy,提高效率。但是 mmap 系统调用使得进程间可通过映射同一个普通文件,实现共享内存的目的。

关于 SysV ipc:

about UNIX System V IPC

他们的区别:

Shared memory on Linux

Linux 初始 RAM 磁盘(initrd)概述

initrd 的制作和解压

initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux 内核启动前,boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的”init or linuxrc”,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init。

ramdisk

ramdisk 是一种 ram 虚拟化 disk 的技术,相当于用 disk drive 去访问 memory,有点像虚拟内存的反转版本,比一般的 disk 访问肯定快的多。

ramdisk 仅仅是块设备,还需要用mkfs来格式化后才能真正使用它。而tmpfs是文件系统,而且不依赖块设备,上面已经提到。

在系统启动阶段,和内核类似,bootloader 将 kernel image 搬到内存中时,也可以通过 nand read(而不用通过 fs 层提供的高级读写接口) 将initrd加载进内存,并挂载为临时的rootfs,这就是用的 ramdisk 技术。

ramdisk 与 initrd、initramfs 的关系

启动阶段为何这么做?首先 rootfs 可存储在不同的存储设备上,依赖形形色色的驱动,不可能在 rootfs 放入这么多驱动。因此在正式的 rootfs 之前,将对应的驱动放在 ramdisk 上,再利用其安装真正的 rootfs。

initrd 还可以加点 image,framebuffer 驱动,做点开机动效什么的。

在嵌入式领域,initrd 可挂载为真正的 rootfs。

free -m 的解释

              total        used        free      shared  buff/cache   available
Mem:           7866        5222         494         810        2149        1446
Swap:          7812        4338        34

total:物理内存 free: 可用的 shared: 进程间的共享内存 buff/cache: 磁盘缓存

对于应用程序来说,buffers/cached 是等于可用的,因为 buffer/cached 是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached 会很快地被回收。

因此应用程序的可用内存= buffers/cached + free