如果一个进程通过套接字将数据发送到同一台机器上的另一个进程,那么在传输过程中磁盘读/写的可能性有多大?似乎有一个套接字文件类型,如果有空闲内存,这些是否保证在内存中?
答案 0 :(得分:10)
不直接。 TCP / UDP网络套接字,localhost或UNIX域套接字将在内存中运行。 UNIX域套接字通常是使用模块进入内核空间之外的最快选择。
localhost管道上的套接字几乎就像用户空间和内核空间之间的几个memcpy一样简单。在TCP情况下,您有堆栈开销。
文件和套接字共享描述符表的内核抽象,但这并不意味着实际文件。
当然,由于您的交易,数据库可能会触发对日志的一些写入。
答案 1 :(得分:7)
在POSIX模型中,以及许多其他内核中,文件不仅存在于磁盘中。相反,每个设备都由一个"特殊文件"表示。它们存在于目录或某种命名空间中,但访问它们不是磁盘访问,即使它们被放置在磁盘上的目录中。
如果您有内存压力,那么您的某些数据缓冲区可能会被换出。但这与"文件"无关。设备的本质。它只是将磁盘用作额外的RAM。
所以"是的,套接字I / O是文件I / O,但不是磁盘读/写。"
答案 2 :(得分:3)
抓住“4.4BSD操作系统的设计”,其中描述了可以被视为参考实现的内容,第11.2节“实现结构”和11.3“内存管理”,并且在极端内存压力的情况下,它似乎保证传输中不会涉及磁盘I / O.
传输的数据存储在特殊结构,mbuf和mbuf集群中,直接在每个缓冲区的任一端添加或删除数据。可能会反复使用相同的缓冲区,释放到特定池,然后从那里重新分配。从内核malloc池分配新缓冲区,该池不可交换。缓冲区数量的增长显然只会在消费者缓慢且达到极限时发生。
简单地说,就数据而言,在参考实现中,这些缓冲区不是由文件支持的,更不用说文件系统中放置inode的文件,最好它们将由交换空间支持,即使极不可能被分页。
这只会遗漏可能在inode上的元数据和状态信息。当然,inode创建和查找将导致磁盘访问。至于地位,我能想到的只是时间。
我无法在UNIX域套接字上找到有关atime的权威信息。但我尝试使用FreeBSD和Linux,并且所有四个文件时间始终保留为inode创建时间。即使建立到UNIX域套接字的第二个连接似乎也不会更新atime。