Сетевые системы - в чем разница между «блокирующим» и «неблокирующим» протоколом? - PullRequest
8 голосов
/ 03 декабря 2011

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

Ответы [ 2 ]

8 голосов
/ 03 декабря 2011

«Блокирующий» вызов «блокирует» программу, которая вызывает его, пока не завершится.Ваша программа должна ждать, пока она выполнит (что угодно), прежде чем будет выполнен следующий оператор.Большинство вызовов функций являются «блокирующими», например, set x to 4 + 4 не перейдет к следующему оператору, пока не вычислит значение 8 и не присвоит его x.Аналогично, блокирующий или синхронный сетевой метод будет удерживать вызывающую программу до ее завершения.В случае чего-то вроде «отправить пакет в удаленную систему» ​​это время может быть измерено в секундах или дольше вместо микросекунд (или меньше), которые потребляет арифметика.

A «неблокирование»"или асинхронный метод обычно вместо этого либо помещает свои результаты в" почтовый ящик "или" очередь "какого-либо вида, либо (чаще) вызывает функцию, которую вы предоставляете после ее завершения.Это часто / обычно лучше для программы, которая делает что-то еще (например, отображает пользовательский интерфейс), ожидая завершения относительно медленного сетевого процесса.

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

Пример блокировки ввода / вывода в сети:

set web-page to (the result of) get url "http://www.google.com/"
in web-page, find <title>...</title>,
     assign this to google-title;
if not found,
     present a warning, and
     set google-title to "Google"
do something else…

против:

get url "http://www.google.com/" and call back google-title-callback
do something else…

function google-title-callback, accepts web-page:
    in web-page, find <title>...</title>,
         assign this to google-title;
    if not found,
         present a warning, and
         set google-title to "Google"

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

5 голосов
/ 03 декабря 2011

В чем заключается основная проблема?

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

Подсистемы ввода-вывода также обычно (все?) Независимы от системного процессора.Хотя это положительно в том смысле, что оно допускает одновременные действия в отдельных (hw) компонентах системы, оно также подчеркивает тот факт, что системе в целом также необходимо соединить отдельные компоненты ввода-вывода и ЦП, обеспечивая передачу данных и управляющей информации.

Как обобщение, мы говорим о взаимодействии взаимосвязанных (активных) компонентов .Как правило, это отношение «ведущий / ведомый», но это , а не общий случай, например, это относится и к одноранговому соединению.

+-----+                 +-----------+
| dev | <==== DATA ====>| processor |
|     | <---- ctrl -----| <master>  |
+-----+                 +-----------+

(Обратите внимание, что 'устройство может быть памятью, сетью, диском или другим процессом. Далее обратите внимание, что здесь есть 3 подсистемы, «шина» или «соединение» между двумя одноранговыми узлами - это также система с задержками, пропускной способностью, емкостью и т. д.)

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

  • Блокировка и неблокирование

Эти термины относятся к семантика вызовов .

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

При неблокирующем вызове компонент, который инициирует обмен, в основном выполняет пожар и (возможно) забывает.

  • Синхронный и асинхронный

Эти термины относятся к шаблонам взаимодействия (протокол).

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

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

Скорее всего, было бы понятно добавить "ответ"«к этим терминам, например,« Синхронный ответ », так как это полностью излагает общую идею и устраняет неоднозначность синхронизации от блокировки (что является распространенной концептуальной ошибкой).

  • Примечание

Как указано выше, очевидно, у нас есть пространство проектирования системы, которое является перестановкой {block, non-block} X {synch, asynch}.Например, система может использовать неблокирующую семантику вызовов с асинхронным протоколом.

Обсуждение

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

Но, будучи системными фанатами, нам также нравятся эффективность и производительность , верно?

В соответствии с нашей диаграммой выше, мы отмечаем 3 различные (и обе независимые) подсистемы.Разве не было бы неплохо, если бы вышеприведенный «процессор» мог сказать «шине» «отправить xyz в dev», а , а не дождаться, пока шина ответит: «Хорошо, я сделал это»?Это был бы неблокирующий звонок.(Обратите внимание, что он никоим образом не обращается к протоколу синхронизации или асинхронного протокола!)

Кроме того, что если общая система выиграет, если «процессору» придется выполнять какую-то другую работу, ожидая ответа для завершения обмена?Это был бы асинхронный обмен.

...