Подробное объяснение всего процесса ввода/вывода операционной системы

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

В нашей предыдущей статье упоминались три абстракции операционных систем, которыеПроцессы, адресные пространства и файлыКроме того, операционная система также управляет всеми устройствами ввода-вывода. Операционная система должна сообщать устройству发送命令,捕捉中断и处理错误. Он также должен обеспечивать простой в использовании интерфейс между устройством и остальной частью операционной системы. Операционная системаКак управлять вводом-выводомнаш следующий фокус.

Разные люди по-разному понимают аппаратное обеспечение ввода-вывода. Для инженеров-электриков оборудование ввода-вывода — это микросхемы, провода, источники питания и другие физические устройства, из которых состоит оборудование. А ввод-вывод в глазах наших программистов — это то, что аппаратное обеспечение предоставляет программному обеспечению.接口, такие как команды, полученные аппаратным обеспечением, выполненные операции и сообщения об ошибках. Мы фокусируемся на том, как запрограммировано оборудование, а не на том, как оно работает.

устройство ввода/вывода

Что такое устройство ввода/вывода? Устройства ввода-вывода, также известные как устройства ввода-вывода, представляют собой внешнее оборудование, которое люди используют для связи с компьютерами. устройства ввода/вывода, способные отправлять发送数据(输出)С компьютера接收数据(输入).

I/O 设备(I/O devices)Можно разделить на два типа:块设备(block devices)и字符设备(character devices).

блочное устройство

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

Блочные устройства обычно требуют меньше контактов, чем символьные устройства.

Недостатки блочных устройств

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

символьное устройство

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

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

контроллер устройства

Прежде всего, вам нужно понять концепцию контроллера устройства.

Контроллер устройства — это система, которая обрабатывает сигналы, поступающие и исходящие от ЦП. Устройство подключается к компьютеру с помощью вилки и розетки, а розетка подключается к контроллеру устройства. Контроллер устройства получает данные от подключенных устройств и сохраняет их в特殊目的寄存器(special purpose registers)То есть в локальном буфере.

Регистры специального назначения, как следует из названия, предназначены только для одной задачи. Например, регистры cs, ds, gs и другие сегментные регистры являются регистрами специального назначения, поскольку они существуют для хранения номеров сегментов. eax, ecx и т. д. являются регистрами общего назначения, потому что вы можете использовать их без ограничений. Например, вы не можете переместить ds, но можете переместить eax, ebx.

Регистры общего назначения, такие как: eax, ecx, edx, ebx, esi, edi, ebp, esp

Регистры специального назначения, такие как: cs, ds, ss, es, fs, gs, eip, flag

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

Устройства ввода-вывода обычно机械组件(mechanical component)и电子组件(electronic component)составляют. Электронные компоненты называются设备控制器(device controller)или适配器(adapter).在个人计算机上,它通常采用可插入(PCIe)扩展插槽на материнской плате в виде чипа или печатной цепи.

Механическое устройство само по себе, и его состав следующий

На плате контроллера обычно есть разъем, в который можно подключить кабель, идущий к самому устройству, многие контроллеры могут управлять 2, 4 настройками или 8 одного устройства.

Интерфейс между контроллером и устройством обычно представляет собой интерфейс низкого уровня. Например, диск может быть отформатирован с 2 000 000 секторов по 512 байт на дорожку. Однако на самом деле вытесняется последовательный битовый поток из前导符(preamble)start, затем 4096 бит в секторе и, наконец,校验和илиECC(错误码,Error-Correcting Code).前导符是在对磁盘进行格式化的时候写上去的,它包括柱面数和扇区号,扇区大小以及类似的数据,此外还包含同步信息。

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

Ввод/вывод с отображением памяти

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

контролировать寄存器, многие устройства будут иметь数据缓冲区(data buffer), чтобы система могла читать и писать. Например, обычным способом отображения пикселя на экране является использование видеопамяти, которая по сути представляет собой просто буфер данных для программ и операционной системы, в который они могут записываться.

Итак, как процессор взаимодействует с регистром устройства и буфером данных устройства? Есть два дополнительных способа. Первый метод заключается в том, что каждому регистру управления присваивается единица.I/O 端口(I/O port)число, которое является 8-битным или 16-битным целым числом. Совокупность всех портов ввода-вывода формирует защищенное пространство портов ввода-вывода, так что обычные пользовательские программы не могут получить к нему доступ (только операционная система может). Используйте специальные инструкции ввода-вывода, такие как

IN REG,PORT

ЦП может прочитать содержимое управляющего регистра PORT и поместить результат в регистр ЦП REG. Точно так же используйте

OUT PORT,REG

CPU может записывать содержимое регистра REG в управляющий регистр. Большинство первых компьютеров, включая почти все мейнфреймы, такие как IBM 360 и все его преемники, работали именно так.

Регистр управления — это регистр процессора, который изменяет или управляет общим поведением ЦП или другого цифрового устройства. Общие задачи, выполняемые управляющими регистрами, включают управление прерываниями, переключение режимов адресации, управление пейджингом и управление сопроцессором.

В этой схеме адресное пространство памяти и адресное пространство ввода-вывода не совпадают, как показано на следующем рисунке.

инструкция

IN R0,4

и

MOV R0,4

Этот дизайн совершенно другой.Первый считывает содержимое порта ввода-вывода 4 и помещает его в R0, а второй считывает содержимое слова памяти 4 и помещает его в R0.. 4 в этих примерах представляют разные и несвязанные адресные пространства.

Второй метод был представлен PDP-11,

Что такое PDP-11?

будетВсе регистры управления отображаются на пространство памяти, как показано на рисунке ниже

内存映射的 I/Oспособ обмена данными и инструкциями между ЦП и подключенными к нему периферийными устройствами таким образом, что процессор и устройство ввода-вывода используют одни и те же内存位置память, т. е. процессоры и устройства ввода-вывода отображаются с использованием адресов памяти.

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

Ниже приведен гибридный подход.

Этот подход имеет буферы данных с вводом-выводом, отображаемым в память, в то время как управляющие регистры имеют отдельные порты ввода-вывода. x86 использует эту архитектуру. В совместимых с IBM PC, помимо портов ввода-вывода от 0 до 64K-1, адреса памяти от 640K до 1M-1 зарезервированы для буферов данных устройства.

Как работают эти схемы? Когда ЦП хочет прочитать слово, будь то из памяти или из порта ввода / вывода, он помещает требуемый адрес на адресной линии шины, а затем вызовов на линии управления шина. ОдинREADСигнал. Имеется также вторая сигнальная линия, показывающая, требуется ли пространство ввода/вывода или место в памяти. Если это область памяти, память ответит на запрос. В случае пространства ввода-вывода устройство ввода-вывода ответит на запрос. Если имеется только пространство памяти, то каждый модуль памяти и каждое устройство ввода/вывода будут сравнивать адресную строку с диапазоном адресов, который они обслуживают. Если адрес попадает в этот диапазон, он ответит на запрос. Совершенно невозможно, чтобы адреса были назначены как памяти, так и устройствам ввода-вывода, поэтому не возникает двусмысленности и конфликта.

Преимущества и недостатки ввода-вывода с отображением памяти

Эти две схемы адресации контроллеров имеют разные преимущества и недостатки. Давайте сначала рассмотрим преимущества ввода-вывода с отображением памяти.

  • Во-первых, если для чтения и записи регистров управления устройством требуются специальные инструкции ввода-вывода, то для доступа к этим регистрам требуется ассемблерный код, поскольку нет реализации на C или C++.INиOUTметод обучения. Вызов такой процедуры увеличивает нагрузку на ввод-вывод. В отображении памяти управляющие регистры — это просто переменные в памяти, к которым можно обращаться так же, как к любой другой переменной в C.
  • Во-вторых, для ввода-вывода с отображением в память не требуется никакого специального механизма защиты, чтобы предотвратить выполнение пользовательскими процессами операций ввода-вывода. Операционная система должна следить за тем, чтобы адресное пространство контрольного регистра не помещалось в виртуальный адрес пользователя.
  • В-третьих, для ввода-вывода с отображением в память каждая инструкция, которая может ссылаться на память, может также ссылаться на управляющие регистры для удобства обращения.

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

Во-вторых, если имеется только одно адресное пространство, то все内存模块(memory modules)И все устройства ввода-вывода должны проверять все ссылки на память, чтобы определить, кто отвечает.

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

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

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

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

Эта шина предназначена для оптимизации скорости доступа к памяти, а системы x86 также могут иметь несколько шин (память, PCIe, SCSI и USB). Как показано ниже

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

Второй дизайн заключается в том, чтобы поставить探查设备, обходя все адреса, потенциально указывающие на интересующее устройство ввода-вывода. Проблема здесь в том, что устройство ввода-вывода может быть не в состоянии обрабатывать запросы так же быстро, как память.

Третий возможный вариант — отфильтровать адреса в контроллере памяти, который соответствует изображенному на диаграмме выше. В этом случае микросхема контроллера памяти содержит регистры диапазона, которые предварительно загружаются во время загрузки. Недостатком такой схемы является необходимость определять, какие адреса памяти не являются реальными адресами памяти во время загрузки. Таким образом, у каждого дизайна есть аргументы «за» и «против», поэтому компромиссы неизбежны.

прямой доступ к памяти

Независимо от того, имеет ли ЦП ввод-вывод с отображением памяти, ему необходимо обращаться к контроллерам устройств, чтобы обмениваться с ними данными. ЦП может запрашивать данные по одному байту за раз от контроллера ввода-вывода, но это приведет к пустой трате времени ЦП, поэтому метод, называемый直接内存访问(Direct Memory Access)план. Для простоты предположим, что ЦП получает доступ ко всем устройствам и памяти через единую системную шину, которая соединяет ЦП, память и устройства ввода-вывода, как показано на рисунке ниже.

Современные операционные системы на самом деле сложнее, но принцип тот же. Если оборудование имеетDMA 控制器, то операционная система может использовать только DMA. Иногда этот контроллер интегрируется в контроллеры дисков и другие контроллеры, но такая конструкция требует отдельного контроллера прямого доступа к памяти на каждом устройстве. Один контроллер прямого доступа к памяти может использоваться для передачи на несколько устройств, часто одновременно.

Независимо от физического адреса DMA-контроллера он может обращаться к системной шине независимо от ЦП, как показано на рисунке выше. Он содержит несколько регистров, которые могут быть прочитаны и записаны ЦП, включая регистр адреса памяти, регистр счетчика байтов и один или несколько управляющих регистров. Регистр управления определяетИспользуемый порт ввода / вывода, направление передачи (чтение из или напишите в устройство ввода / вывода), блок передачи (байт за один раз или слово), а слова, которые будут переданы в номере раздела пакета..

Чтобы объяснить, как работает DMA, давайте сначала посмотрим, как работает чтение с диска без DMA.

  • Во-первых, контроллер от磁盘驱动器Блок (один или несколько секторов) считывается последовательно, бит за битом, пока весь блок информации не будет помещен во внутренний буфер контроллера.
  • читать校验和чтобы не было ошибок чтения. Затем контроллер генерирует прерывание, и когда операционная система начинает работать, она многократно считывает блок информации по одному байту или слову из буфера контроллера и сохраняет его в памяти.

Как работает прямой доступ к памяти

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

Контроллер прямого доступа к памяти выдает读请求Второй шаг — инициировать передачу DMA на дисковый контроллер. Этот запрос на чтение такой же, как и любой другой запрос на чтение, контроллер диска не знает и не заботится о том, исходит ли он от ЦП или от контроллера DMA. Обычно адрес памяти, который нужно записать, находится на адресной линии шины, поэтому, когда контроллер диска переходит к сопоставлению со следующим словом, он знает, куда записать это слово. Запись в память — это еще один цикл шины, который является третьим шагом. Когда операция записи завершена, контроллер диска отправляет по шине сигнал подтверждения контроллеру прямого доступа к памяти, что является четвертым шагом.

Затем контроллер DMA увеличивает адрес памяти и уменьшает количество байтов. Если количество байтов все еще больше 0, шаги 2–4 повторяются до тех пор, пока счетчик байтов не станет равным 0. В этот момент контроллер DMA прервет ЦП и сообщит ему, что передача завершена. Когда ОС начинает работать, она не копирует блок диска в память, потому что он уже там.

Сложность различных контроллеров прямого доступа к памяти сильно различается. Простейший контроллер прямого доступа к памяти обрабатывает одну передачу за раз, как описано выше. Более сложная ситуация заключается в том, что одновременно обрабатывается множество передач, и такой контроллер имеет внутри несколько наборов регистров, по одному набору на канал. После передачи каждого слова контроллер DMA решает, какое устройство обслуживать следующим. Контроллер прямого доступа к памяти может быть настроен на использование轮询算法Или также возможно иметь приоритетное планирование и проектирование, чтобы позволить некоторым устройствам получать больше ухода, чем другие устройства. Если есть метод для различения четкого сигнала ответа, он может одновременно множество ожидающих запросов для различного контроллера устройства.

Многие автобусы могут работать в двух режимах:Слово в режиме времени и в блочном режиме. Некоторые контроллеры прямого доступа к памяти также могут работать в обоих направлениях. В предыдущем режиме DMA-контроллер запросил передачу слова и получил его. Если процессор хочет использовать шину, он должен ждать. Устройство может проникнуть и украсть цикл шины у ЦП, немного задержав ЦП. Этот механизм называется周期窃取(cycle stealing).

В блочном режиме контроллер DMA приказывает устройству захватить шину, выполнить серию передач и затем освободить шину. Форма этой операции называется突发模式(burst mode). Этот режим более эффективен, чем циклический захват, потому что захват шины требует времени, а стоимость захвата шины заключается в том, что несколько слов могут быть переданы одновременно. Недостатком является то, что если в это время происходит длинная пакетная передача, она может надолго заблокировать ЦП и другие устройства.

В этой модели мы обсуждали иногда飞越模式(fly-by mode)Контроллер DMA контроллера позволяет контроллеру устройства передавать данные непосредственно в память. Другой режим, используемый некоторыми контроллерами DMA, заключается в том, чтобы контроллер устройства отправлял слово в контроллер DMA, который затем выдает второй запрос на шину, чтобы написать слово, где это можно записать. С помощью этой схемы каждое перенесенное слово требует дополнительного цикла шины, но более гибкий, потому что он также может выполнить копию устройства к устройству или даже копию памяти к памяти (считывая память заранее, затем запись в память ).

Большинство контроллеров прямого доступа к памяти используют для передачи физические адреса. Использование физического адреса требует от операционной системы преобразования виртуального адреса целевого буфера памяти в физический адрес и записи этого физического адреса в адресный регистр контроллера DMA. Другое решение состоит в том, что некоторые контроллеры DMA записывают виртуальные адреса в контроллер DMA. Затем контроллер DMA должен использовать MMU для завершения преобразования виртуального в физическое. Помещение виртуальных адресов на шину возможно только в том случае, если MMU является частью памяти, а не частью ЦП.

Пересмотрите прерывание

В архитектуре персонального компьютера структура прерывания будет выглядеть так:

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

Если перед прерыванием не заблокирована никакая другая операция прерывания, контроллер прерывания немедленно обработает прерывание, если перед прерыванием есть другие операции прерывания.正在执行, или какое-то другое устройство излучает уровень更高Если сигнал прерывания получен, устройство временно не будет его обрабатывать. В этом случае устройство будет продолжать выдавать прерывания на шине до тех пор, пока оно не будет обслужено ЦП.

Для обработки прерываний контроллер прерываний помещает в адресную строку число, указывающее, с каким устройством должно быть связано, и выдает сигнал прерывания ЦП. Сигнал прерывания заставляет ЦП остановить то, что он делает в данный момент, и начать делать что-то другое. В адресной строке будет указатель中断向量表Индекс для получения счетчика следующей программы. Этот вновь полученный программный счетчик также указывает на то, что программа вот-вот начнется, и укажет на начало программы. В целом ловушки и прерывания используют один и тот же механизм с этой точки зрения и часто используют один и тот же вектор прерывания. Местоположение вектора прерывания может быть жестко привязано к машине, или оно может находиться где угодно в памяти, на его источник указывает регистр ЦП.

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

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

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

Второй способ заключается в сохранении информации в стеке, что и используется большинством процессоров. Однако с этим подходом также возникает проблема, поскольку используемый стек не определен, если используется当前堆栈, скорее всего это стек пользовательского процесса. Указатель стека даже не является допустимым, поэтому, когда аппаратное обеспечение пытается записать адрес, на который он указывает, это вызовет фатальную ошибку. Если вы используете стек ядра, где указатель стека допустим и указывает на фиксированную страницу, шансы на это, вероятно, выше. Однако переключение в режим ядра требует переключения контекста MMU и может привести к аннулированию кеша или TLB. Статическая или динамическая перезагрузка этих вещей увеличивает время обработки прерываний и тратит процессорное время.

Точные и неточные прерывания

Еще одна проблема: массовое внедрение современных процессоров.流水线и иногда超标量(内部并行). В некоторых старых системах после выполнения каждой инструкции микропрограмма или аппаратное обеспечение проверяют наличие необработанных прерываний. Если он присутствует, счетчик программ и PSW будут помещены в стек для запуска последовательности прерываний. После прерывания выполнения программы старый PSW и счетчик программ извлекаются из стека, чтобы возобновить предыдущий процесс.

Ниже представлена ​​модель конвейера

Что происходит, когда прерывание происходит, когда трубопровод заполнен? Многие инструкции находятся на различных этапах выполнения, и когда происходит прерывание, значение счетчика программы может не правильно отразить границы между инструкциями, которые были выполнены и инструкции, которые еще не были выполнены. Фактически, многие инструкции могут быть частично выполнены, причем разные инструкции будут выполнены в большей или меньшей степени. В этом случае счетчик программы, скорее всего, будет отражать адрес следующей инструкции, которая будет выявлена ​​и толкаться в трубопровод, а не адрес инструкции, который только что был обработан блоком выполнения.

В суперкаларском дизайне, это может быть даже хуже

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

Прерывание, которое поддерживает машину в хорошем состоянии, называется精确中断(precise interrupt). Такое прерывание имеет четыре свойства:

  • ПК (счетчик программ) хранится в известном месте
  • Все инструкции, предшествующие инструкции, на которую указывает ПК, были полностью выполнены.
  • Все инструкции после инструкции, на которую указывает ПК, не выполняются
  • Состояние выполнения инструкции, указанное на ПК, известно

Прерывания, не отвечающие вышеуказанным требованиям, называются不精确中断(imprecise interrupt), неточные прерывания - это головная боль. На изображении выше показано явление неточных прерываний. Время выполнения и завершение инструкций являются неопределенными и трудоемкими для восстановления.

Принцип программного обеспечения ввода-вывода

Программная цель ввода/вывода

Независимость устройства

Теперь давайте обратимся к изучению программного обеспечения ввода-вывода. Очень важная цель программного обеспечения ввода / вывода является设备独立性(device independence). Что ты имеешь в виду? это означаетМы можем писать приложения, которые обращаются к любому устройству без указания конкретного устройства заранее.. Например, если вы пишете приложение, которое может читать файлы с устройства, приложение может читать с жесткого диска, DVD или USB без необходимости настраивать приложение для каждого устройства. Это фактически отражает концепцию независимости устройства.

Например, вы можете ввести следующую команду

sort 输入 输出

Тогда выше输入может получать с любого типа диска или клавиатуры, и输出Его можно записать на диск или экран любого типа.

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

Индикатор, тесно связанный с независимостью устройства,统一命名(uniform naming). Кодовое имя устройства должно быть целым числом или строкой, оно не должно зависеть от конкретного устройства. В UNIX все диски могут быть интегрированы в файловую систему, поэтому пользователям не нужно запоминать конкретное имя каждого устройства, достаточно просто запомнить соответствующий путь.lsПодождите, пока инструкции не найдут конкретное место интеграции. Например, если USB-диск подключен к/usr/cxuan/backupвниз, затем вы копируете файл в/usr/cxuan/backup/deviceЭто эквивалентно копированию файла на диск Таким образом, запись файла на любой диск эквивалентна выводу файла по указанному пути.

обработка ошибок

Кроме设备独立性Кроме того, второй важной целью, достигаемой программным обеспечением ввода/вывода, является错误处理(error handling). Обычно ошибки должны передаваться硬件уровень, с которым нужно иметь дело. Если контроллер устройства обнаружит ошибку чтения, он попытается ее исправить. Если контроллер устройства не может справиться с проблемой, ее должен решить драйвер устройства, драйвер устройства снова попытается выполнить операцию чтения, многие ошибки являются случайными, и если драйвер устройства не может справиться с ошибкой, ошибка будет аппаратный уровень (верхний уровень) обрабатывает обработку.Во многих случаях верхнему уровню не нужно знать, как нижний уровень решает ошибку. Это очень похоже на то, как менеджер проекта не должен сообщать боссу о каждом решении, программист не должен указывать менеджеру проекта, как писать каждую строку кода. Эта трактовка недостаточно прозрачна.

Синхронные и асинхронные передачи

Третья цель, достигаемая программным обеспечением ввода/вывода,同步(synchronous)и异步(asynchronous,即中断驱动)коробка передач. Давайте сначала поговорим о синхронном и асинхронном.

В изохронной передаче данные обычно отправляются в блоки или кадрах. Отправитель и приемник должны иметь до передачи данных同步时钟. При асинхронной передаче данные обычно отправляются в виде байтов или символов.Асинхронная передача не требует синхронных часов, но добавляет данные к данным перед передачей.奇偶校验位. Ниже приведены основные различия между синхронным и асинхронным

Вернемся к теме. самый物理IO(physical I/O)является асинхронным. ЦП в физическом вводе-выводе очень умен.После завершения передачи ЦП, он переключится на другие вещи.Он связывается с прерыванием.После возникновения прерывания ЦП вернется к передаче.

Существует два типа ввода-вывода: физический ввод-вывод и逻辑I/O(Logical I/O).

Физический ввод-вывод обычно представляет собой фактическую выборку данных с устройства хранения, такого как диск. Логический ввод-вывод извлекает данные в память (блоки, буферы).

буфер

Последняя проблема с программным обеспечением ввода/вывода缓冲(buffering). Обычно данные, отправленные с одного устройства, не поступают напрямую на последнее устройство. Это будет достигнуто после ряда проверок, проверок, буферизации и других операций. Например, пакет, отправленный из сети, пройдет серию проверок, прежде чем достигнет буфера, тем самым устранив скорость заполнения буфера и перегрузку буфера.

общий и эксклюзивный

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

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

  • Используйте контроль программы ввода / вывода
  • Использование ввода-вывода, управляемого прерываниями
  • Управляйте вводом/выводом с помощью прямого доступа к памяти

Использование ввода-вывода программного управления

Использование программно-управляемого ввода-вывода также известно как可编程I/O, который относится к передаче данных, инициированной ЦП под управлением программного обеспечения драйвера для доступа к регистрам или другой памяти на устройстве. ЦП выдает команды, а затем ожидает завершения операции ввода-вывода. Поскольку процессоры намного быстрее, чем модули ввода-вывода, проблема с программируемым вводом-выводом заключается в том, что процессору приходится долго ждать обработки результатов. ЦП будет использовать轮询(polling)или忙等(busy waiting)Кстати, в результате сильно падает производительность всей системы. Программируемый ввод-вывод очень прост, и если время ожидания очень короткое, программируемый ввод-вывод — хороший способ. Программируемый ввод-вывод выполняет следующие операции.

  • CPU запрашивает операции ввода-вывода
  • Ответ выполнения модуля ввода/вывода
  • Биты состояния установки модуля ввода/вывода
  • CPU периодически проверяет биты состояния
  • Ввод/вывод не уведомляет ЦП напрямую о завершении операции.
  • Ввод/вывод CPU не прерывается
  • ЦП может дождаться или вернуться во время последующего процесса.

Использование ввода-вывода, управляемого прерываниями

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

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

  • ЦП для операции чтения
  • Устройства ввода-вывода получают данные от периферийных устройств, в то время как ЦП занимается другими делами.
  • Устройство I / O Уведомление о прерывании CPU
  • ЦП запрашивает данные
  • Модули ввода/вывода передают данные

Итак, что нам нужно сейчас решить, так это эффективность передачи данных между ЦП и модулями ввода/вывода.

Ввод/вывод с использованием прямого доступа к памяти

Китайское название DMA — прямой доступ к памяти, что означает, что ЦП предоставляет модулю ввода-вывода разрешение на чтение или запись в память без участия ЦП. То есть DMA может не требовать участия CPU. Этим процессом управляет микросхема, называемая DMA Controller (DMAC). Поскольку устройства DMA могут передавать данные непосредственно между памятью, а не использовать ЦП в качестве посредника, это может уменьшить перегрузку шины. DMA улучшает параллелизм системы, позволяя ЦП выполнять задачи, в то время как система DMA передает данные по системной шине и шине памяти.

Иерархия ввода/вывода

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

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

Ниже приведена еще одна диаграмма, показывающая все уровни программной системы ввода/вывода и их основные функции.

Давайте подробно обсудим приведенную выше иерархию.

обработчик прерывания

В компьютерных системах перебои случаются постоянно, как и женский характер, и перебои часто неприятны. Обработчик прерывания также известен как中断服务程序илиISR(Interrupt Service Routines)Какой слой ближе всего к оборудованию. Желевые обработчики прерываний - это прерывания, генерируемые аппаратными прерываниями, прерываниями программного обеспечения или исключениями программного обеспечения для реализации переходов между драйверами устройства или защищенными режимами работы (такие как системные вызовы).

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

  • Реализация семафора: использование на семафореupуведомлять;
  • Реализация монитора: выполнение условных переменных в монитореsignalдействовать
  • Также бывают случаи, когда некоторые сообщения отправляются

В любом случае нужно восстановить и запустить заблокированный обработчик прерываний.

Есть много видов схем обработки прерываний, следующее является "Руководство разработчика системы ARM

Designing and Optimizing System Software》 Некоторые из перечисленных программ

  • 非嵌套Обработчик прерывания обрабатывает каждое прерывание по порядку, а невложенный обработчик прерывания также является простейшим обработчиком прерывания.
  • 嵌套Обработчик прерываний для нескольких прерываний без назначения приоритетов
  • 可重入Обработчик прерывания может использовать приоритет для обработки нескольких прерываний.
  • 简单优先级Обработчики прерываний обрабатывают простые прерывания
  • 标准优先级Обработчики прерываний могут обрабатывать прерывания с более высоким приоритетом за меньшее время, чем обработчики прерываний с более низким приоритетом.
  • 高优先级Обработчики прерываний могут обрабатывать задачи с более высоким приоритетом в течение короткого периода времени и переходить непосредственно к определенным процедурам обслуживания.
  • 优先级分组Обработчики прерываний могут обрабатывать задачи прерывания с разными уровнями приоритета.

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

  • Сохранить все регистры, не сохраненные аппаратным прерыванием
  • Установите контекст для процедуры обслуживания прерывания, возможно, включая установкуTLB,MMUи таблица страниц, если вы не понимаете эти три понятия, обратитесь к другой статье
  • Настройка стека для процедуры обслуживания прерывания
  • Отвечать на контроллер прерываний и продолжать реагировать на прерывания, если нет централизованного контроллера прерываний.
  • скопируйте регистр, откуда он был сохранен, в таблицу процессов
  • Запускает процедуру обслуживания прерывания, которая извлекает информацию из регистров контроллера устройства, выдавшего прерывание.
  • Операционная система выберет соответствующий процесс для запуска. Если прерывание приводит к готовности некоторых процессов с более высоким приоритетом, выберите запуск этих процессов с более высоким приоритетом.
  • Установите контекст MMU для процесса, а также может потребоваться TLB, в зависимости от реальной ситуации.
  • Загрузите регистры процесса, включая регистр PSW.
  • запустить новый процесс

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

драйвер устройства

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

Таким образом, каждое устройство ввода-вывода, подключенное к компьютеру, должно иметь некоторый специфичный для устройства код для управления им, например, контроллер мыши должен принимать команды от мыши, чтобы указать, куда двигаться дальше, а контроллер клавиатуры должен знать, какая клавиша нажимается и т. д. Эти коды, обеспечивающие процесс преобразования устройства ввода-вывода в контроллер устройства, называются设备驱动程序(Device driver).

Чтобы получить доступ к оборудованию устройства, это фактически означает, что драйвер устройства обычно является частью ядра операционной системы, по крайней мере, в современных архитектурах. Но можно и построить用户空间Драйвер устройства выполняет операции чтения и записи через системные вызовы. Это позволяет избежать проблемы, когда неисправный драйвер может мешать работе ядра, вызывая сбой. Таким образом, реализация драйверов устройств в пользовательских элементах управления является очень полезной мерой стабильности системы.MINIX 3Вот что он делает. Ниже приведен процесс вызова MINI 3.

Однако для большинства настольных операционных систем драйверы должны запускаться в ядре.

Операционная система обычно классифицирует драйверы как字符设备и块设备, мы также ввели выше

В системах UNIX операционная система является二进制程序, содержит все драйвера, которые необходимо скомпилировать в него.Если вы хотите добавить новое устройство в UNIX, вам нужно перекомпилировать ядро ​​и установить новый драйвер в бинарник.

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

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

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

Как только команды выданы, контроллер устройства начинает записывать их в память контроллера.设备寄存器. После того, как каждая команда записана в контроллер, проверяется, принял ли контроллер команду и готов ли он принять следующую команду. Устройство общего управления выдаст ряд команд, которые называются指令序列, контроллер устройства по очереди будет проверять, принята ли каждая команда и может ли быть принята следующая команда, пока не будут выданы все последовательности.

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

Основная ответственность за главное устройство является контроллеромУправление одним или несколькими устройствами ввода-вывода для реализации обмена данными между устройствами ввода-вывода и компьютерами.

Контроллер устройства получает инструкции, отправленные ЦП, а затем достигает цели управления оборудованием.

Контроллер устройства представляет собой可编址Когда он управляет только одним устройством, он имеет только один уникальный адрес устройства; если контроллер устройства управляет несколькими подключаемыми устройствами, он должен содержать несколько адресов устройств, и каждый адрес устройства соответствует устройству.

Существует два основных типа контроллеров устройств: символьные устройства и блочные устройства.

Основные функции контроллера устройства следующие:

  • Получение и распознавание команд: Контроллер устройства может принимать команды от ЦП и распознавать их. Внутри контроллера устройства также будут регистры для хранения инструкций и параметров.

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

  • Распознавание адресов: Каждое аппаратное устройство имеет свой собственный адрес, и контроллер устройства может распознавать эти разные адреса для достижения цели управления аппаратным обеспечением.Кроме того, чтобы ЦП мог записывать или считывать данные в регистры, эти регистры должны be Имеет уникальный адрес.

  • Обнаружение ошибок: Контроллер устройства также имеет функцию обнаружения данных, передаваемых устройством.

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

Драйвер устройства должен быть可重入, потому что драйвер устройства блокируется и выходит из спящего режима, а затем снова блокируется. Драйверам не разрешено выполнять системные вызовы, но обычно им необходимо взаимодействовать с остальной частью ядра.

Аппаратно-независимое программное обеспечение ввода/вывода

Существует два типа программного обеспечения ввода/вывода: одно основано на конкретном устройстве, которое мы представили выше, а другое设备无关性Да, независимость от устройства означает, что не требуется никакого конкретного устройства. Граница между драйверами устройств и независимым от устройств программным обеспечением зависит от конкретной системы. Показанные ниже функции реализуются программным обеспечением, не зависящим от устройства.

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

буфер

无论是对于块设备还是字符设备来说,缓冲都是一个非常重要的考量标准。 Следующее изADSL(调制解调器)Процесс чтения данных, модем — это устройство, которое мы используем для работы в сети.

Пользовательская программа вызывает системный вызов чтения, чтобы заблокировать пользовательский процесс в ожидании поступления символов, что является способом обработки входящих символов. Каждый входящий символ вызывает перерыв.中断服务程序Персонажи отдаются пользовательскому процессу и разблокируются. После того, как символы предоставлены программе пользователя, процесс будет считывать другие символы и продолжать блокировать.Эта модель выглядит следующим образом.

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

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

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

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

Когда буфер в ядре вот-вот заполнится, страница в пространстве пользователя будет загружена в память, а затем буфер в пространстве ядра будет скопирован в буфер в пространстве пользователя.Эта схема также сталкивается с проблемой что если пользовательское пространство Страница подкачивается в память.В это время буфер в пространстве ядра заполнен.В это время все еще приходят новые символы.Что мне делать в это время? Поскольку буфер заполнен, в нем нет места для хранения новых символов.

Очень простой способ - настроить другой буфер, после заполнения первого буфера, до того, как буфер опустеет, использовать второй буфер, решение следующее

Когда второй буфер также заполнен, он также копирует данные в пользовательское пространство, а затем первый буфер используется для приема новых символов. Эта конструкция с двумя буферами называется双缓冲(double buffering).

Другой формой буферизации является循环缓冲(circular buffer). Он состоит из области памяти и двух указателей. Указатель указывает на следующее свободное слово, сюда можно поместить новые данные. Другой указатель указывает на первое слово, которое не было удалено в буфере. Во многих случаях аппаратное обеспечение перемещает первый указатель при добавлении новых данных, а операционная система перемещает второй указатель при удалении и обработке бесполезных данных. Когда два указателя достигнут вершины, они снова вернутся вниз.

Буферы также важны для вывода. Описание выхода аналогично входу

Технология амортизации широко используется, но и у нее есть недостатки. Если данные буферизируются слишком много раз, это повлияет на производительность. Рассмотрим, например, следующую ситуацию,

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

обработка ошибок

При вводе-выводе ошибки — совершенно нормальная ситуация. При возникновении ошибок операционная система должна обрабатывать эти ошибки в максимально возможной степени. Некоторые ошибки обрабатываются только определенным устройством, а некоторые — фреймворком, и эти ошибки не связаны с конкретным устройством.

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

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

Выделите и освободите

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

Примечание. Существует много способов реализовать блокировку, например блокирующие очереди и т. д.

независимый от устройства блок

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

Программное обеспечение ввода-вывода для пользовательского пространства

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

тарелка

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

дисковое оборудование

Есть много типов дисков. Самая простая конструкция из них磁盘(magnetic hard disks), также называетсяhard disk,HDDЖдать. Диск обычно сочетается с головкой, установленной на магнитной руке, который читает или записывает данные на диск, поэтому диск читает и быстро пишет. На диске данные доступны случайным образом, что означает, что данные могут быть доступны в любом порядке.存储и检索Один блок данных, так что вы можете разместить диск в любом месте для головы, чтобы прочитать диск非易失性Оборудование, даже если он включен, он может храниться навсегда.

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

диск

Для организации и извлечения данных диски организованы в определенные структуры, которыеДорожки, сектора и цилиндры

Каждый диск состоит из бесчисленных концентрических кругов, похожих на годичные кольца деревьев.

Некоторые фотографии годичных колец нужно скачивать за отдельную плату.

Диск организован в виде цилиндрической поверхности, каждый диск связан, и каждый цилиндр содержит несколько дорожек, каждая из которых состоит из нескольких секторов. На дискете примерно 8 - 32 сектора, на жестком диске количество секторов на каждой дорожке может достигать сотен, а на магнитной головке примерно 1 - 16.

Для дисковых драйверов очень важной особенностью является то, может ли контроллер одновременно управлять двумя или более дисководами для адресации дорожек, т.е.重叠寻道(overlapped seek). Для контроллера он может управлять драйвером диска для завершения операции поиска, в то время как другие драйверы ждут окончания поиска. Контроллер также может читать и записывать на один драйвер, в то время как другой диск выполняет поиск, но контроллер гибких дисков не может читать и записывать на оба диска.

RAID

RAID называется磁盘冗余阵列, именуемый磁盘阵列. Использование технологии виртуализации для объединения нескольких жестких дисков в одну или несколько групп дисковых массивов позволяет повысить производительность или избыточность данных.

RAID имеет разные уровни

  • RAID 0 — чередующийся дисковый массив без отказоустойчивости
  • RAID 1 — зеркалирование и дуплекс
  • RAID 2 — код исправления ошибок в памяти
  • RAID 3 — четность с чередованием битов
  • RAID 4 — контроль четности с чередованием блоков
  • RAID 5 — распределенная четность с чередованием блоков
  • RAID 6 — резервирование P+Q

формат диска

Диск состоит из стопки алюминиевых, сплавных или стеклянных пластин, и при первом создании диска информация отсутствует. Диски должны пройти, прежде чем их можно будет использовать低级格式化(low-levvel format), Ниже приведен формат сектора

Преамбула эквивалентна указанию начальной позиции сектора, обычно начиная с битовой комбинации, и преамбула также включает柱面号,扇区号Дождитесь другой информации. Сразу за преамбулой следует область данных, размер которой определяется низкоуровневым форматировщиком. Большинство дисков используют сектора размером 512 байт. За областью данных следует ECC, полное имя ECCerror correction code,数据纠错码, который отличается от обычного обнаружения ошибок, ECC также может использоваться для восстановления после ошибок чтения. Размер этапа ECC реализуется разными производителями дисков. Критерии проектирования для размера ECC зависят отРазработчики готовы пожертвовать объемом дискового пространства для повышения надежностии сложность ECC, с которой может справиться программа. Обычно ECC является 16-битным, кроме того, жесткие диски обычно имеют определенное количество запасных секторов для замены секторов с производственным браком.

Позиция каждого сектора 0 после низкоуровневого форматирования такая же, как у предыдущей дорожки偏移,Как показано ниже

Этот метод также называется柱面斜进(cylinder skew), причиной такого подхода является повышение производительности программы. Подумайте об этом таким образом, диск будет считывать информацию о секторе через магнитную головку в процессе вращения.После чтения внутреннего круга данных сектора, магнитная головка выполнит операцию адресации к внешней дорожке.Пока операция адресации находится в состоянии прогресс, диск продолжает вращение, если этот метод не принят, магнитная головка может быть просто обращена наружу, а 0-й сектор уже повернул магнитную головку, поэтому его нужно повернуть один раз, чтобы дождаться его продолжения чтения.Это может быть устранено путем наклона цилиндра вперед.проблема.

Величина рампы цилиндра зависит от геометрии привода. Наклон цилиндра — это разность нулевых секторов двух соседних концентрических окружностей. Как показано ниже

Здесь следует обратить внимание на то, что наклонен не только цилиндр, но и магнитная головка.斜进(head skew), но наклон головы относительно небольшой.

Форматирование диска уменьшает емкость диска, которая определяется размером преамбулы, межсекторного промежутка и ECC, а также количеством зарезервированных запасных секторов.

Прежде чем диск будет использован, ему нужно пройти последний процесс, то есть выполнить его один раз для каждого раздела.高级格式化(high-level format), который устанавливает загрузочный блок, управление свободным хранилищем (с использованием растровых изображений или списков свободных мест), корневой каталог и пустую файловую систему. Этот шаг помещает код в запись таблицы разделов, чтобы указать, какую файловую систему использует раздел, поскольку многие операционные системы поддерживают несколько совместимых файловых систем. После этого шага система готова к процессу загрузки.

При включении питания сначала запускается BIOS, он считывает основную загрузочную запись и переходит к основной загрузочной записи. Затем загрузчик проверяет, какой раздел активен. Затем он читает из этого раздела启动扇区(boot sector)и запустить его. Загрузочный сектор содержит небольшую программу для загрузки большего загрузчика для поиска в файловой системе.系统内核(system kernel), то программа загружается в память и выполняется.

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

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

  • Основная загрузочная запись называется главным загрузочным сектором.
  • Загрузочная запись тома Загрузочная запись тома

Для дисков с разделами загрузочный сектор состоит из основной загрузочной записи;

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

Алгоритм планирования дискового манипулятора

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

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

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

Если драйвер диска получает по одному запросу за раз и выполняет запросы в том порядке, в котором они были получены, этот метод обработки先来先服务(First-Come, First-served, FCFS)Таким образом сложно оптимизировать время. Потому что каждый раз, когда он обрабатывается, независимо от порядка, можно ждать вращения диска в течение недели, прежде чем вы сможете продолжить чтение, в то время как другие цилиндры могут быть прочитаны немедленно, В этом случае каждый запрос также будет стоять в очереди. вверх. .

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

Улучшение алгоритма «первым пришел – первым обслужено» заключается в использовании最短路径优先(SSF)алгоритм, который описан ниже.

Если мы обращаемся к дорожке № 6, запросы на 11, 2, 4, 14, 8, 15, 3 происходят одновременно, если мы принимаем принцип «первым пришел — первым обслужен», как показано на следующем рисунке.

Мы можем рассчитать количество дисков, охватываемых плечом диска, как 5 + 9 + 2 + 10 + 6 + 7 + 12 = 51, что эквивалентно охвату дисков 51. Если мы сначала используем кратчайший путь, давайте вычислим составные диски.

![image-20200614184609291](/Users/mr.l/Library/Application Support/typora-user-images/image-20200614184609291.png)

Количество объединенных дисков равно 4 + 1 + 1 + 4 + 3 + 3 + 1 = 17, что экономит вдвое больше времени по сравнению с 51.

Тем не менее, кратчайший путь первый алгоритм не идеален, и есть еще проблемы с этим алгоритмом, то есть优先级проблема,

Вот прототип для справки, которым является лифт в нашей повседневной жизни.电梯算法(elevator algorithm)планирование для достижения противоречивых целей координации эффективности и справедливости. Лифт, как правило, продолжает двигаться в одном направлении до тех пор, пока в этом направлении не будет запроса, а затем меняет направление.

Алгоритм лифта должен поддерживать二进制位, который является текущим битом направления:UP(向上)илиDOWN(向下).当一个请求处理完成后,磁盘或电梯的驱动程序会检查该位,如果此位是 UP 位,磁盘臂或者电梯仓移到下一个更高跌未完成的请求。如果高位没有未完成的请求,则取相反方向。当方向位是DOWN, также есть запрос младшего разряда, и рычаг диска поворачивается в эту точку. Если его нет, то он просто останавливается и ждет.

Давайте возьмем пример для описания алгоритма лифта, Например, порядок, в котором обслуживается каждый цилиндр, 4, 7, 10, 14, 9, 6, 3, 1, тогда его блок-схема выглядит следующим образом.

Таким образом, количество досок, которые должен пересечь алгоритм лифта, равно 3 + 3 + 4 + 5 + 3 + 3 + 1 = 22.

Алгоритм лифта обычно уступает алгоритму SSF.

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

Здесь следует отметить, что когда цилиндр имеет несколько дорожек, последовательные запросы могут быть для разных дорожек.Этот вариант не требует затрат, поскольку головка выбора не требует перемещения рычага диска и нет задержки вращения.

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

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

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

обработка ошибок

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

Как правило, есть два способа борьбы с плохими блоками: один — это работа с ними в контроллере, другой — на уровне операционной системы.

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

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

Другой способ справиться с этим - переместить все сектора вверх на один сектор.

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

стабильное хранение

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

Мы ожидаем, что диски будут работать правильно, но это не так, но мы знаем, что дисковая подсистема имеет следующие характеристики: когда на нее отправляется команда записи, диск либо записывает данные правильно, либо что-то еще. , оставив существующие данные нетронутыми. Такая система называется稳定存储器(stable storage). Целью стабилизации памяти является обеспечение согласованности диска на всех затратах.

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

  • 稳定写(stable write)
  • 稳定读(stable read)
  • 崩溃恢复(crash recovery)

Стабильная запись означает, что блок сначала записывается, скажем, на диск 1, а затем считывается обратно для проверки правильности записи, если нет, то снова предпринимаются попытки записи и чтения до тех пор, пока не будет подтверждена правильность записи. Если все блоки записаны и не проверены правильно, блоки будут изменены для продолжения записи и чтения до тех пор, пока они не будут правильными. Независимо от того, сколько запасных блоков вы пытаетесь использовать, ваш диск 1 будет записываться и читаться с диска 2 только после того, как вы успешно запишете на него. Таким образом, мы эквивалентны записи на два диска.

Стабильное чтение означает сначала чтение с диска 1, если операция чтения выдает неверный ECC, затем повторите попытку чтения, если все операции чтения дают неверный ECC, затем чтение с диска 2. Таким образом, мы эквивалентны чтению с двух дисков.

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

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

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

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

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

  • Четвертый случай, когда сбой происходит, когда диск 1 пишет после записи диска 2, плохие блоки заменяются хорошими блоками во время восстановления, и окончательные значения обоих блоков актуальны.

  • В последнем случае сбой происходит после записи обоих дисков, и в этом случае проблем не возникает.

Любые оптимизации и улучшения в этом режиме возможны, но дорого, одно улучшение заключается в отслеживании записываемых блоков во время стабильной записи, чтобы после сбоя проверялся только один блок. сорт非易失性 RAMМожно сохранить данные после сбоя, но делать это не рекомендуется.

Часы

时钟(Clocks)также называется定时器(timers), часы/таймеры необходимы для любой системы программирования. Часы отвечают за поддержание времени, предотвращение того, чтобы процесс занимал процессорное время в течение длительного времени, и другие функции.时钟软件(clock software)Это также подход, управляемый устройством. Затем мы представим часы. Обычно сначала мы обсуждаем аппаратное обеспечение, а затем представляем программное обеспечение. Подход снизу вверх используется, чтобы сказать вам, что нижний уровень является наиболее важным.

аппаратные часы

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

  • Часы более простого типа подключаются к сети 110 В или 220 В так, чтобы каждый电压周期Будет сгенерировано прерывание, около 50 - 60 Гц. Эти часы доминировали в прошлом.
  • Далее часы кристально-генератором, счетчиками и регистрами, как показано схема

Эти часы называются可编程时钟, программируемые часы имеют два режима, один一键式(one-shot mode), когда часы запускаются, значение из памяти копируется в счетчик, а затем каждый импульс кварцевого генератора приводит счетчик к -1. Когда счетчик становится равным 0, генерируется прерывание и прекращается работа до тех пор, пока программа снова не покажет начало. Когда есть другой режим方波(square-wave mode)В этом режиме, когда счетчик становится равным 0 и генерируется прерывание, значение регистра хранения автоматически копируется в счетчик.Это периодическое прерывание называется тактовым циклом.

программное обеспечение для часов

Все, что делает аппаратное обеспечение часов, это генерирует прерывания с известными интервалами, а все остальное делает时钟软件В завершение, общая операционная система отличается, конкретная реализация программного обеспечения часов также отличается, но обычно включает следующие пункты.

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

мягкий таймер

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

Тогда вам нужен软定时器(soft timer)Прерывания избегаются, когда ядро ​​​​по какой-то причине работает, оно проверяет часы, чтобы увидеть, не истек ли программный таймер, прежде чем он вернется в пользовательскую среду. Если программный таймер истекает, выполнение запланированного события не должно переключаться в состояние ядра, поскольку оно уже находится в состоянии ядра. Таким образом, можно избежать частого переключения между режимом ядра и режимом пользователя, а также повысить эффективность работы программы.

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

  • системный вызов
  • TLB мисс
  • исключение ошибки страницы
  • Прерывание ввода-вывода
  • ЦП становится бездействующим

Я начал проект с открытым исходным кодом, который стал лучшим лучшим Javaer вGitHub.com/Next Day Picks/Не голоден…звезда.