сетевой ввод вывод что это

Русские Блоги

(1) Основные концепции ввода-вывода и сетевой коммуникации.

Основная концепция

Сетевые коммуникации и ввод-вывод должны сначала начаться с фон Неймана, компьютерной архитектуры, предложенной им:

Управление калькулятором (ЦП…) ——> основная память (память…) ——> ввод и вывод (жесткий диск, сетевая карта, дисплей, клавиатура…)

Сетевое взаимодействие эквивалентно передаче данных одним компьютером другому компьютеру. Промежуточный процесс называется коммуникацией, то есть ввод и вывод на другой компьютер через интерфейс ввода-вывода. Это называется сетевым вводом-выводом, а сетевое взаимодействие можно понимать как ввод-вывод. A Как бы то ни было, многие люди будут различать концепции сетевого ввода-вывода и файлового ввода-вывода, на самом деле они одинаковы, но данные вводятся и выводятся в разные места по-разному. Существует множество режимов работы ввода-вывода, таких как BIO, NIO и т. Д., Которые могут соответствовать классам в Java, чтобы углубить нашу концепцию.

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

Некоторые из сетевых API-интерфейсов, предоставляемых в пакете java.net, например Socket, ServerSocket, HttpURLConnection, также можно отнести к библиотеке синхронного блокирующего ввода-вывода, поскольку сетевое взаимодействие также является поведением ввода-вывода.

В Java 1.4 была представлена ​​структура NIO (пакет java.nio), предоставляющая новые абстракции, такие как канал, селектор и буфер, которые могут создавать мультиплексированные программы ввода-вывода и обеспечивать высокопроизводительные методы обработки данных ближе к нижнему уровню операционной системы. система.

Концепции канала, селектора, буфера, мультиплексирования, блокировки и неблокирования будут подробно объяснены позже.

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

Более подробно, существует концепция файлового дескриптора перед вводом-выводом и сетевым взаимодействием. Используйте Linux и java в качестве примеров, чтобы кратко объяснить, как компьютер запускает программы.

Дескриптор файла

С точки зрения кода Java, скомпилированный файл Java представляет собой файл байт-кода класса, а файл байт-кода также является обычным текстовым файлом, за исключением того, что он содержит байты и хранит сериализованные вещи. Этот байт-код будет работать на языке C. На виртуальной машине JVM или другой процесс Java, JVM или процесс Java проанализирует байт-код в системные инструкции, а затем вызовет системный API, чтобы завершить то, что должна сделать программа Java. (Именно потому, что разные виртуальные машины JVM могут анализировать Java-код в соответствующие системные инструкции, поэтому Java может быть кроссплатформенной)

Давайте посмотрим, как вызвать API ядра системы Linux. В системе Linux существует идея, что «все является файлом», включая устройства ввода и вывода, рассматриваются как файлы. Например, принтер является абстрактным. как файл.Если вы напишете, он распечатает то, что мы написали. Итак, как управлять принтером и этим файлом, чтобы помочь нам выводить и печатать? Фактически, речь идет об API, предоставляемом операционной системой.

В Java вы можете делать что-то, вызывая объекты. В Linux нет понятия объектов, но все они абстрагируются как файлы. Затем мы стали местозаполнителем для оборудования, с которым хотим работать, или соединения, которое мы хотим использовать. Фактически, это число. Его профессиональный термин называется «Файловый дескриптор», это похоже на ссылочную переменную объекта в java. Ядро использует файловый дескриптор для доступа к файлу. При открытии или создании нового файла ядро ​​возвращает файловый дескриптор. Для чтения и записи файлов вам также необходимо использовать файловый дескриптор, чтобы указать файл для чтения и записи.

Документация по API

В системе Linux вы можете просматривать некоторые API-интерфейсы или команды ядра системы, установив справочные программы и плагины справочной страницы.

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

Например, вам нужно открыть файл перед чтением

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что этосетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что этоМы видим, что при передаче имени файла возвращается файловый оператор дескриптора файла.

Помимо открытых, есть сокеты, которые также могут получать файловые операторы.

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это
сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

конец

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

Каталог (поскольку большинство проектов выполняется в системе Linux, поэтому эта статья основана на Linux):
1. Основные концепции ввода-вывода и сетевого взаимодействия.
(1) Что такое ввод-вывод и сетевое взаимодействие
(2) Дескриптор файла.

Два: сетевое общение
(1) семиуровневая модель OSI и пятиуровневая концепция TCP / IP.
(2) Как запросить уровень приложения
(3) Как создать пакет данных на транспортном уровне, трижды обменяться рукопожатием и четыре раза помахать рукой.
(4) Как сетевой уровень отправляет пакеты данных, концепция окна
(5) Как ссылочный уровень выполняет механизм следующего перехода
(6) Заключение проверки проверки захвата пакетов
(7) Семиуровневая модель OSI обобщает пять уровней TCP / IP и протокол.

Три: ввод-вывод
(1) Углубленное изучение Socket, как сокет взаимодействует с вводом-выводом.
(2) Что такое BIO, процесс от BIO до NIO
(3) NIO и как использовать NIO в Java
(4)epoll

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

Источник

Пишем свой dependency free WebSocket сервер на Node.js

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

Node.js — это популярный инструмент для построения клиент-серверных приложений. При правильном использовании, Node.js способен обрабатывать большое количество сетевых запросов, используя всего один поток. Несомненно, сетевой ввод — вывод является одной из сильнейших сторон этой платформы. Казалось бы, что используя Node.js для написания серверного кода приложения, активно использующего различные сетевые протоколы, разработчики должны знать, как эти протоколы работают, но зачастую это не так. Виной тому еще одна сильная сторона Node.js, это его пакетный менеджер NPM, в котором можно найти готовое решение практически под любую задачу. Используя готовые пакеты, мы упрощаем себе жизнь, переиспользуем код (и это правильно), но в то же время скрываем от себя, за ширмой библиотек, суть происходящих процессов. В этой статье мы постараемся разобраться в протоколе WebSocket, реализуя часть спецификации, не используя внешних зависимостей. Добро пожаловать под кат.

Историческая справка

Для начала необходимо разобраться с исторической составляющей, а именно, зачем придумали сетевой протокол WebSocket и что послужило главной мотивацией для его создания. Изначально приложения, которым требовался активный обмен данными с сервером, использовали протокол http, что накладывало много ограничейний, связанных с этим протоколом. Ведь при создании http не предпологалось использовать его как двунаправленный протокол. Http работает по принципу request/reply — клиент отправляет запрос на сервер, а сервер на этот запрос формирует ответ и отправляет его клиенту. Каждый раз при такой схеме происходит установка нового соединения (напомню, что я рассказываю про стародревние времена до http 2.0). Протокол не подразумевает, что сервер сам может инициировать соединение с клиентом и отправить ему сообщение. Поэтому многие клиентские приложения, на подобии чатов, используя проткол http, были вынуждены с определенным интервалом опрашивать сервер на предмет изменений его состояния. Существует спецификация RFC6202, которая описывает лучшие практики относительно того, как серверу передавать сообщения клиенту по своей инициативе. Первая версия стандарта протокола WebSocket появилась в 2008 году, после чего несколько раз перерабатывалась. То, что мы знаем как WebSocket на данный момент появилось в 2011 году в виде 13ой версии протокола и описанной в стандарте RFC6455. Протокол находится на том же уровне сетевой модели OSI что и http и так же работает поверх tcp. WebSocket решает все описанные проблемы присущие http. Протокол WebSocket является двунаправленным, что означает, что после установки соединения, клиент и сервер могут обмениваться асинхронными сообщениями по открытому подключению. Инициировать подключение может как клиент так и сервер. К слову сказать, поддержка протокола WebSocket в браузере появилась в 2009 году и первым браузером, реализовавшем стандарт, был Google Chrome 4й версии. Но от к слов к делу, у нас есть протокол, давайте разберемся с ним и начнем его реализовывать. Работа с WebSocket делится на два больших этапа:

Рукопожатие

Для того, чтобы клиент смог установить соединение с сервером, по протоколу WebSocket, нужно перевести http сервер в этот режим работы. Чтобы это сделать, нужно отправить GET запрос со специальными заголовками. Но чтобы понять, какие заголовки отправляются на сервер из браузера, при попытки установить сокетное соединение, не будем сразу смотреть в спецификацию к протоколу, а начнем писать сервер и увидем эти заголовки в консоли. Для начала напишем http сервер, который будет принимать любой запрос и выводить в консоль заголовки этого запроса. Код я буду писать на typescript и запускать с помощью ts-node.

Сервер будет запущен на порту 8080. Теперь откроем консоль разработчика в браузере и напишем следующий код.

При создании объекта класса WebSocket, браузер попытается подключиться к серверу. У полученного объекта можно посмотреть текущее состояние подключения с помощью свойства readyState. Это свойство может принимать одно из четырех значений:

Если сейчас посмотреть свойство readyState, то оно будет в состоянии 0, но через некоторое время перейдет в состояние 3. Это происходит потому, что мы ничего не ответили на запрос перевода сервера на работу с другим протоколом. Подробнее про WebSocket API в браузере можно почитать тут

В консоли с запущенным сервером получим следующее:

Для перехода на другой протокол используется стандартный механизм, описанный в стандарте http RFC2616. Происходит http запрос типа GET, в котором передаётся заголовок upgrade с названием протокола, на который клиент хочет переключить сервер. Если сервер поддерживает желаемый протокол, то он должен ответить кодом 101, если нет — вернуть ошибку. В описании протокола WebSocket дополнительно передаётся еще несколько заголовков, часть из которых опциональны:

Чтобы клиент понял, что сервер успешно перешел на нужный протокол, сервер должен ответить кодом 101, а в ответе должен быть заголовок sec-websocket-accept, значение которого сервер должен сформировать, используя заголовок sec-websocket-key следующим образом:

Так же сервер должен передать в заголовках ответа заголовки Upgrade: WebSocket и Connection: Upgrade. Звучит не сложно, давайте реализуем. Для генерации загловка sec-websocket-key нам потребуется встроеный в node.js модуль crypto. Необходимо в начале импортировать его.

А затем изменить конструктор класса SocketServer

У http сервера Node.js есть специальное событие на upgrade соединения, используем его. Перезапустив сокет сервер с этими изменениями и снова попытавшись создать соединение в браузере, мы получим объект сокета, который будет в состоянии 1. Мы успешно создали соединение с нашим сервером и завершили первый этап. Переёдем ко второму.

Передача данных

Передача данных по сокетам происходит с помощью фреймов. Каждый фрейм — это единица информации с данными и метаинформацией. Фреймы сокетов никак не соотносятся с делением информации на фреймы или пакеты на более низких уровнях сетевой модели. За счет того, что информация передаётся фреймами, появляется возможность фрагментировать сообщения, т.е. пересылать сообщения частями. За счет фрагметации можно по сокетам передвать сообщения неизвестной длины, например, если нам нужно передать в виде сообщения большой файл, который мы читаем из стороннего источника (так тоже можно). Для того, чтобы разобраться с фреймами, нужно понимать, по каким правилам он формируется. В стандарте приведена следующая структура фрейма.

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

Визуально структура фрейма, на этой картинки, выглядит достаточно сложно. Поэтому я поделил его на несколько частей.

Источник

Файловый и потоковый ввод-вывод

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

Файлы и каталоги

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

Ниже перечислены некоторые часто используемые классы для файлов и каталогов:

File предоставляет статические методы для создания, копирования, удаления, перемещения и открытия файлов, а также помогает создать объект FileStream.

FileInfo предоставляет методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также помогает создать объект FileStream.

Directory предоставляет статические методы для создания, перемещения и перечисления в каталогах и подкаталогах.

DirectoryInfo предоставляет методы экземпляра для создания, перемещения и перечисления в каталогах и подкаталогах.

Path предоставляет методы и свойства для обработки строк каталогов межплатформенным способом.

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

Помимо использования этих классов, пользователи Visual Basic могут использовать методы и свойства, предоставляемые классом Microsoft.VisualBasic.FileIO.FileSystem для файлового ввода-вывода.

Потоки

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

Потоки включают три основные операции:

Чтение — перенос информации из потока в структуру данных, такую как массив байтов.

Запись — перенос данных в поток из источника данных.

Поиск — определение и изменение текущей позиции внутри потока.

В зависимости от базового источника или хранилища данных поток может поддерживать лишь некоторые из этих возможностей. Например, класс PipeStream не поддерживает поиск. Свойства CanRead, CanWrite и CanSeek потока определяют операции, поддерживаемые потоком.

Ниже перечислены некоторые часто используемые классы потока:

FileStream — для чтения и записи в файл.

IsolatedStorageFileStream — для чтения и записи в файл в изолированном хранилище.

MemoryStream — для чтения и записи в память в качестве резервного хранилища.

BufferedStream — для повышения быстродействия операций чтения и записи.

NetworkStream — для чтения и записи на сетевые сокеты.

PipeStream — для чтения и записи в анонимные и именованные каналы.

CryptoStream — для связи потоков данных с криптографическими преобразованиями.

Пример асинхронной работы с потоками см. в разделе Асинхронный файловый ввод-вывод.

Средства чтения и записи

Ниже перечислены некоторые часто используемые классы для чтения и записи:

BinaryReader и BinaryWriter — для чтения и записи простых типов данных, таких как двоичные значения.

StreamReader и StreamWriter — для чтения и записи символов с использованием закодированного значения для преобразования символов в байты или из байтов.

StringReader и StringWriter — для чтения и записи символов в строки или из строк.

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

Асинхронные операции ввода-вывода

Чтение и запись больших объемов данных может быть ресурсоемкой. Эти задачи необходимо выполнять асинхронно, если приложение должно продолжать отвечать на запросы пользователя. В случае синхронных операций ввода-вывода поток пользовательского интерфейса будет заблокирован до тех пор, пока ресурсоемкая операция не завершится. При разработке приложений Microsoft Store для Windows 8.x используйте асинхронные операции ввода-вывода, чтобы не создавалось впечатления, что приложение прекратило свою работу.

Дополнительные сведения см. в разделе Асинхронный файловый ввод-вывод.

Сжатие

Сжатием называется процесс сокращения размера сохраняемого файла. Распаковка — это процесс извлечения содержимого сжатого файла, что приводит его в формат, пригодный для использования. Пространство имен System.IO.Compression содержит типы для сжатия и распаковки файлов и потоков.

При сжатии и распаковке файлов и потоков часто используются следующие классы:

ZipArchive — для создания и восстановления содержимого ZIP-архива.

ZipArchiveEntry — для представления сжатого файла.

ZipFile — для создания, извлечения и открытия сжатого пакета.

ZipFileExtensions — для создания и извлечения содержимого из сжатого пакета.

DeflateStream — для сжатия и распаковки потоков с помощью алгоритма Deflate.

GZipStream — для сжатия и распаковки потоков в формате gzip.

См. практическое руководство по Сжатие и извлечение файлов.

Изолированное хранилище

Изолированное хранилище — это механизм хранения данных, обеспечивающий изоляцию и безопасность путем определения стандартизованных способов сопоставления кода с хранимыми данными. Хранилище предоставляет виртуальную файловую систему, изолированную по пользователю, сборке и (необязательно) домену. Изолированное хранилище особенно полезно в том случае, когда приложение не имеет разрешения на доступ к файлам пользователя. Можно сохранить параметры или файлы для приложения таким способом, который контролируется политикой безопасности компьютера.

Изолированное хранилище недоступно для приложений Microsoft Store для Windows 8.x. Вместо этого используйте классы данных приложения в пространстве имен Windows.Storage. Дополнительные сведения см. в разделе Данные приложения.

Часто используются следующие классы, реализующие изолированное хранилище:

IsolatedStorage предоставляет базовый класс для реализации изолированного хранилища.

IsolatedStorageFile предоставляет область изолированного хранилища, в которой содержатся файлы и каталоги.

IsolatedStorageFileStream представляет файл в изолированном хранилище.

Операции ввода-вывода в приложениях Microsoft Store

Следует отметить некоторые важные различия в использовании операций ввода-вывода в приложениях Microsoft Store для Windows 8.x:

Изолированное хранилище недоступно; вместо этого используйте данные приложения.

Используйте асинхронные методы, такие как ReadAsync и WriteAsync, чтобы предотвратить блокировку потока пользовательского интерфейса.

Типы сжатия на основе пути ZipFile и ZipFileExtensions недоступны. Вместо этого используйте типы в пространстве имен Windows.Storage.Compression.

Дополнительные сведения об операциях ввода-вывода в приложении Microsoft Store для Windows 8.x: Краткое руководство. Чтение и запись файлов.

Ввод-вывод и безопасность

При использовании классов в пространстве имен System.IO необходимо выполнить требования безопасности операционной системы, такие как списки управления доступом для контроля доступа к файлам и каталогам. Это требование дополняет остальные требования FileIOPermission. Списками управления доступом можно управлять программно. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление записей списка управления доступом.

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

См. также

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

Асинхронный файловый ввод-вывод
Описывает преимущества и основные операции асинхронного ввода и вывода.

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

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

Источник

Русские Блоги

Java IO: понимание блокирующего / неблокирующего ввода-вывода, синхронного / асинхронного ввода-вывода

вступление

Стивенс сравнил пять моделей ввода-вывода в статье:
blocking IO
nonblocking IO
IO multiplexing
signal driven IO
asynchronous IO
Поскольку ввод-вывод, управляемый сигналом, обычно не используется на практике, я упомяну только оставшиеся четыре модели ввода-вывода.

Два этапа операции ввода-вывода

(1) Ожидание готовности данных

(2) Копирование данных из ядра в процесс (Копирование данных из ядра в процесс)

Важно помнить об этих двух моментах, потому что они IO Model Разница в том, что на двух этапах бывают разные ситуации. Блокировать ли относится к первому этапу, то есть будет ли блокироваться этап подготовки ожидающих данных, а необходимость синхронизации относится ко второму этапу, который заключается в копировании данных из ядра в реальный процесс. IO Operation Заблокирована ли фаза работы.

Blocking IO (блокировка ввода-вывода)

В Linux все сокеты по умолчанию блокируются. Типичный процесс чтения примерно такой:

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

Когда пользовательский процесс вызывает системный вызов recvfrom, ядро ​​начинает первый этап ввода-вывода: подготовку данных. Для сети io много раз данные не поступали в начале (например, не был получен полный пакет UDP), в это время ядро ​​будет ждать поступления достаточного количества данных. На стороне пользовательского процесса весь процесс будет заблокирован. Когда ядро ​​ожидает, пока данные будут готовы, оно копирует данные из ядра в пользовательскую память, а затем ядро ​​возвращает результат, а пользовательский процесс освобождает состояние блока и перезапускается.

и другие, blocking IO Характеризуется IO Оба этапа исполнения block Вверх.

Неблокирующий ввод-вывод (non-blockingIO)

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

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

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

и другие, non-blocking IO Характеризуется IO Первый этап выполнения не блокируется, и вы можете вернуться, если не готовы, но на втором этапе данные копируются из ядра в процесс. IO Operation Фаза операции будет заблокирована.

Мультиплексирование ввода-вывода (мультиплексирование ввода-вывода)

Термин «мультиплексирование ввода-вывода» может быть немного незнакомым, но если я скажу «select / epoll», я, вероятно, смогу его понять. В некоторых местах этот метод ввода-вывода также называется вводом-выводом, управляемым событиями (event-driven IO). Все мы знаем, что преимущество select / epoll в том, что один процесс может одновременно обрабатывать несколько операций ввода-вывода, подключенных к сети. Его основной принцип заключается в том, что функция select / epoll будет непрерывно опрашивать все сокеты, за которые она отвечает, и когда на сокет поступят данные, она уведомит пользовательский процесс. Его процесс показан на рисунке:

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

Когда пользовательский процесс вызывает select, весь процесс будет заблокирован. В то же время ядро ​​будет «контролировать» все сокеты, ответственные за select. Когда данные в любом сокете будут готовы, select вернется. В это время пользовательский процесс снова вызывает операцию чтения, чтобы скопировать данные из ядра в пользовательский процесс.

Эта картина мало чем отличается от картинки с блокировкой ввода-вывода, на самом деле даже хуже. Потому что здесь необходимо использовать два системных вызова (select и recvfrom), а блокировка ввода-вывода вызывает только один системный вызов (recvfrom). Однако преимущество использования select состоит в том, что он может обрабатывать несколько подключений одновременно. (Еще одно предложение. Итак, если количество обработанных соединений не очень велико, веб-сервер, использующий select / epoll, не обязательно лучше, чем веб-сервер, использующий многопоточность + блокировку ввода-вывода, и задержка может быть даже больше. Select / epoll Преимущество не в том, что он может обрабатывать одно соединение быстрее, а в том, что он может обрабатывать больше соединений. )

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

Асинхронный ввод-вывод (Asynchronous I / O)

AsynchronousIO под Linux редко бывает практичным. Сначала посмотрите на его процесс:

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

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

Так асинхронный IO Характеризуется IO Обе фазы операции не будут заблокированы, но будут завершены ядром операционной системы, и после завершения работы ядра пользовательский процесс может быть уведомлен с помощью сигнала.

Блокирование против неблокирования

Разница в том, что IO Первый этап операции, звоните blockingIO Всегда будет block Продолжайте соответствующий процесс, пока операция не будет завершена, и non-blocking IO в kernel Если данные все еще готовы, они немедленно вернутся.

Синхронный против асинхронного

Прежде чем объяснять разницу между синхронным вводом-выводом и асинхронным вводом-выводом, необходимо дать определение обоих. Определение, данное Стивенсом (на самом деле определение POSIX), выглядит так:

A synchronous I/Ooperation causes the requesting process to be blocked until that I/O operation completes;

An asynchronous I/O operationdoes not cause the requesting process to be blocked;

Разница между ними synchronous IO делать ”IO operation” Когда будет process блок. Согласно этому определению, ранее упомянутые blockingIO , non-blocking IO , IO multiplexing Принадлежит synchronous IO 。

Кто-то может сказать, что неблокирующий IO не блокируется. Здесь есть очень «хитрое» место. «Операция ввода-вывода» в определении относится к реальной операции ввода-вывода, которой в данном примере является системный вызов recvfrom. Когда неблокирующий ввод-вывод выполняет системный вызов recvfrom, если данные ядра не готовы, процесс не будет заблокирован в это время. Однако, когда данные в ядре будут готовы, recvfrom скопирует данные из ядра в пользовательскую память. В это время процесс блокируется. В это время процесс блокируется. Асинхронный ввод-вывод отличается: когда процесс инициирует операцию ввода-вывода, он возвращается напрямую и снова игнорирует ее, пока ядро ​​не отправит сигнал, сообщающий процессу, что операция ввода-вывода завершена. В течение всего этого процесса процесс вообще не блокировался.

подводить итоги

Сравнение каждой модели ввода-вывода показано на рисунке:

сетевой ввод вывод что это. Смотреть фото сетевой ввод вывод что это. Смотреть картинку сетевой ввод вывод что это. Картинка про сетевой ввод вывод что это. Фото сетевой ввод вывод что это

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *