Как этот метод связи клиент-сервер может сохранить два пересечения ядра?

#linux #unix #linux-kernel #operating-system #interrupt

#linux #unix #linux-ядро #операционная система #прерывание

Вопрос:

В книге по операционной системе, когда говорится о связи клиент-сервер, говорится:

Взаимодействие клиент-сервер является распространенным шаблоном во многих системах, и поэтому можно спросить: как мы можем улучшить его производительность? Одним из шагов является распознавание того, что и клиент, и сервер немедленно выполняют запись, за которой следует чтение, чтобы дождаться ответа другой стороны; за счет добавления системного вызова их можно объединить, чтобы исключить два пересечения ядра за один цикл.

Интересно, как «выполнить запись, за которой сразу же следует чтение«, может сэкономить 2 пересечения ядра за цикл.

write выдает системный вызов в ядро, вызывает переход ядра из пользовательского режима в режим ядра. Когда write завершается, ОС возвращается к пользовательскому коду, из режима ядра в пользовательский режим.

Затем вызывается, read и вызывает переход ядра из пользовательского режима в режим ядра, а затем он возвращается к пользовательскому коду, из режима ядра в пользовательский режим.

Итак, что такое сохраненное пересечение ядра? Означает ли это, что по write завершении он не возвращается к пользовательскому коду и пользовательскому режиму, вместо этого он напрямую запускается read в режиме ядра?

Ответ №1:

Насколько я понимаю книгу по ОС, это потенциальная оптимизация. В ОС может быть системный вызов, который выполняет запись и чтение одновременно. Это может быть гипотетический системный вызов, подобный int write_read(int fd, char *write_buf, size_t write_len, char *read_buf, size_t *read_len) . Но такого вызова в ядре Linux нет.

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