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

參考資料

相關文章
相關標籤/搜索