Linux 内存相关
虚拟内存技术与 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:
他们的区别:
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