Какова связь между системными вызовами, передачей сообщений и прерываниями?


15

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

Некоторые цитаты из статьи и некоторые другие:

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

    1. Процесс выдает системный вызов (иногда называемый программным прерыванием); например, возникает запрос ввода-вывода, запрашивающий доступ к файлу на жестком диске.
    2. Происходит аппаратное прерывание; например, клавиша была нажата на клавиатуре, или таймер истекает (используется в упреждающей многозадачности).
  2. Существует два метода, с помощью которых программа, выполняющаяся в пользовательском режиме, может запрашивать службы ядра:

    * System call
    * Message passing
    
  3. Прерывание - это асинхронный сигнал, указывающий на необходимость внимания или синхронное событие в программном обеспечении, указывающее на необходимость изменения в исполнении.

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


2
Очень хороший вопрос!
Стефан Гименес

Ответы:


12
  1. Все современные операционные системы поддерживают многозадачность. Это означает, что система может выполнять несколько процессов одновременно; либо в псевдопараллельной (когда доступен только один ЦП), либо в настоящее время с многоядерными ЦП, распространенными параллельно (одна задача / ядро).

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

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

    Аналогичный случай, когда вы программируете и хотите запросить услугу у CPU. Разница в том, что в этом случае вы выполняете программный код - обычно библиотечные процедуры, которые выполняют системные вызовы (например, fopenдля открытия файла).

    Таким образом, 1 описывает два разных способа привлечения внимания от процессора.

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

    Если вам интересно, почему существуют эти два режима, самый простой ответ - для защиты. Операционные системы на основе микроядра (например, MINIX 3) имеют большинство своих служб, работающих в пользовательском режиме, что делает их менее вредными. Монолитные ядра (такие как Linux) имеют почти все свои службы, работающие в режиме ядра. Таким образом, драйвер, который падает в MINIX 3, вряд ли разрушит всю систему, хотя в Linux это не является чем-то необычным.

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

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

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

    Когда мы прерываем процессор (программным или аппаратным), ему необходимо где-то сохранить его текущее состояние - процесс, который он выполняет и в какой момент он остановился, - иначе он не сможет возобновить процесс при переключении обратно. , Это называется переключением контекста, и это имеет смысл: перед тем, как выключить компьютер, чтобы сделать что-то еще, сначала необходимо убедиться, что вы сохранили все свои программы / документы и т. Д., Чтобы вы могли возобновить работу с того места, где вы остановили в следующий раз включишь :)

    Таким образом, 3 объясняет, что нужно сделать после выполнения прерывания или прерывания и насколько похожи эти два случая.


1
Благодарность! (1) В 1 вы имеете в виду два способа привлечь внимание процессоров: программное прерывание (программа с примером системного вызова) и аппаратное прерывание (пример ключа сброса)? (2) В 2 вы имеете в виду, что системный вызов и передача сообщений являются двумя способами программного прерывания? (3) Правильно ли, что цель программного прерывания заключается в том, чтобы процесс запрашивал службы и ресурсы ядра, а цель аппаратного прерывания - нет ? Если да, какова цель аппаратного прерывания?
StackExchange для всех

1
(1) Правильно. (2) Ну, системные вызовы и передача сообщений - это два разных метода, которые можно использовать для достижения межпроцессного взаимодействия. Но это правда, что оба они основаны на программном обеспечении, поэтому, чтобы привлечь внимание процессора, вы выполняете ловушку (программное прерывание). (3) В некотором смысле, да. Пример запроса службы ядра - выполнение библиотечной процедуры (которая будет преобразована в 1 или более системных вызовов), например, creatдля создания нового файла. Примером прерывания является принтер, посылающий сигнал ЦПУ, чтобы сообщить ему, что печать завершена.
Сакиск

1
Благодарность! Что касается (3), вы имеете в виду в некотором смысле нет? Каковы основные цели аппаратного прерывания и программного прерывания?
StackExchange для всех

1
Сброс системы не является прерыванием; это не сохраняет состояние, чтобы возобновить после.
Псуси

1
Сброс @faif и NMI (Non Maskable Interrupt) - это два разных вывода на процессоре. Последнее вызывает прерывание, означающее сохранить состояние и перейти к обработчику. Первый инициализирует процессор (преднамеренно отбрасывая все состояния) так же, как и при включении питания (сброс включается автоматически при включении). Поскольку часть определения прерывания заключается в том, что оно сохраняет состояние, сброс не соответствует этому определению.
psusi

9

Системные вызовы, передача сообщений (как описано в статье в Википедии) и прерывания - все это вызывает переключение контекста или переключение из режима пользователя в режим ядра. Как вы, вероятно, знаете:

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

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

Системные вызовы включают выполнение определенной инструкции ЦП или набора инструкций, которые заставляют ЦП переходить (сначала сохраняя обратный адрес в стеке) на предварительно определенный адрес (недоступный для записи в пользовательский режим) и переводить ЦП из режима пользователя в режим ядра (кольцо 3 в кольцо 0 в архитектуре Intel).

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

Передача сообщений подразумевает (по крайней мере для меня), что ядро ​​является «запущенным процессом», который будет принимать поток сообщений, и что существует функция, доступная в пользовательском режиме, которая будет отправлять такие сообщения. Или может быть так, что функция «send» просто помещает значения в стек, и в следующий раз, когда ядро ​​получает контроль (либо если процесс блокируется, либо происходит прерывание), оно выталкивает сообщения из стека и отправляет соответствующим образом внутренним подпрограммам.

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


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

5

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.