Я читал статью, которая описывает переключение между пользовательским пространством и пространством ядра, которое происходит при системном вызове. В статье говорится
Приложение ожидает завершения системного вызова, прежде чем возобновить выполнение в пользовательском режиме.
Теперь до сих пор я предполагал, что некоторые системные вызовы есть blocking
, а другие - нет non-blocking
. С комментарием выше я сейчас запутался. Означает ли это, что все системные вызовы блокируются, или я неправильно понял концепцию?
Ответы:
Вы, кажется, перегружаете термин «блокировка».
Любое переключение контекста в ядре, вы должны подождать, пока оно переключится обратно в режим пользователя, прежде чем ваше приложение сможет продолжить работу. Это не то, что обычно называют «блокированием».
В текущем проекте ядра блокирующие вызовы - это вызовы, которые возвращаются ядром только после завершения запроса (или при возникновении ошибки). Эти вызовы обычно занимают больше времени и обычно приводят к планированию вашего процесса. Например, многие вызовы ввода-вывода блокируются.
Есть системный вызов, который обеспечивает асинхронный ввод-вывод, и они неблокируют. Обратите внимание, что здесь все еще происходит переключение контекста, только приложение должно заботиться об асинхронной природе вызова.
Похоже, что эта статья направлена на то, чтобы покончить с этим переключением контекста взад-вперед (системные вызовы без исключений) и попытаться сделать все вызовы асинхронными.
источник