我知道“一切都是文件”并不完全正确,但据我所知,每个进程都会获得一个/proc
包含大量文件的目录。读/写操作通常是速度的巨大瓶颈,并且必须一直从文件读/写到文件会显着减慢处理速度。
必须保存一堆文件会/proc
减慢速度吗?如果不是,那么不必进行大量 IO 操作岂不是 Linux 中的一个巨大的设计缺陷?
答案1
文件纯粹动态地存在/proc
和/sys
存在,即当没有任何东西读取它们时,它们根本不存在并且内核不花时间生成它们。
您可以将/proc
和/sys
文件视为 API 调用。如果不执行它们,内核不会运行任何代码
答案2
我认为你对“一切都是文件”的理解有点太字面意思了。这真正的意思是“一切都可以访问好像这是一个文件”。
尽管其他一些答案可能会说,事实上,没有什么实际上/proc
作为磁盘上的文件存在。/proc
文件系统根本不占用任何磁盘空间,因此无需花费 I/O 来维护它。可以通过卸载/proc
文件系统并查看磁盘使用情况数字来确认这一点。*
相反,当程序尝试访问它时,它的内容是动态生成的。例如,当您键入 时ls /proc
,实际发生的是内核从进程表中获取当前的进程 ID 列表,并将它们发送到程序,ls
就像它们是常规目录名称一样。每个“目录”的内容以及/proc
.
*在正常系统上,/proc
文件系统可能正在使用中,这将阻止您卸载它。因此,如果您确实想要执行此测试,您可能需要启动到单用户模式,即使这样也不能保证成功。
答案3
考虑/proc
文件的另一种方式是,虽然“一切都是文件”,但并非每个文件都是存储在磁盘上的字节。
对于/proc
文件,读取是通过内核根据运行进程的状态动态生成必要的字节来满足的,而不是通过从磁盘存储中检索字节来满足。
同样,文件写入/proc
(如果允许)是与内核交互,而不是与磁盘上的字节交互。
答案4
“文件”一词在这里用得太多了。它可能意味着存储在实际磁盘上的文件,但在这种情况下,它意味着使用文件 API 访问的任何内容:打开、读取、写入和关闭。
这四个函数是一个非常通用的 API,Unix 总是将各种其他东西硬塞到这个 API 中。字符设备、块设备和命名管道都是通过相同的四个基本函数来访问的,但读取和写入的不是磁盘上的文件。
传统上,设备文件确实在磁盘上有条目以保持路径查找简单,但这对于文件系统proc
来说效率很低sys
,因此它们也有自定义查找,并且根本不向磁盘写入任何内容。就此而言,tmp
文件系统也不会,它只是将数据保留在缓存中(并可能将它们交换到通用交换中)。
因此,当您不访问它们时,根本没有任何开销。当您这样做时,所需要做的就是在内核中分配 dentry、inode 和文件结构(将文件描述符绑定到)并格式化内部内核结构中的信息。它比专用 API 慢一点,但它避免了向内核添加更多入口点,并允许利用现有实用程序来处理信息。