Linux 下的 tempfs 与 /dev/shm

tmpfs 是 Linux/Unix 系统上的一种基于内存的文件系统,即 tmpfs 使用内存或 swap 分区来存储文件。html

Linux 内核中的 VM 子系统负责在后台管理虚拟内存资源 Virtual Memory,即 RAM 和 swap 资源,透明地将 RAM 页移动到交换分区或从交换分区到 RAM 页,tmpfs 文件系统须要 VM 子系统的页面来存储文件。tmpfs 本身并不知道这些页面是在交换分区仍是在 RAM 中;作这种决定是 VM 子系统的工做。tmpfs 文件系统所知道的就是它正在使用某种形式的虚拟内存。node

因为 tmpfs 是基于内存的,所以速度是至关快的。另外 tmpfs 使用的 VM 资源是动态的,当删除 tmpfs 中文件,tmpfs 文件系统驱动程序会动态地减少文件系统并释放 VM 资源,固然在其中建立文件时也会动态的分配VM资源。另外,tmpfs 不具有持久性,重启后数据不保留。python

/dev/shm 就是一个基于 tmpfs 的设备,在有些 Linux 发行版中 /dev/shm/run/shm/ 目录的一个软连接。实际上在不少系统上的 /run 是被挂载为 tmpsf 的。用 df -T 能够查看系统中的磁盘挂载状况:linux

文件系统          1K-块     已用     可用 已用% 挂载点
udev            1859684        4  1859680    1% /dev
tmpfs            374096     1524   372572    1% /run
/dev/sda8      76561456 36029540 36619724   50% /
none                  4        0        4    0% /sys/fs/cgroup
none               5120        0     5120    0% /run/lock
none            1870460    27688  1842772    2% /run/shm
none             102400       56   102344    1% /run/user

那么,咱们就先来讲说 /run 目录。如今咱们知道,该目录是基于内存的,实际上它的前身是 /var/run 目录,后来被 /run 替换。这是由于 /var/run 文件系统并非在系统一启动就是就绪的,而在此以前已经启动的进程就先将本身的运行信息存放在 /dev 中,/dev 一样是一种 tmpfs,并且是在系统一启动就可用的。可是 /dev 设计的本意是为了存放设备文件的,而不是为了保存进程运行时信息的,因此为了避免引发混淆,/dev 中存放进程信息的文件都以 "." 开始命名,也就是都是隐藏文件夹。可是即使是这样,随着文件夹的数量愈来愈多,/dev 里面也就愈来愈混乱,因而就引入了替代方案,也就是 /run。实际上在不少系统上 /var/run 目录仍然存在,但其是 /run 目录的一个软连接。数组

/var/run 目录中主要存放的是自系统启动以来描述系统信息的文件。比较常见的用途是 daemon 进程将本身的 pid 保存到这个目录。app

/dev/shm/ 是 Linux 下一个很是有用的目录,它的意思是 Shared memory,也就是共享内存。因为它在内存上,因此全部系统进程都能共享该目录。默认状况下它的大小是内存的一半。若是但愿改变它的大小,能够用 mount 来管理:ui

mount -o size=4000M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm.net

若是但愿永久生效,能够修改 /etc/fstab 文件:设计

tmpfs /dev/shm tmpfs defaults,size=4G 0 0

利用 /dev/shm 能够作不少事情,这里说一个 Python 的应用。用 Python 作数据处理时,可能会用到 numpy,一般作数据处理时的数据量都是很大的,若是有多个进程都须要用到一样的数据,那么 /dev/shm 就派上了用场,也就是用共享内存技术。Python 有一个第三方库能够用来在多个进程间共享 numpy 数组,即 SharedArray。SharedArray 即是基于 /dev/shm 的,而且采用 POSIX 标准,可以兼容多个平台。code

参考资料

相关文章
相关标签/搜索