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