Если один процесс отправляет данные через сокет другому процессу на той же машине, насколько вероятно, что чтение/запись диска произойдет во время передачи? Кажется, что есть тип файла сокета, гарантированно ли они в памяти, если есть свободная память?
Включает ли 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.