Все системные вызовы блокируются?

13

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

Приложение ожидает завершения системного вызова, прежде чем возобновить выполнение в пользовательском режиме.

Теперь до сих пор я предполагал, что некоторые системные вызовы есть blocking, а другие - нет non-blocking. С комментарием выше я сейчас запутался. Означает ли это, что все системные вызовы блокируются, или я неправильно понял концепцию?

Анкит
источник
@ Ankit Пожалуйста, объясните, почему вы откатили изменения. Обратите внимание, что редактирование для улучшения деталей поста является стандартной политикой для SE и не подразумевает неявную критику.
Рафаэль
@ Рафаэль Извините, брат! Я просто возился и по ошибке откатил откат, а потом не смог найти предыдущую версию. На самом деле, мне очень понравилась ваша редакция. : P
Ankit
@ Рафаэль Вернул. На самом деле я был обманут системой пересмотра (не признал, что статья была ссылкой). Спасибо за правки.
Ankit
@ Анкит: Рад, что мог помочь!
Рафаэль

Ответы:

15

Вы, кажется, перегружаете термин «блокировка».

Любое переключение контекста в ядре, вы должны подождать, пока оно переключится обратно в режим пользователя, прежде чем ваше приложение сможет продолжить работу. Это не то, что обычно называют «блокированием».

В текущем проекте ядра блокирующие вызовы - это вызовы, которые возвращаются ядром только после завершения запроса (или при возникновении ошибки). Эти вызовы обычно занимают больше времени и обычно приводят к планированию вашего процесса. Например, многие вызовы ввода-вывода блокируются.

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

Похоже, что эта статья направлена ​​на то, чтобы покончить с этим переключением контекста взад-вперед (системные вызовы без исключений) и попытаться сделать все вызовы асинхронными.

Арьябхата
источник
Это на самом деле исследовательская работа. Вот URL: eecg.toronto.edu/~livio/papers/flexsc-osdi10.pdf
Ankit
2
@ Анкит: Пожалуйста, отредактируйте вопрос и добавьте его туда.
Арьябхата