Опрос и совместная многозадачность 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, время поиска намного меньше, поэтому вы можете просто упростить его и заблокировать всю систему от запуска ввода-вывода до тех пор, пока не завершится передача сектора.)