что будет делать системное программное обеспечение, если процессор не генерирует прерывания? - PullRequest
3 голосов
/ 01 октября 2019

Вопрос, связанный с прерываниями

, если процессор не способен обслуживать прерывания, что должно сделать системное программное обеспечение, чтобы убедиться, что каждое нажатие клавиши клавиатуры было обнаружено, каждое движение мышибыл зарегистрирован, данные Ethernet (сети) были обработаны правильно, и файлы были успешно загружены в память?

Ответы [ 2 ]

4 голосов
/ 02 октября 2019

Если процессор не способен обслуживать прерывания, что нужно сделать системному программному обеспечению, чтобы убедиться, что каждое нажатие клавиши клавиатуры было обнаружено, каждое движение мыши было зарегистрировано, данные Ethernet (сети) были обработаныправильно, и файлы были успешно загружены в память?

Есть 2 способа сделать IO.

Асинхронный IO

Хороший способdo IO предназначен для того, чтобы ЦП попросил устройство выполнить IO, а затем разрешил ЦП выполнять другую работу (включая запуск других программ), пока не возникнет IRQ, чтобы сообщить ОС, что запрос IO завершен. Для компьютера с (например) 4 процессорами и 20 устройствами;это позволяет всем 4 процессорам и всем 20 устройствам выполнять полезную работу одновременно. Этот метод используется всеми современными ОС (включая современные «однозадачные» операционные системы).

В этом случае;без прерываний IRQ вам придется эмулировать их, проверяя завершение запроса ввода-вывода очень часто (например, возможно, вставьте вызов функции check_for_IO_completion() везде), где «как часто» является компромиссом между «производительностью устройства» (задержка, сколько времени можетпередать между выполнением запроса ввода-вывода и ОС, зная, что запрос ввода-вывода завершен и может запустить следующий запрос) и «производительность ЦП» (сколько времени ЦП тратится на все вызовы check_for_IO_completion()). Конечно (особенно если есть какая-либо защита - например, «пространство ядра», изолированное от «пространства пользователя»), нет хорошего компромисса - независимо от того, какую производительность вы жертвуете, вы не можете ожидать, что производительность будет такой жекак было бы, если бы использовались IRQ.

Синхронный ввод-вывод

Неправильный способ ввода-вывода состоит в том, что ЦПУ запрашивает у устройства выполнение ввода-вывода изатем постоянно опрашивайте это устройство до завершения ввода-вывода. Для компьютера с (например) 4 процессорами и 20 устройствами;никогда не может происходить более четырех событий одновременно (каждый из четырех процессоров либо выполняет полезную работу, либо ожидает выполнения запроса ввода-вывода), и у вас всегда будет как минимум 20 единиц оборудования (устройств или процессоров)впустую / невозможно выполнить полезную работу.

Это метод, который используется микропрограммой (например, BIOS и UEFI), потому что она проще и потому что микропрограмма используется очень коротко для запуска ОС (которая в основном включает в себя«загрузить ядро ​​с диска» и не сильно выиграет от одновременной работы большого количества оборудования), а также потому, что прошивка сбрасывается / игнорируется после этого. Было также несколько ужасных старых операционных систем, которые использовали этот подход (например, MS-DOS).

Для этого метода IRQ на самом деле не используются, так что это не имеет большого значения, если нет IRQ.

Примечание. Существует несколько видов устройств, которые передают данные без программного обеспечения, запрашивающего их (например, клавиатура, мышь, сетевая карта принимает, но не отправляет пакеты). Без IRQ и с синхронным IO;устройствам такого типа требуются достаточно большие буферы для хранения данных до тех пор, пока программное обеспечение не запросит их, и / или какой-либо способ устранения переполнения буфера, вызывающего потерю данных (например, повторные попытки TCP / IP).

3 голосов
/ 02 октября 2019

Опрос и совместная многозадачность yield() вызывает во всем коде (включая пространство пользователя) частую загрузку ОС, чтобы она могла опрашивать оборудование.

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

Это будетбыть немного менее ужасным и несколько меньшими накладными расходами, но для этого все равно потребуется весь код в системе * очень часто yield(), иначе обслуживание HW будет сильно отставать.

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


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

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

Сетевая карта будет иметь аппаратную очередь приема с комнатой. хранить несколько входящих кадров Ethernet между моментами, когда процессор проверяет их. (Я думаю, что реальные NIC работают таким образом, по крайней мере, хорошие. В условиях высокого трафика реальные драйверы NIC фактически могут переключаться в режим опроса вместо того, чтобы HW вызывал прерывание для каждого входящего пакета, чтобы уменьшить нагрузку на процессорОсобенно для сетей Ethernet 10G / 100G с небольшими размерами кадров. Но этот опрос выполняется с помощью прерывания по таймеру на частоте 100 Гц или чего-то еще, а не только с yield ().)

и файлы были успешно загружены в память?

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

Или в младшей системе дисковый ввод-вывод может быть выполнен с помощью запрограммированного ввода-вывода, когда ЦП должен читать каждый байтили слово отдельно и сохранить его в самой памяти. (Контроллеры дисков IDE на x86 раньше работали таким образом, с DMA в качестве опции, но некоторые контроллеры имели глючный DMA. Поэтому Linux использовал по умолчанию PIO, и вы могли использовать hdparm для включения DMA. Хотя прерывания все еще были задействованы, яПодумайте, возможно, чтобы ЦП знал, когда данные были готовы к копированию из буфера диска в пакете. Вы не хотите, чтобы ЦП вращался в течение нескольких миллисекунд, ожидая, пока головки начнут искать, прежде чем начнется передача. Нов системе с твердотельным хранилищем, такой как SSD / Flash, время поиска намного меньше, поэтому вы можете просто упростить его и заблокировать всю систему от запуска ввода-вывода до тех пор, пока не завершится передача сектора.)

...