Як працює багатозадачність


15

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

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

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

В основному я можу уявити лише два способи зробити цю роботу, але жоден не здається дійсно підходящим:

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

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

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


Хоча ваші здогадки не зовсім коректні, проблема, яку ви вказуєте, - так, так: "Я можу зробити довгий розрахунок, який не передбачає системних дзвінків і затримує все на деякий час".
поштовх

Ключове слово, на яке слід шукати:interrupt
SK-логіка

Так, але хто запускає переривання? Якщо мій код виконується, ОС не може виконати INTінструкцію. Щось все ще для мене загадкове
Андреа

@Andrea, годинник програмного забезпечення викликає перерву. Так само просто. en.wikipedia.org/wiki/Scheduling_%28computing%29
SK-logic

Гаразд, тепер я бачу. Отже, якщо я правильно розумію, це функція на основі апаратних засобів, а не те, що можна просто реалізувати в ОС.
Андреа

Відповіді:


21

ОС запрограмує таймер, який повинен виконувати кожні кілька мікросекунд (або мілісекунд, залежно від швидкості системи). Цей таймер збільшує апаратне переривання, через що процесор зупиняє все, що він робить зараз, скидає весь його вміст у стек і обробляє процедуру переривання, вказану адресою, наданою контролером переривання. Ця програма може перевірити стек та різні інші змінні, щоб прийняти рішення, який запущений процес слід знову повернути в дію. Якщо це той самий процес, рутина переривання просто повертається. Якщо це інший, відповідні частини стека зберігаються та замінюються вмістом раніше перерваного процесу, тож коли повернення перерви повертається, цей процес триває. Крім того, що минув певний час,

Це (для сучасних процесорів) ДУЖЕ ДУЖЕ спрощена версія того, що відбувається, але це пояснює принцип. На додаток до цих переривань, керованих ОС, також існують переривання, викликані зовнішніми подіями (миша, клавіатура, послідовні порти, мережеві порти тощо), які обробляються окремими процедурами переривання, які зазвичай підключаються до обробників подій.

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


5

Він змінюється від системи до системи.

У неперспективних багатозадачних системах (наприклад, оригінальний Oberon або оригінальний Apple Macintosh) операційна система періодично "опитує" всі завдання, надаючи їм можливість виконати роботу. Очікується, що завдання будуть грати добре разом. Якщо їм просто потрібно трохи попрацювати, вони це роблять і повертаються в ОС. Якщо в одному завданні потрібно виконати ВЕЛИКИЙ шматок, передбачається розбити його на невеликі шматочки та опрацювати по одному шматочку щоразу, коли він опитується.

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

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

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

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


Що поганого може статися, якщо процесор буде забраний у вас без попередження? Я думаю, ви знову отримаєте контроль над процесором з однаковими значеннями в регістрах. Чим це відрізняється від простого ведення обчислення?
Андреа

@Andrea: Взаємне виключення та критичні розділи стосуються того, щоб не втратити процесор у критичний момент. Якщо у вашому процесі щось заблоковано, і ви втрачаєте процесор, воно залишається заблокованим, поки ви знову не отримаєте процесор. Це може спричинити проблеми.
Джон Р. Стром

@Andrea Ви знову отримаєте контроль над процесором, і, можливо, якийсь інший процес суперечив пам’яті, яку ви збиралися використовувати.
користувач253751

4

Перерви таймера можуть бути згенеровані комп'ютерним обладнанням для переривання ЦП. Таким чином, на основі алгоритму планування, що використовується Операційною системою, ОС може вирішити, чи продовжувати виконувати поточну програму або контекстний перехід на іншу, готову до запуску.

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