Как работает режим блокировки в сокетах unix / linux? - PullRequest
3 голосов
/ 10 июля 2009

Переводит ли режим блокировки эту конкретную задачу в состояние «Ожидание процесса», поскольку я думаю, что неблокирующим сокетам требуется реализация «занято-ожидание» или «спин-блокировка», явно от пользователя. Или сокеты в режиме блокировки - это не что иное, как неявные реализации ядра с занятым ожиданием.

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

Я не знаю наверняка, я думаю, что опрос не является эффективным способом, особенно для ядра, так как ядро ​​всегда полно своих задач.

ТНХ.

Ответы [ 3 ]

9 голосов
/ 10 июля 2009

Нет, в ядре реализованы блокирующие сокеты. Процесс находится в неисполняемом состоянии и не потребляет процессорного времени.

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

Таймеры будут работать так же, но с прерыванием таймера.

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

1 голос
/ 10 июля 2009

Пожалуйста, посмотрите мой ответ на этот вопрос: C ++ - как работает Sleep () и cin?

0 голосов
/ 12 июля 2009

На основании того, что я узнал из сети / книги / и дал ответы. Я постараюсь быть в точке.

По умолчанию все сокеты блокируются. Это означает, что когда мы запускаем вызов сокета, который не может быть завершен немедленно, наш процесс переводится в режим ожидания, ожидая выполнения условия. unp - p435

Сон реализуется путем перевода процесса в состояние ожидания / блокировки. Планировщик проверяет условие разблокирования процесса, когда заблокированный процесс получает его очередь, то есть когда планировщик передает ему ЦП. Отзывчивость в этом случае зависит от временного разрешения планировщика.

Таким образом, блокирующие вызовы не являются неявной реализацией "ожидания ожидания" или "спин-блокировки" из ядра.

Да, базовый механизм блокировки одинаков для большинства реализаций. Перевод процесса в состояние блокировки / ожидания.

Конечно, опрос не был эффективным, то есть почему блокировка не реализована с помощью опроса.

...