В чем заключается основная проблема?
Подсистемы ввода-вывода обычно имеют на несколько порядков большие задержки, чем простая обработка команд (в ЦП).Эта задержка также недетерминирована (хотя, конечно, в известных пределах).
Подсистемы ввода-вывода также обычно (все?) Независимы от системного процессора.Хотя это положительно в том смысле, что оно допускает одновременные действия в отдельных (hw) компонентах системы, оно также подчеркивает тот факт, что системе в целом также необходимо соединить отдельные компоненты ввода-вывода и ЦП, обеспечивая передачу данных и управляющей информации.
Как обобщение, мы говорим о взаимодействии взаимосвязанных (активных) компонентов .Как правило, это отношение «ведущий / ведомый», но это , а не общий случай, например, это относится и к одноранговому соединению.
+-----+ +-----------+
| dev | <==== DATA ====>| processor |
| | <---- ctrl -----| <master> |
+-----+ +-----------+
(Обратите внимание, что 'устройство может быть памятью, сетью, диском или другим процессом. Далее обратите внимание, что здесь есть 3 подсистемы, «шина» или «соединение» между двумя одноранговыми узлами - это также система с задержками, пропускной способностью, емкостью и т. д.)
Термины синхронный, асинхронный, блокирующий и неблокирующий , адрес и определение семантики связи / межсоединения между двумя связаннымикомпоненты.
- Блокировка и неблокирование
Эти термины относятся к семантика вызовов .
При блокирующем вызове компонент, инициирующий обмен , приостанавливает всю активность до тех пор, пока передача управления и / или данных другому компоненту не будет завершена.
При неблокирующем вызове компонент, который инициирует обмен, в основном выполняет пожар и (возможно) забывает.
Эти термины относятся к шаблонам взаимодействия (протокол).
В синхронном взаимодействии двакомпонент будет действовать в режиме блокировки, и взаимодействие будет полностью детерминированным. По сути, мы можем сказать, что существует известный, детерминированный и конечный набор действий, которые будут происходить при синхронном обмене между компонентами.
В асинхронном взаимодействии два компонентане координируются в шаге блокировки (так называемый асинхронный). По сути, мы можем сказать, что существует неизвестный набор действий, которые могут произойти в любом компоненте в ходе завершения обмена.
Скорее всего, было бы понятно добавить "ответ"«к этим терминам, например,« Синхронный ответ », так как это полностью излагает общую идею и устраняет неоднозначность синхронизации от блокировки (что является распространенной концептуальной ошибкой).
Как указано выше, очевидно, у нас есть пространство проектирования системы, которое является перестановкой {block, non-block} X {synch, asynch}
.Например, система может использовать неблокирующую семантику вызовов с асинхронным протоколом.
Обсуждение
В целом справедливо сказать, что мыПрограммисты-люди предпочитают последовательные и полностью детерминированные модели: их проще представить, развить или обмануть, откровенно говоря.
Но, будучи системными фанатами, нам также нравятся эффективность и производительность , верно?
В соответствии с нашей диаграммой выше, мы отмечаем 3 различные (и обе независимые) подсистемы.Разве не было бы неплохо, если бы вышеприведенный «процессор» мог сказать «шине» «отправить xyz в dev», а , а не дождаться, пока шина ответит: «Хорошо, я сделал это»?Это был бы неблокирующий звонок.(Обратите внимание, что он никоим образом не обращается к протоколу синхронизации или асинхронного протокола!)
Кроме того, что если общая система выиграет, если «процессору» придется выполнять какую-то другую работу, ожидая ответа для завершения обмена?Это был бы асинхронный обмен.