Те годы путаницы синхронных, асинхронных, блокирующих, неблокирующих

задняя часть внешний интерфейс Язык программирования

В ИТ-кружке, независимо от того, какой язык программирования вы используете, front-end или back-end, необходимо четко усвоить понятия блокирующего, неблокирующего, асинхронного и синхронного, иначе как вы можете болтать и смеяться с интервьюер (чуй ню пи)? Однако освоить эти понятия не очень легко, особенно для нестудентов, даже сложнее. В этой статье делается попытка дать ясное и краткое, но не глубокое введение, в надежде помочь всем.

1. Начните с ввода/вывода

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

Представьте себя как процесс, назовите его Xiaojin. Xiaojin должен получить ввод.Нас не волнует, поступает ли ввод из сетевого разъема, клавиатуры или мыши.Источник ввода может быть тысячами и тысячами. Однако это должно быть сделано ядром, чтобы помочь Xiaojin.Почему ядро ​​​​такое властное? Потому что запуск на компьютере — это не просто маленький процесс, процессов много. Этим братьям по процессам также может понадобиться получать ввод от этих устройств ввода, а координация центрирования ядра отсутствует, неразбериха.

С точки зрения Xiaojin, ядро ​​помогает завершить ввод, который фактически включает три шага:

  • 1. Ядро получает данные для Xiaojin, и эти данные временно сохраняются в пространстве памяти ядра
  • 2. Ядро копирует данные из своего собственного пространства памяти в маленькое пространство памяти.
  • 3. Сообщите Сяоцзину, что приходят входные данные, поторопитесь и прочтите их.

Эти три шага кажутся довольно простыми, но на самом деле есть много моментов, которые нужно учитывать при реализации:

  • 0. Как Xiaojin сообщает ядру, что хочет получить ввод?
  • 1. Ядро получает запрос Xiaojin на получение данных для Xiaojin Что делать Xiaojin?
  • 2. Что делать Xiaojin, когда ядро ​​копирует данные в пространство памяти Xiaojin?
  • 3. Когда сообщить Xiaojin, что данные готовы, вы сообщаете Xiaojin после того, как ядро ​​получит данные, или сообщите ему после копирования данных в пространство памяти Xiaojin?
  • 4. Каким образом ядро ​​сообщает Xiaojin, что данные готовы?

2. Блокирующая модель ввода/вывода

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

Xiaojin: Ядро Ядро, я хочу получить ввод с клавиатуры, помогите мне закончить это быстро!

Ядро: Хорошо! бибиу! В Сяо Цзиня был брошен блок, и Сяо Цзинь мгновенно окаменел, как будто ему приказал Сунь Укун.

Таким образом, Сяо Цзинь окаменел, и время идет понемногу. Наконец, ядро ​​получило данные.

Ядро: Данные наконец-то здесь, я начинаю! duang duang duang, сначала сохраните данные в собственном пространстве ядра, а затем скопируйте их в пользовательское пространство Xiaojin.

Ядро: бибиу! Сяоцзину передается разблокировка, и Сяоцзинь мгновенно возрождается. Память Сяоцзина все еще остается, когда ядро ​​​​помогает ему получить ввод.

Сяо Цзинь: Вау! Ядро действительно надежное, а данные уже есть! Идти на работу!

Мы видим, что когда Xiaojin отправляет запрос на получение ввода в ядро, оно находится в состоянии блокировки, и только после того, как ядро ​​скопирует данные в пользовательское пространство Xiaojin, Xiaojin разблокирует его.

3. Неблокирующий ввод-вывод

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

Xiaojin: Kernel Kernel, я хочу получить ввод, пожалуйста, помогите мне увидеть, поступают ли данные, пожалуйста, скажите это первым, не блокируйте меня.

Ядро: я проверил свое пространство ядра и не нашел данных, поэтому я быстро сказал Сяоцзину, нет! И продолжайте помогать Xiaojin ждать данных.

Таким образом, Сяо Цзинь продолжал спрашивать ядро, и, наконец, через некоторое время, когда Сяо Цзинь снова спросил, ядро ​​проверило его собственное пространство, йо! Данные пришли, и проблемное ядро ​​быстро сообщило Сяоцзину, что данные готовы!

Сяо Цзинь: Дай мне!

Ядро: биу! В Сяо Цзинь был брошен блок, а грустный Сяо Цзинь все еще окаменел!

Ядро быстро копирует входные данные своего пространства в пространство пользователя Xiaojin, а после завершения копирования.

Ядро: биу! Сяоцзину бросается неблокирующий, и Сяоцзинь тут же воскрешается.

Сяо Цзинь: Вау! Данные здесь, ничего не говори, работай!

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

4. Управляемый сигналом ввод-вывод

В неблокирующем вводе-выводе Сяо Цзинь постоянно спрашивал ядро, готовы ли данные, но ядро ​​это слишком раздражало, поэтому он нашел хорошее решение.

Ядро сообщило Сяоцзину, что это ядро ​​было обновлено.Если вы хотите, чтобы я получал входные данные для вас, пожалуйста, сначала зарегистрируйте функцию обработки сигналов, и я отправлю вам сигнал, когда данные будут готовы. Итак, текущий процесс выглядит следующим образом:

Xiaojin: Зарегистрируйте функцию обработки сигнала, сообщите ядру, что вы хотите получить ввод, а затем продолжайте работать!

Ядро: функция приема, запуск приема данных

Когда прием завершен, отправьте сигнал Xiaojin, функция обработки сигнала получит сигнал и начнет отправлять запрос на чтение данных в ядро.

Ядро: биу! Блокирует небольшой аванс и копирует данные из пространства ядра в пользовательское пространство небольшого аванса.

Ядро: биу! разблокирован

Сяо Цзинь: Вау! Данные здесь! Ничего не говори, иди работай!

5. Асинхронный ввод-вывод

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

Во второй и третьей схемах малый аванс блокируется только тогда, когда ядро ​​копирует данные из пространства ядра в пользовательское пространство малого аванса.

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

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

Ядро: У меня есть ты, ты занят в первую очередь.

Только после того, как ядро ​​получит данные и скопирует данные из пространства ядра в пользовательское пространство малого продвижения, ядро ​​посылает сигнал малому продвижению. Небольшое продвижение может напрямую обрабатывать данные в функции обработки сигналов.

6. Что такое синхронизация?

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

7. Нет резюме, нет прогресса

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

Добавить Автора
Связь:
Краткое описание.com/fear/3's 603166…


Отсканируйте код, чтобы следовать за сюрпризом

(Просьба указывать автора и источник при перепечатке статей с этого сайтаБлог Фан Чжипэна)