Включает ли Socket IO Disk IO?

Если один процесс отправляет данные через сокет другому процессу на той же машине, насколько вероятно, что чтение/запись диска произойдет во время передачи? Кажется, что есть тип файла сокета, гарантированно ли они в памяти, если есть свободная память?

Ответ 1

Не напрямую. Сетевые сокеты TCP/UDP, локальный хост или UNIX Socket Socket будут работать в памяти. UNIX-доменные сокеты, как правило, являются самым быстрым вариантом за пределами выхода в пространство ядра с помощью модуля.

сокеты по локальным хостам почти такие же простые, как пара memcpy между пользовательским пространством и пространством ядра и обратно. В случае TCP у вас есть служебные данные стека.

Оба файла и сокеты совместно используют абстракцию ядра таблицы дескрипторов, но это не означает фактический файл.

Конечно, база данных может инициировать некоторую запись в журнал в результате транзакции.

Ответ 2

В модели POSIX, а также во многих других ядрах файлы не только на дисках. Вместо этого каждое устройство представлено "специальным файлом". Они живут в каталогах или в каком-то пространстве имен, но доступ к ним не является доступом к диску, даже если они помещены в каталог на диске.

Если у вас есть давление в памяти, тогда некоторые из ваших буферов данных могут быть заменены. Но это не имеет никакого отношения к "файловому" характеру устройств. Он просто использует диск в качестве дополнительной ОЗУ.

Итак, "Да, сокет ввода-вывода - это ввод-вывод файлов, но не чтение/запись диска".

Ответ 3

Захват "Проекта операционной системы 4.4BSD", в котором описывается то, что можно считать эталонной реализацией, разделы 11.2 "структура реализации" и 11.3 "управление памятью", а в отсутствие экстремального давления в памяти представляется быть гарантированным, что в передаче не будет задействован диск ввода-вывода.

Передаваемые данные хранятся в специальных структурах, mbufs и mbuf кластерах, данные добавляются или удаляются на каждом конце каждого буфера, напрямую. Вероятно, одни и те же буферы будут использоваться снова и снова, будучи освобожденными до определенного пула, а затем перераспределены оттуда. Свежие буферы выделяются из пула malloc ядра, который не подлежит обмену. Рост количества буферов, очевидно, произойдет только тогда, когда потребитель будет медленным и до предела.

Проще говоря, что касается данных, в эталонной реализации эти буферы не подкреплены файлами, а тем более файлом в файловой системе, где размещается индекс, в лучшем случае они будут поддерживаться подкап-пространством, даже если крайне маловероятно, чтобы его выгрузили.

Это исключает метаданные и информацию о состоянии, которые могут быть в inode. Естественно, создание и поиск inode вызовет доступ к диску. Что касается статуса, все, что я могу представить, это айти.

Я не могу найти авторитетную информацию об atime для сокетов домена UNIX. Но я пробовал FreeBSD и Linux, и все четыре файла всегда хранились как время создания inode. Даже установление второго подключения к соке домена UNIX, похоже, не обновляется atime.