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

20.1.7. Підтримка багатопроцесорності у Windows хр

За умов багатопроцесорної системи планувальник Windows ХР визначає поря­док виконання потоків і процесори, на яких вони мають виконуватися. При цьо­му за замовчуванням підтримують м'яку спорідненість. Крім того, аналогічно до Linux у системі може бути задана жорстка спорідненість на основі маски спорід­неності, а серед процесорів, заданих у масці спорідненості потоку, додатково виби­рають ідеальний процесор (ideal processor). Планувальник планує потік для вико­нання на ідеальному процесорі, якщо він є доступним у цей момент.

Маска спорідненості потоку, номер ідеального процесора і номер процесора, на якому потік виконувався останній раз, містяться в керуючому блоці потоку (KTHREAD), маска спорідненості процесу - у блоці KPR0CESS. Під час створення потоку його маску спорідненості ініціалізують значенням маски спорідненості процесу.

У разі постановки потоку на виконання відбуваються такі дії.

1. Процесором, на якому виконуватиметься потік, планувальник намагається зро­бити ідеальний процесор.

2. Якщо ідеальний процесор недоступний, вибирають процесор, на якому потік виконувався востаннє.

3. Якщо і цей процесор зайнятий, вибирають інший вільний процесор або проце­сор, на якому виконується потік із нижчим пріоритетом.

Задання жорсткої спорідненості та ідеального процесора

Жорстка спорідненість може бути задана (маска спорідненості змінена із програми) за допомогою функцій SetProcessAffinityMaskO (для процесу) або SetThreadAffinity-MaskO (для окремого потоку).

DWORD mask_proc - 2: // другий процесор (маска 000...0010) SetProcessAffinityMask(GetCurrentProcess(). &mask_proc)

Для визначення поточного значення маски спорідненості процесу використо­вують функцію GetProcessAffinityMask().

DWORD mask_proc, masksys;

// у масці mask_sys увімкнуто біти для всіх доступних процесорів

GetProcessAffinityMask(GetCurrentProcess(). &mas_kproc. Smasksys): printf("маска процесу: %081x. системна маска: %081х\п". mask_proc. masksys);

Ідеальний процесор вибирають випадково під час створення потоку. Щоб зміни­ти його із застосування, потрібно використати функцію SetThreadldeal Processor().

SetThreadIdealProcessor(GetCurrentThread(), 1); // другий процесор

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

Windows ХР, як і Linux, підтримує внутрішнє відображення топології вузлів і ви­користовує його під час планування потоків. Win32 АРІ містить ряд функцій, що дають змогу отримати інформацію про поточну топологію (наприклад, функція GetNumaProcessorNode() повертає номер вузла для заданого процесора). Цю інформа­цію можна застосувати для оптимізації використання локальної пам'яті, наприклад шляхом задання маски спорідненості, що включає всі процесори одного вузла.

20.2. Принципи розробки розподілених систем

У цьому розділі йтиметься про базові технології розробки розподілених систем. До них належать передавання повідомлень і віддалені виклики процедур (RPC). Передавання повідомлень, а також базові принципи RPC розглянуто в розділі 6. У розділах 20.2.1-20.2.3 висвітлюватимуться особливості застосування RPC для розробки розподілених застосувань.