Який взаємозв'язок між системними дзвінками, передачею повідомлень та перериваннями?


14

Я читаю статтю Вікіпедії для управління процесами . Моя увага зосереджена на Linux. Я не можу визначити взаємозв'язок та відмінності між системним викликом, передачею повідомлення та перериванням їхніх концепцій та цілей. Чи всі вони для процесів подання запитів до ядра для ресурсів та послуг?

Деякі цитати зі статті та деякі інші:

  1. Існує два можливі способи відновити контроль над процесором під час виконання програми для того, щоб ОС здійснила де-розподіл або розподіл:

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

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

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


2
Дуже гарне запитання!
Стефан Гіменез

Відповіді:


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

    Візьмемо простіший варіант, коли доступний лише один процесор. Це означає, що якщо одночасно виконувати два різні процеси (скажімо, веб-браузер та музичний плеєр), система насправді не може одночасно їх виконувати. Що відбувається, це те, що процесор постійно переходить з одного процесу на інший; але це відбувається надзвичайно швидко, тому ви ніколи цього не помічаєте.

    Тепер припустимо, що під час виконання цих двох процесів ви натискаєте кнопку скидання (поганий хлопчик). ЦП негайно припинить все, що робиться, і перезавантажить систему. Вітаємо! Ви створили перерву.

    Схожий випадок, коли ви програмуєте і хочете попросити послугу у процесора. Різниця полягає в тому, що в цьому випадку ви виконуєте програмний код - зазвичай це бібліотечні процедури, які виконують системні виклики (наприклад, fopenдля відкриття файлу).

    Таким чином, 1 описує два різні способи залучення уваги з процесора.

  2. Більшість сучасних операційних систем підтримують два режими виконання: режим користувача та режим ядра. За замовчуванням операційна система працює в режимі користувача. Режим користувача дуже обмежений. Наприклад, заборонено всі введення-виведення; Таким чином, вам не дозволяється відкривати файл з вашого жорсткого диска. Звичайно, це ніколи не відбувається насправді, тому що, коли ви відкриваєте файл, операційна система прозоро переходить з режиму користувача в режим ядра. У режимі ядра ви повністю контролюєте обладнання.

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

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

    Таким чином, 2 згадує два різні способи переходу з режиму користувача в режим ядра.

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

    Коли ми перериваємо процесор (або програмним забезпеченням, або апаратним забезпеченням), йому потрібно десь зберегти його поточний стан - процес, який він виконує, і в який момент він зупинився - інакше він не зможе відновити процес при переключенні назад . Це називається контекстним комутатором, і це має сенс: Перш ніж вимкнути комп’ютер, щоб зробити щось інше, спочатку потрібно переконатися, що ви зберегли всі свої програми / документи тощо, щоб ви могли відновитись з того місця, де зупинили наступного разу ввімкніть його :)

    Таким чином, 3 пояснює, що потрібно зробити після виконання пастки чи переривання та наскільки схожі обидва випадки.


1
Спасибі! (1) Ви маєте на увазі два способи привернення уваги з процесорів - це переривання програмного забезпечення (програма із прикладом системного виклику) та апаратне переривання (приклад ключа скидання)? (2) Чи ви маєте на увазі у другому, що системний виклик та передача повідомлень - це два способи переривання програмного забезпечення? (3) Чи правильно, що мета переривання програмного забезпечення полягає в тому, щоб процес запитувати послуги та ресурси ядра, а мета апаратного переривання - це не ? Якщо так, то яка мета апаратного переривання?
Тім

1
(1) Правильно. (2) Добре, що системні дзвінки та передача повідомлень - це дві різні методи, які можна використовувати для досягнення міжпроцесорної комунікації. Але це правда, що обидва є на основі програмного забезпечення, таким чином, щоб привернути увагу з процесора, ви виконуєте пастку (переривання програмного забезпечення). (3) У певному сенсі, так. Прикладом запиту на обслуговування ядра є виконання бібліотечної процедури (яка буде переведена на 1 або більше системних викликів), наприклад creatдля створення нового файлу. Прикладом перерви є принтер, який надсилає сигнал до центрального процесора, щоб повідомити, що друк завершено.
sakisk

1
Спасибі! Щодо (3), ви маєте на увазі сенс "ні"? Які загальні цілі перервати апаратне забезпечення та програмне забезпечення?
Тім

1
Скидання системи не є перериванням; він не зберігає стан для відновлення після.
psusi

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

9

Системні дзвінки, передача повідомлень (як описано в статті Вікіпедії) та переривання - це все, що викликає контекстний перемикач або перехід від користувача до режиму ядра. Як ви, ймовірно, знаєте:

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

  • користувальницький режим: програми мають віртуалізований вигляд пам’яті, програми не можуть вільно читати / записувати всю пам'ять і не можуть безпосередньо читати / записувати апаратні пристрої. Щоб отримати більше пам'яті або отримати доступ до апаратних пристроїв, програма режиму користувача повинна викликати ядро. Системні дзвінки та передача повідомлень - це два способи зробити це.

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

Апаратні переривання роблять майже те саме, вони змушують перехід CPU (перший збереження зворотної адреси на стеку) на заздалегідь задану адресу і переміщення процесора з користувальницького режиму в режим ядра. Так у багатьох процесорах один і той же механізм може використовуватися програмним забезпеченням (називається "переривання програмного забезпечення") і може використовуватися для дзвінків з процесора.

Передача повідомлень означає (щонайменше, для мене), що ядро ​​- це "запущений процес", який прийме потік повідомлень і що існує функція, доступна в режимі користувача, яка надсилатиме такі повідомлення. Або може бути, що функція "відправити" просто передає значення на стек, і наступного разу, коли ядро ​​має контроль (або якщо процес блокує, або відбувається переривання), воно спливає повідомлення зі стека і відповідно передає у внутрішні процедури.

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


3
У режимі ядра використовуються ті самі таблиці сторінок і подається той самий вигляд віртуальної пам'яті, що і в режимі користувача. Різниця полягає в тому, що він має доступ до сторінок, позначених як обмежений у режимі ядра.
psusi

5

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

Як апаратні, так і програмні переривання призводять до збереження стану процесора, переходу в режим ядра та переходу до визначеного обробника для цього переривання. Різниця полягає в тому, що апаратні переривання генеруються зовнішнім обладнанням, коли їм потрібна певна увага, наприклад клавіатура, яка вказує на натискання клавіші. Потім обробник клавіатури може перечитати порт IO клавіатури, щоб побачити, яку клавішу натискали, і вжити відповідних дій, а потім повернутися до програми, яка була перервана.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.