Спорідненість процесора
Спорідненість процесора[1], або закріплення ЦП або «Спорідненість кешу», дозволяє зв'язування та розв'язування процесу чи потоку до центрального процесора (ЦП) чи діапазону ЦП, так що процес або потік виконуватиметься тільки на призначених ЦП, а не на будь-якому. Це можна розглядати як модифікацію рідного алгоритму планування центральної черги у симетричній багатопроцесорній операційній системі. Кожний елемент у черзі має тег, що позначає його рідний процесор. На час виділення ресурсів кожне завдання призначається своєму рідному процесору в перевазі до інших.
Спорідненість процесора користується тим, що залишки процесу, який працює на даному процесорі, можуть залишатися у стані цього процесора (наприклад, дані в кеш-пам'яті) після запуску іншого процесу на цьому процесорі. Планування виконання цього процесу на цьому ж процесорі поліпшує його продуктивність шляхом зниження подій, що впливають на продуктивність, як-от пропуски кешу. Практичним прикладом спорідненості процесора є виконання багатьох примірників непотокового застосунку, як-от деяке програмне забезпечення рендерингу графіки.
Реалізації алгоритму планування відрізняються за дотриманням спорідненості процесора. За певних обставин, деякі реалізації дозволятимуть зміну завдання на інший процесор, якщо це призведе до вищої ефективності. Наприклад, коли два інтенсивні до процесора завдання (А і Б) споріднені з одним процесором, а інший залишається невикористаним, більшість планувальників зсуватимуть завдання Б на другий процесор задля максимізації процесорного використання. Потім завдання Б набуде спорідненість із другим процесором, а завдання А продовжуватиме мати спорідненість із початковим процесором.
Використання
Спорідненість процесора може ефективно зменшувати проблеми кешу, але вона не зменшує постійну проблему балансування навантаження[2]. Також зверніть увагу, що спорідненість процесора ускладнюється в системах із нерівномірними архітектурами. Наприклад, система з двома двоядерними гіперпотоковими ЦП є проблемою для алгоритму планування.
Повна спорідненість між двома віртуальними ЦП реалізується на одному ядрі через гіперпотоковість, часткова спорідненість між двома ядрами на одному фізичному процесорі (оскільки ядра ділять деякий, але не весь, кеш), але немає спорідненості між окремими фізичними процесорами. Оскільки інші ресурси також діляться, спорідненість процесора сама по собі не може використовуватися як основа диспетчеризації ЦП. Якщо процес нещодавно запускався на одному віртуальному гіперпотоковому ЦП у даному ядрі, і наразі цей віртуальний ЦП зайнятий, але не його партнерський ЦП, то спорідненість кешу запропонувала би, що процес слід відправити на бездіяльний партнерський ЦП. Однак, два віртуальні ЦП змагаються за по суті всі обчислювальні, ресурси кешу та пам'яті. В даній ситуації, як правило, буде ефективніше відправити процес на інше ядро чи ЦП, за їх доступності. Це може накласти штраф, коли процес повторно наповнює кеш, але загальна продуктивність може бути вищою, оскільки процес не матиме змагатися за ресурси всередині ЦП.
Конкретні операційні системи
В Linux спорідненість ЦП процесу може змінюватися програмою taskset(1)[3] і системним викликом sched_setaffinity(2). Спорідненість потоку може змінюватися однією з бібліотечних функцій: pthread_setaffinity_np(3) або pthread_attr_setaffinity_np(3).
У системах SGI dplace зв'язує процес із набором ЦП[4].
NetBSD 5.0, FreeBSD 7.2 і пізніші версій можуть використовувати pthread_setaffinity_np і pthread_getaffinity_np[5]. У NetBSD psrset використовується[6] для встановлення спорідненості потоку певному набору ЦП. У FreeBSD утиліта cpuset[7] використовується для створення наборів ЦП і призначення процесів цим наборам.
У Windows NT та її наступниках спорідненість ЦП потоків і процесів може встановлюватися окрема шляхом використання викликів API SetThreadAffinityMask[8] і SetProcessAffinityMask[9] або через інтерфейс Диспетчера завдань (тільки для спорідненості процесу).
macOS виставляє API спорідненості[10], який надає ядру підказки щодо планування потоками згідно з наборами відповідності.
У Solaris можливо керувати зв'язуванням процесів і LWP з процесором, використовуючи програму pbind(1)[11]. Для програмного керування спорідненістю можна використовувати processor_bind(2)[12]. Доступні загальніші інтерфейси на кшталт pset_bind(2)[13] або lgrp_affinity_get(3LGRP)[14] із використанням понять набору процесорів і місцевих груп.
Див. також
- Маска спорідненості
Примітки
- Шеховцов, В. А. (2005). Багатопроцесорні та розподілені системи. У Згуровський, М. З.. Операційні системи (підручник для вищих навчальних закладів). Інформатика (українською). К.: Видавнича група BHV. с. 524. ISBN 966552157-8. Процитовано 15 червня 2019.
- White Paper: Processor Affinity (PDF). — TMurgent Technologies, . Процитовано 15 червня 2019.
- – Linux Programmer's Manual – User Commands
- dplace.1. techpubs.sgi.com (англійською). Silicon Graphics. Архів оригіналу за 1 липня 2017. Процитовано 6 липня 2007.
- – NetBSD Library Functions Manual
- – NetBSD System Manager's Manual
- – Шаблон:Man/FreeBSD
- SetThreadAffinityMask function (winbase.h). Microsoft Docs. Microsoft. 5 грудня 2018. Процитовано 15 червня 2019.
- SetProcessAffinityMask function (winbase.h). Microsoft Docs. Microsoft. 5 грудня 2018. Процитовано 15 червня 2019.
- Thread Affinity API Release Notes. Developer.apple.com (англійською). Apple.
- pbind (1M). Solaris man page (англійською). Oracle Corporation. Процитовано 15 червня 2019.
- processor_bind(2). Solaris man page (англійською). Oracle Corporation. 5 листопада 2002. Процитовано 15 червня 2019.
- pset_bind. Solaris man pages (англійською). Oracle Corporation. Процитовано 15 червня 2019.
- Using lgrp_affinity_set(). Memory and Thread Placement Optimization Developer's Guide (англійською). Oracle Corporation. Процитовано 15 червня 2019.