【问题标题】:Does Socket IO involve Disk IO?Socket IO 是否涉及磁盘 IO?
【发布时间】:2014-12-21 12:14:34
【问题描述】:

如果一个进程通过套接字将数据发送到同一台机器上的另一个进程,那么在传输过程中发生磁盘读/写的可能性有多大?似乎有一个套接字文件类型,如果有空闲内存,这些文件是否保证在内存中?

【问题讨论】:

  • 您能详细说明您的设计和要求吗?
  • 没有真正的具体设计。我正在尝试衡量像 pico 这样的平面文件 cms 与使用 redis 这样的全内存数据库的类似简单文件的性能。我记得几年前在一篇关于 winsock 的 MSDN 文章中读到它使用文件来实现 posix。至少那是我记得的,我有一个模糊的概念,也许磁盘写入可能发生在某些系统上。因为如果在 IPC 期间发生阻塞磁盘写入,那么就速度而言,任何数据库的游戏都结束了,即使整个事情都在内存中。
  • @Kaan 我建议您找到您的来源并再次阅读。你的记忆力似乎让你失望了。
  • 我认为这个问题很值得回答,可惜人们没有看到这个。也许答案取决于操作系统。显然,在 Win32 中作为文件实现并不意味着它们是磁盘支持的文件。显然,没有人期望套接字 I/O 涉及磁盘 I/O。但也许 POSIX 规范有影响,也许有保证......现在已经很晚了,我在一个显然只有套接字的地方看到磁盘活动,我不知道我是否应该抓住巴赫的书或“4.4BSD OS 的设计”或 POSIX 规范......一个好的答案应该有书籍参考。

标签: linux file sockets io


【解决方案1】:

抓住“4.4BSD操作系统的设计”,它描述了什么可以被认为是参考实现,第11.2节“实现结构”和第11.3节“内存管理”,在没有极端内存压力的情况下,它似乎保证传输过程中不涉及磁盘 I/O。

传输的数据存储在特殊结构、mbuf 和 mbuf 集群中,数据在每个缓冲区的任一端直接添加或删除。可能会反复使用相同的缓冲区,将其释放到特定的池中,然后从那里重新分配。新缓冲区是从内核 malloc 池中分配的,不可交换。缓冲区数量的增长显然只会在消费者速度较慢且达到限制时才会发生。

简单地说,关于数据,在参考实现中,这些缓冲区不是由文件支持的,更不用说由放置 inode 的文件系统中的文件支持了,充其量它们将由交换空间支持,即使极不可能被调出。

这只会忽略可能在 inode 上的元数据和状态信息。自然,inode 创建和查找会导致磁盘访问。至于地位,我能想到的只有一个时间。

我在 UNIX 域套接字上找不到有关 atime 的权威信息。但是我在 FreeBSD 和 Linux 上进行了尝试,所有四个文件时间始终保留为 inode 创建时间。即使建立到 UNIX 域套接字的第二个连接似乎也不会及时更新。

【讨论】:

    【解决方案2】:

    在 POSIX 模型以及许多其他内核中,文件不仅在磁盘中。相反,每个设备都由一个“特殊文件”表示。它们存在于目录或某种命名空间中,但访问它们不是磁盘访问,即使它们被放置在磁盘上的目录中。

    如果您有内存压力,那么您的一些数据缓冲区可能会被换出。但这与设备的“文件”性质无关。它只是将磁盘用作额外的 RAM。

    所以“是的,套接字 I/O 是文件 I/O,但不是磁盘读/写。”

    【讨论】:

      【解决方案3】:

      不直接。 TCP / UDP 网络套接字,通过 localhost 或 UNIX 域套接字将在内存中运行。 UNIX 域套接字通常是使用模块进入内核空间之外最快的选择。

      localhost 管道上的套接字几乎与用户空间和内核空间之间的几个 memcpy 一样简单。在 TCP 情况下,您有堆栈开销。

      文件和套接字共享描述符表的内核抽象,但这并不意味着一个实际的文件。

      当然,由于您的事务,数据库可能会触发一些写入日志的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 2016-12-20
        • 1970-01-01
        相关资源
        最近更新 更多