В ИТ-кружке, независимо от того, какой язык программирования вы используете, 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…
Отсканируйте код, чтобы следовать за сюрпризом
(Просьба указывать автора и источник при перепечатке статей с этого сайтаБлог Фан Чжипэна)