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

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

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

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

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

Прерывание, при обработке которого машина остается во вполне определенном состоянии, называется точным прерыванием (Walker and Cragon, 1995). У такого прерывания имеются четыре свойства:

1. Счетчик команд сохранен в определенном месте.

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

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

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

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

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

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

Рис. 5.5. Прерывание: а — точное; б — неточное


Прерывание, не отвечающее этим требованиям, называется неточным прерыванием и сильно портит настроение разработчикам операционных систем, которым теперь нужно определить, что уже произошло, а что еще должно произойти. На рис. 5.5, б показано неточное прерывание, при котором различные команды, расположенные вблизи той, на которую указывает счетчик команд, находятся в разных стадиях завершения и более «старые» команды не обязательно являются более завершенными, чем более «молодые». Машины с неточными прерываниями обычно помещают в стек большой объем данных о своем внутреннем состоянии, чтобы дать возможность операционной системе определить, в какой стадии все находилось. Для возобновления работы машины обычно требуется слишком сложный программный код. К тому же сохранение в памяти довольно большого объема информации замедляет обработку прерываний и еще больше замедляет возобновление работы. Это приводит к нелепой ситуации, при которой очень быстрые суперскалярные центральные процессоры иногда становятся непригодными для работы в реальном масштабе времени из-за медленной обработки прерываний.

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

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

5.2.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Точные и неточные прерывания:

  1. 7.3.2. Прерывания
  2. 7.4.4. Как справиться с прерыванием.
  3. 7.3.2. Прерывания
  4. Прерывание нотаций:
  5. Прерывание обвинений:
  6. Прерывание криков и ругани:
  7. 7.4.4. Как справиться с прерываниями
  8. Статья 281. Право на жизнь
  9. ПРЕПЯТСТВИЕ ВНЕШНЕЕ
  10. 1. Социолог включил в вопрос
  11. Правило ясности и точности употребляемых слов и рассуждений.