Тема 11. Багатопроцесорні системи.
Багатозадачність в операційній системі призначена для спільного використання процесора кількома процесами. У випадку, коли в комп'ютері встановлено більш ніж один процесор, ядро містить додатковий планувальник процесорів, що відслідковує їх завантаженість, розподіляє виконувальні процеси між наявними процесорами для максимально ефективного використання обчислювальної системи. Залежно від способу використовування процесорів, операційні системи з підтримкою мультипроцесорності поділяють на групи з симетричним або асиметричним опрацюванням даних.
При асиметричному опрацюванні даних один процесор вибирається для виконання операційної системи, а інші виконують тільки завдання.
При симетричному опрацюванні даних, система виконується на будь-якому вільному процесорі або на всіх процесорах одночасно. Такий підхід дозволяє оптимально використовувати потужність кількох процесорів, тому що сама система часом виявляється досить завантаженою. До того ж, в асиметричній системі збільшення числа процесорів та навантаження на кожний з них приводить до затримок з обчисленнями, що стримує збільшення продуктивності. Іншим недоліком асиметричної схеми є нерівномірна завантаженість процесорів або, зупинка деяких з них при повному завантаженні інших.
Для отримання максимальної потужності у сучасних ЕОМ використовуються як найновіші досягнення розвитку елементної бази, так і нові рішення в архітектурі комп'ютерів. Втілюючи ідею одночасного виконання кількох дій, розглядають дві реалізації: конвеєрність і власне паралельність.
Зміст
Підтримка багатопроцесорності в операційних системах
Асиметрична багатопроцесорність
У разі використання асиметричної багатопроцесорності кожен процесор виконує код операційної системи незалежно від інших процесорів. Кожна копія ОС може бути завантажена в окрему ділянку пам'яті, можливе також спільне використання коду ОС різними процесорами з виділенням окремих ділянок пам'яті для даних. Цей підхід було використано на ранніх стадіях розвитку підтримки багато процесорних архітектур в ОС. Наведемо його недоліки.
• Усі процеси користувача деякої копії ОС виконуються на тому самому процесорі, що й сама копія. Немає можливості організувати паралельне виконання коду в рамках окремого процесу, не можна вирівнювати навантаження на окремі процесори і на пам'ять.
• Неможливо організувати дисковий кеш через те, що копії ОС різних процесорів кешуватимуть дискові блоки окремо. Якщо різні процесори одночасно модифікують один і той самий дисковий блок у кеші, а потім спробують зберегти ці зміни на диск, втратиться інформація, оскільки тільки одна з цих змін буде справді записана на диск.
Симетрична багатопроцесорність
Основним підходом, який застосовують нині для підтримки UMA-архітектур, є симетрична багатопроцесорність(SMP). У даному разі у спільну пам'ять завантажують єдину копію операційної системи і всіх її даних, при цьому її код може бути виконаний кожним із процесорів або кількома процесорами одночасно.
Особливості SMP-систем
•Усі процесори системи доступні з коду ОС. Планувальник ОС може організувати виконання її коду або коду потоку користувача на будь-якому процесорі.
•Для всіх процесорів доступні спільні дані, при цьому когерентність кеша підтримується апаратно.
•Потоки користувача і потоки ядра можуть виконуватися паралельно на різних процесорах. Під час виконання потік може мігрувати із процесора на процесор.
•Спроба повторного читання одних і тих самих даних процесором CPUA може дати інший результат внаслідок того, що ці дані були змінені процесором CPUB.
•У системі можливе вирівнювання навантаження між процесорами, для чого планувальник ОС може передавати новий потік для виконання найменш завантаженому процесору.
Додавання нового процесора у систему автоматично робить його доступним для виконання коду ОС або процесів користувача. При цьому навантаження на інші процесори автоматично знижується.
Для того, щоб скористатися перевагами багатопроцесорної архітектури, код ОС має бути багатопотоковим і реентерабельним. При цьому необхідна підтримка синхронізації на рівні ядра. Найпримітивнішим підходом до забезпечення синхронізації є велике блокування ядра (big kernellock). При цьому кожен процесор перед виконанням будь-якого коду ОС займає глобальний м'ютекс. Цей підхід неефективний, оскільки в конкретний момент часу код ОС може бути виконаний тільки на одному процесорі.
Сучасні ОС реалізують гнучкіший підхід, у якому код ядра розбивають на незалежні критичні ділянки, із кожною з яких пов'язують окремий м'ютекс.
Продуктивність багатопроцесорних систем
Масштабування навантаження Під масштабуванням навантаження (workload scalability) у SMP-системах розуміють вплив додавання нових процесорів на продуктивність системи. У реальних умовах воно залежить від багатьох факторів.
•У разі збільшення кількості процесорів зростає навантаження на системну шину та пам'ять і , як наслідок, ціна промаху кеша.
•Кількість промахів кеша при цьому теж збільшується внаслідок того, що в системі збільшено кількість потоків, які потрібно планувати.
•Що більше процесорів, то більше зусиль потрібно докладати для забезпечення когерентності кеша.
Кількість блокувань у системі зростає із ростом кількості процесорів.
Найбільший рівень масштабування навантаження досягають для потоків, обмежених можливостями процесора, найменший — для потоків, обмежених можливостями пристроїв введення-виведення.
Продуктивність окремих застосувань
Розглянемо, яким чином впливає наявність кількох процесорів на час виконання програмного коду. Багатопроцесорність дає змогу поліпшити характеристики програми тільки тоді, коли в ній наявний паралелізм. При цьому для того, щоб ОС мала можливість організувати такий паралелізм, код програми має бути багатопотоковим. Якщо програма не використовує багатопотоковість, її виконання у багатопроцесорній системі може спричинити зниження продуктивності через очікування на додаткових блокуваннях і міграцію між процесорами.
Планування у багатопроцесорних системах
Головною особливістю планування у багатопроцесорних системах є його двовимірність. Крім прийняття рішення проте, який потік потрібно поставити на виконання наступним, необхідно визначити, на якому процесорі він має виконуватися. Крім того, важливо виділяти взаємозалежні потоки, що їх доцільно виконувати паралельно на кількох процесорах, аби їм було простіше взаємодіяти один із одним. У цьому розділі розглянемо деякі підходи до організації планування, які враховують ці фактори, а у наступному - важливе поняття спорідненості процесора, що впливає на організацію планування у багатопроцесорних системах.
Планування з розподілом часу Найпростішим способом організації багатопроцесорного планування незалежних потоків є використання структурних даних для готових потоків, спільної для всіх процесорів. Прикладом такої структури може бути багаторівнева черга, яка використовується під час планування із пріоритетами. Коли потік на одному з процесорів завершує роботу або призупиняється, цей процесор починає виконувати код планувальника ОС. Планувальник при цьому блокує чергу готових потоків, ставить на виконання потік із найвищим пріоритетом і вилучає його керуючий блок із черги. Наступний за пріоритетом потік почне виконуватися на наступному звільненому процесорі. Такий підхід називають плануванням із розподілом часу, оскільки, як і у традиційних системах із розподілом часу, щоразу приймають рішення щодо використання одного процесора і виконання одного потоку. Головним недоліком цього підходу є високий ступінь паралелізму доступу до черги готових потоків, що може стати «вузьким місцем» системи. Є ймовірність того, що більшу частину часу потоки проводитимуть в очікуванні на м'ютексі, який захищає чергу. Крім того, немає можливості уникнути перемикання контексту в разі призупинення потоку і подальшої його міграції на інший процесор.
Планування з розподілом простору
Планування з розподілом часу не пристосоване до організації виконання потоків, пов'язаних між собою, оскільки кожен потік розглядають окремо. Для організації виконання пов'язаних потоків необхідно одночасно розглядати кілька процесорів і розподіляти по них набір потоків. Цей підхід називають плануванням із розподілом простору. Найефективнішим алгоритмом планування із розподілом простору є бригадне планування(gang scheduling). Цей алгоритм працює так. 1.Пов'язані потоки (наприклад, потоки одного процесу) одночасно запускають на виконання на максимально можливій кількості процесорів. Такі потоки становлять бригаду. 2.Усі потоки бригади виконуються впродовж однакового для всіх кванта часу.
3.Після вичерпання кванта часу відбувається повне перепланування для всіх процесорів. Виконання починають потоки іншої бригади.