Все кончено, это железо дорабатывается, оно обходит процессор...

задняя часть Операционная система

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

Как и в других системах UNIX, управление вводом-выводом в системах Linux является простым и лаконичным. Все устройства ввода-вывода рассматриваются как文件, используя то же чтение и запись внутри системы для чтения и записи.

Основные понятия Linux IO

В Linux также есть устройства ввода-вывода, такие как диски, принтеры и сети.特殊文件интегрированы в файловую систему, обычно расположенную в/devПод содержанием. С этими специальными файлами можно обращаться так же, как с обычными файлами.

Обычно существует два типа специальных файлов:

Блочный специальный файл — это файл, который может хранить固定大小块информация об устройстве, которое он поддерживаетЧтение и (необязательно) запись данных в блоки, сектора или кластеры фиксированного размера.. Каждый блок имеет свой物理地址. Обычно размер блока составляет от 512 до 65536. Вся передаваемая информация будет连续блоков. Основная особенность блочных устройств заключается в том, что каждый блок относительно противоположен и может считываться и записываться независимо друг от друга. Обычные блочные устройстваЖесткий диск, диск Blu-ray, USB-накопительБлочные устройства обычно требуют меньше контактов, чем символьные устройства.

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

Другой тип устройства ввода/вывода字符特殊文件. символьное устройство с字符Отправляйте или получайте поток символов в единицах, независимо от какой-либо блочной структуры. Символьные устройства не адресуются и не имеют операций поиска. Обычные символьные устройстваПринтеры, сетевые устройства, мыши и большинство других устройств, кроме дисков..

Каждый специальный файл устройства будет объединен с设备驱动Связанный. Каждый водитель проходит主设备号идентифицировать. Если драйвер поддерживает несколько устройств, новое будет добавлено после основного устройства.次设备号идентифицировать. Вместе старший и младший номера определяют уникальное приводное устройство.

Мы знаем, что в компьютерной системе ЦП не имеет прямого отношения к устройству, есть одно из них, называемое设备控制器(Device Control Unit)компоненты, такие как жесткий диск имеет контроллер диска, USB имеет контроллер USB, монитор имеет видеоконтроллер и т. д. Эти контроллеры как агенты, они умеют обращаться с поведением винчестера, мыши, клавиатуры, монитора.

Доступ к большинству специальных файлов символов невозможен, потому что ими нужно управлять иначе, чем специальными файлами блоков. Например, вы вводите какие-то символы на клавиатуре, но обнаруживаете, что набрали один неверный, и некоторые люди любят использоватьbackspaceудалить, некоторые люди любят использоватьdelудалить. Чтобы прервать работающее устройство, некоторые системы используютctrl-uдо конца, но теперь обычно используютctrl-cв конец.

Интернет

Другая концепция ввода/вывода网络, также представлена ​​UNIX, ключевой концепцией в сети является套接字(socket). Сокеты позволяют пользователям подключаться к сети, так же как почтовый ящик позволяет пользователям подключаться к почтовой системе, схематическая диаграмма сокета выглядит следующим образом.

Расположение сокета показано выше, и сокет может быть динамически создан и уничтожен. После успешного создания сокета система возвращает文件描述符(file descriptor), вам необходимо использовать этот файловый дескриптор при создании ссылки, чтении данных, записи данных и отключении соединения. Каждый сокет поддерживает определенный тип сети, указанный во время создания. Наиболее часто используется

  • Надежный поток байтов, ориентированный на соединение
  • Надежные пакеты, ориентированные на соединение
  • Ненадежная доставка пакетов

Надежный поток байтов, ориентированный на соединение, будет использовать管道Установите соединение между двумя машинами. Он может гарантировать, что байты будут поступать от одной машины к другой по порядку, а система может гарантировать, что все байты поступят.

Второй тип аналогичен первому, за исключением разграничения между пакетами. Если отправлено 3 записи, получатель, использующий первый метод, получит все байты напрямую, получатель второго метода получит все байты в 3 пакетах. Кроме того, пользователи также могут использовать для передачи третий тип ненадежных пакетов данных.Преимущество использования этого метода передачи заключается в высокой производительности.Иногда она важнее надежности.Например, в потоковом мультимедиа особенно важна производительность.

Вышеупомянутое включает две формы протоколов передачи, а именноTCPиUDP, ПТС есть传输控制协议, который может передавать надежный поток байтов.UDPда用户数据报协议, он может передавать только ненадежные потоки байтов. Все они относятся к протоколам в наборе протоколов TCP/IP, а ниже приведены уровни сетевых протоколов.

Видно, что и TCP, и UDP расположены на сетевом уровне, и видно, что они оба используют протокол IP, а именно互联网协议как основной.

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

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

Системные вызовы ввода-вывода Linux

Каждое устройство ввода-вывода в системе Linux имеет特殊文件(special file)Связанный с этим, что такое специальный файл?

В операционной системе специальный файл — это файл, связанный с аппаратным устройством в файловой системе. специальный файл, также известный как设备文件(device file). Назначение специального файла — представить устройство как файл в файловой системе. Специальные файлы предоставляют интерфейс для аппаратных устройств, к которым могут получить доступ инструменты для файлового ввода-вывода. Поскольку существует два типа устройств, существует также два типа специальных файлов, а именно символьные специальные файлы и блочные специальные файлы.

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

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

Реализация ввода-вывода в Linux

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

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

каждый驱动程序Есть две части: обе части относятся к ядру Linux, и обе работают в режиме ядра. Верхняя часть работает в контексте вызывающей программы и взаимодействует с остальной частью Linux. Нижняя часть работает в контексте ядра и взаимодействует с устройством. Драйверы могут вызывать процедуры ядра, такие как выделение памяти, управление таймером, управление прямым доступом к памяти и т. д. Функции ядра, которые можно вызывать, находятся в驱动程序 - 内核接口в документации.

Реализация ввода-вывода относится к реализации символьных и блочных устройств.

реализация блочного устройства

Задача той части системы, которая обрабатывает блочный ввод-вывод специальных файлов, состоит в том, чтобы количество передач было как можно меньше. Для достижения этой цели системы Linux создали高速缓存(cache),Как показано ниже

До ядра Linux 2.2 системы Linux поддерживали два кеша:页面缓存(page cache)и缓冲区缓存(buffer cache), поэтому файл, хранящийся в одном блоке диска, может находиться в двух кешах. После версии 2.2 ядро ​​Linux имеет только один унифицированный кеш.通用数据块层(generic block layer)Собрав их вместе, реализуются необходимые преобразования между дисками, блоками данных, буферами и страницами данных. Так что же такое общий блочный слой?

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

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

выполнить零拷贝механизм, данные диска могут быть помещены непосредственно в адресное пространство пользовательского режима без предварительного копирования в память ядра.

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

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

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

Если такого блока в кэше страниц нет, операционная система загрузит страницу с диска в память, а затем прочитает ее в кэш для кэширования.

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

Используется в Linux-системахIO 调度器Чтобы уменьшить повторные движения магнитной головки, чтобы уменьшить потери. Роль планировщика ввода-вывода состоит в том, чтобы упорядочивать операции чтения и записи блокирующих устройств и объединять запросы на чтение и запись. В Linux есть много вариантов планировщика для различных задач. Самый простой планировщик Linux основан на традиционномLinux 电梯调度器(Linux elevator scheduler). Основной рабочий процесс планировщика лифтов Linux заключается в сортировке по адресам секторов диска и сохранении их в双向链表середина. Новые запросы будут вставлены в виде связанного списка. Этот метод может эффективно предотвратить многократное движение головы. Потому что планировщик лифтов склонен к голоданию. Поэтому Linux был изменен на исходной основе и сохранил два связанных списка.最后日期(deadline)Отсортированные операции чтения и записи поддерживаются внутри. Операция чтения по умолчанию занимает 0,5 с, а операция записи по умолчанию — 5 с. Если список с наибольшим временем ожидания не будет обслужен в установленный срок, он будет обслужен первым.

Реализация символьного устройства

Взаимодействие с символьными устройствами относительно простое. Поскольку символьные устройства генерируют и используют потоки символов и байтовые данные, поддержка произвольного доступа не имеет большого значения. Исключением является использование行规则(line disciplines). Профиль может быть связан с конечным устройством с помощьюtty_structПредставлять структуру, она представляет собой интерпретатор, который обменивается данными с терминальным устройством, разумеется, это тоже часть ядра. Например, профиль может редактировать строку, сопоставлять возврат каретки с переводом строки и ряд других операций.

Что такое правило строки?

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

реализация сетевого устройства

Взаимодействие сетевых устройств неодинаково, хотя网络设备(network devices)потоки символов также генерируются, потому что их异步(asynchronous)Характерной чертой является то, что их нелегко интегрировать с другими символьными устройствами с тем же интерфейсом. Драйвер сетевого устройства генерирует множество пакетов, которые поступают в пользовательские приложения по сетевым протоколам.

Модули в Linux

Драйверы устройств UNIX静态加载в ядро. Поэтому драйверы устройств загружаются в память при каждом запуске системы. С появлением персонального компьютера Linux этот шаблон статического связывания, использовавшийся в течение определенного периода времени, был нарушен. Количество устройств ввода-вывода, доступных на ПК, выросло на порядки по сравнению с мини-компьютерами. У подавляющего большинства пользователей нет возможности добавить новое приложение, обновить драйвер устройства, переподключить ядро, а затем установить его.

Для решения этой проблемы Linux представил可加载(loadable module)механизм. Загружаемые файлы — это блоки кода, которые добавляются в ядро ​​во время работы системы.

Когда модуль загружается в ядро, происходят следующие вещи: Во-первых, в процессе загрузки модуль динамически повторно развертывается. Во-вторых, система проверяет, доступны ли ресурсы, необходимые программе. Если они доступны, отметьте эти ресурсы как используемые. Третий шаг — установить требуемый вектор прерывания. В-четвертых, таблица перевода драйвера обновляется для обработки нового основного типа. Наконец, снова запустите драйвер устройства.

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

Привет, я cxuan, я написал четыре PDF-файла самостоятельно, а именно: Сводка основ Java, Сводка ядра HTTP, Основы компьютера, Сводка ядра операционной системы, я организовал их в PDF-файлы, вы можете подписаться на официальную учетную запись Java Builder, чтобы ответить на PDF для получения информации о качестве.