Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Шеховцов_1.docx
Скачиваний:
73
Добавлен:
09.11.2019
Размер:
14.73 Mб
Скачать

20.1.6. Підтримка багатопроцесорності в Linux

Багатопроцесорні архітектури в Linux підтримують, починаючи із ядра версії 2.0 (1996 рік). Підтримка багатопроцесорності реалізована в засобах синхронізації процесів і планувальнику процесів.

Основи синхронізації у ядрі Linux описано в пункті 5.4.1. Первісна реалізація підтримки SMP грунтувалася на великому блокуванні ядра. Сучасні версії ядра підтримують підхід із розбиванням коду на окремі критичні секції.

Багатопроцесорне планування

Ядро Linux версії 2.4 реалізовувало стандартне планування із розподілом часу. Повна реалізація планування, розрахована на використання у багатопроцесорних архітектурах, уперше з'явилася у ядрі версії 2.6 [83].

4- Реалізовано підтримку м'якої спорідненості, засновану на тому, що для кож­ного процесора підтримують окрему чергу готових процесів. До виконання на процесорі допускають лише процеси із його черги. Періодично відбувається балансування всіх черг. Усе це зменшує ймовірність міграції процесів між процесорами і запобігає появі ефекту пінг-понгу.

f Реалізовано системні виклики, що дають змогу задавати жорстку спорідне­ність для процесів [79].

Для встановлення маски спорідненості використовують системний виклик

sched_setaffinity():

#include <sched.h>

long sched_setaffinity(pid_t pid. unsigned int len.

unsigned long *user_mask_ptr);

де: pid - ідентифікатор процесу (0 - поточний процес);

1 en - довжина маски;

User_mask_ptr — покажчик на змінну, що містить маску.

У разі помилки (наприклад, якщо задано маску, що містить тільки відсутні процесори) цей виклик повертає негативне значення. Зазначимо, що задання ма­сок для процесів, запущених іншими користувачами, дозволено тільки для root.

unsigned long mask - 7;

// прив'язати процес до процесорів 0. 1 і 2

sched_setaffinity(0, sizeof(mask). &mask):

Для того щоб дізнатися про поточне значення маски спорідненості, викори­стовують системний виклик sched_getaffinity():

unsigned long mask;

sched_getaffinity(0, sizeof(mask), &mask);

printf( спорідненості: %081x". mask);

Реалізація жорсткої спорідненості в ядрі

Маску процесу зберігають у його дескрипторі taskstruct як поле cpusal lowed. У разі будь-якої спроби міграції процесу на новий процесор ядро перевіряє, чи увімкнуто в цьому полі біт, що відповідає тому процесору. Коли біт не встановле­но, міграція процесу не відбувається. Крім того, якщо внаслідок зміни маски з'ясується, що процес виконується на недопустимому процесорі, він негайно міг­рує на один із вказаних у новому значенні маски.

Підтримка NUMA-систем

Підтримка архітектури NUMA була вперше реалізована у ядрі версії 2.6. Основою такої підтримки є внутрішнє відображення топології вузлів, для роботи із якими при­значений спеціальний програмний інтерфейс топології (Topology АРІ). Інформацію про топологію вузлів використовують під час планування процесів. Основною метою планування є підвищення ймовірності використання локальної пам'яті.