详解Linux系统中的tempfs与/dev/shm
tmpfs是Linux/Unix系统上的一种基于内存的文件系统,即tmpfs使用内存或swap分区来存储文件。
Linux内核中的VM子系统负责在后台管理虚拟内存资源VirtualMemory,即RAM和swap资源,透明地将RAM页移动到交换分区或从交换分区到RAM页,tmpfs文件系统需要VM子系统的页面来存储文件。tmpfs自己并不知道这些页面是在交换分区还是在RAM中;做这种决定是VM子系统的工作。tmpfs文件系统所知道的就是它正在使用某种形式的虚拟内存。
由于tmpfs是基于内存的,因此速度是相当快的。另外tmpfs使用的VM资源是动态的,当删除tmpfs中文件,tmpfs文件系统驱动程序会动态地减小文件系统并释放VM资源,当然在其中创建文件时也会动态的分配VM资源。另外,tmpfs不具备持久性,重启后数据不保留。
/dev/shm就是一个基于tmpfs的设备,在有些Linux发行版中/dev/shm是/run/shm/目录的一个软链接。实际上在很多系统上的/run是被挂载为tmpsf的。用df-T可以查看系统中的磁盘挂载情况:
文件系统1K-块已用可用已用%挂载点 udev1859684418596801%/dev tmpfs37409615243725721%/run /dev/sda876561456360295403661972450%/ none4040%/sys/fs/cgroup none5120051200%/run/lock none18704602768818427722%/run/shm none102400561023441%/run/user
那么,我们就先来说说/run目录。现在我们知道,该目录是基于内存的,实际上它的前身是/var/run目录,后来被/run替换。这是因为/var/run文件系统并不是在系统一启动就是就绪的,而在此之前已经启动的进程就先将自己的运行信息存放在/dev中,/dev同样是一种tmpfs,而且是在系统一启动就可用的。但是/dev设计的本意是为了存放设备文件的,而不是为了保存进程运行时信息的,所以为了不引起混淆,/dev中存放进程信息的文件都以"."开始命名,也就是都是隐藏文件夹。但是即便是这样,随着文件夹的数量越来越多,/dev里面也就越来越混乱,于是就引入了替代方案,也就是/run。实际上在很多系统上/var/run目录仍然存在,但其是/run目录的一个软链接。
/var/run目录中主要存放的是自系统启动以来描述系统信息的文件。比较常见的用途是daemon进程将自己的pid保存到这个目录。
/dev/shm/是Linux下一个非常有用的目录,它的意思是Sharedmemory,也就是共享内存。由于它在内存上,所以所有系统进程都能共享该目录。默认情况下它的大小是内存的一半。如果希望改变它的大小,可以用mount来管理:
mount-osize=4000M-onr_inodes=1000000-onoatime,nodiratime-oremount/dev/shm
如果希望永久生效,可以修改/etc/fstab文件:
tmpfs/dev/shmtmpfsdefaults,size=4G00
利用/dev/shm可以做很多事情,这里说一个Python的应用。用Python做数据处理时,可能会用到numpy,通常做数据处理时的数据量都是很大的,如果有多个进程都需要用到同样的数据,那么/dev/shm就派上了用场,也就是用共享内存技术。Python有一个第三方库可以用来在多个进程间共享numpy数组,即SharedArray。SharedArray便是基于/dev/shm的,并且采用POSIX标准,能够兼容多个平台。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。