Кіріспе
CPU процессордың белгілі бір өзегіне тапсырма беру – процессорлық байланыс немесе «кэш байланысы» деп аталады. Бұл процесс немесе жиектерді орталық процессорға (CPU) немесе процессорлар тізбегіне бекітуге және босатуға мүмкіндік береді, соның салдарынан процесс немесе жиек кез келген процессордың орнына белгіленген процессорда немесе процессорларда ғана орындалады. Мұны симметриялық көппроцессорлық жүйедегі негізгі орталық кезекті жоспарлау алгоритмінің өзгеруі ретінде қарастыруға болады. Кезектегі әрбір элемент өзінің байланысты процессорды көрсететін белгімен жабдықталған. Ресурстарды бөлу кезінде әрбір тапсырма басқа процессорларға қарағанда байланысты процессорға басымдық беріледі. Процессорлық байланыс, белгілі бір процессорда орындалған процесс қалдықтары сол процессордың жай-күйінде (мысалы, кэш жадындағы деректер) басқа процесс орындалғаннан кейін де сақталуы мүмкін екенін пайдаланады. Көп процессорлық жүктемеге түсетін және аз үзіліске ие процесске бір процессорда орындалуы тапсырманы орындау жылдамдығын арттыруға мүмкіндік береді, себебі кэштен қате шығу сияқты жағымсыз жағдайлар азаяды. Алайда, бұл қарапайым бағдарламаларды баяулатуы мүмкін, себебі олар процессордың босатылуын күтуге мәжбүр болады. Процессорлық байланыстың нақты мысалы – графикалық рендеринг бағдарламасы сияқты, жиектелмеген қосымшаның бірнеше даналарын іске қосу. Жоспарлау алгоритмінің іске асырылуы процессорлық байланысқа қатысты әртүрлі болуы мүмкін. Кейбір жағдайларда, егер бұл тиімділікті арттырса, кейбір іске асырулар тапсырманы басқа процессорға ауыстыруға рұқсат береді. Мысалы, егер екі процессорлық жүктемеге түсетін тапсырма (A және B) бір процессорға байланысқан болса, ал екінші процессор бос болса, көптеген жоспарлаушылар процессорды толық пайдалану үшін B тапсырмасын екінші процессорға ауыстырады. Содан кейін B тапсырмасы екінші процессормен байланысады, ал A тапсырмасы бастапқы процессормен байланысын сақтайды.
Processor affinity, or CPU pinning or "cache affinity", enables the binding and unbinding of a process or a thread to a central processing unit (CPU) or a range of CPUs, so that the process or thread will execute only on the designated CPU or CPUs rather than any CPU. This can be viewed as a modification of the native central queue scheduling algorithm in a symmetric multiprocessing operating system. Each item in the queue has a tag indicating its kin processor. At the time of resource allocation, each task is allocated to its kin processor in preference to others. Processor affinity takes advantage of the fact that remnants of a process that was run on a given processor may remain in that processor's state (for example, data in the cache memory) after another process was run on that processor. Scheduling a CPU intensive process that has few interrupts to execute on the same processor may improve its performance by reducing degrading events such as cache misses, but may slow down ordinary programs because they would need to wait for that CPU to become available again. A practical example of processor affinity is executing multiple instances of a non threaded application, such as some graphics rendering software. Scheduling algorithm implementations vary in adherence to processor affinity. Under certain circumstances, some implementations will allow a task to change to another processor if it results in higher efficiency. For example, when two processor intensive tasks (A and B) have affinity to one processor while another processor remains unused, many schedulers will shift task B to the second processor in order to maximize processor use. Task B will then acquire affinity with the second processor, while task A will continue to have affinity with the original processor.
Қолданылуы
Процессордың жақындығы кэш проблемаларын тиімді түрде азайта алады, бірақ ол тұрақты жүктемені теңестіру мәселесін шеше алмайды. Сондай-ақ, процессордың жақындығы біркелкі емес архитектурасы бар жүйелерде күрделене түсетінін ескеріңіз. Мысалы, екі екі ядролы, гиперпотокты процессордан тұратын жүйе жоспарлау алгоритмі үшін қиындық тудырады. Гиперпоток арқылы бір ядрода іске асырылған екі виртуалды процессор арасында толық жақындық, бір физикалық процессордағы екі ядро арасында ішінара жақындық (ядролар кейбір, бірақ барлық емес, кэшті бөліседі), ал жеке физикалық процессорлар арасында жақындық жоқ. Басқа ресурстар да ортақ пайдаланылатындықтан, процессордың жақындығы ғана процессорды жіберу үшін негіз ретінде қолданыла алмайды. Егер процесс белгілі бір ядродағы бір виртуалды гиперпотокты процессорда орындалса, және сол виртуалды процессор қазіргі уақытта жұмыс істесе, бірақ оның жұптас процессоры бос болса, кэш жақындығы процесті бос жұптас процессорға жіберуді ұсынады. Дегенмен, екі виртуалды процессор негізінен барлық есептеу, кэш және жад ресурстары үшін бәсекелеседі. Мұндай жағдайда, егер басқа ядро немесе процессор бос болса, процесті басқа ядроға жіберу тиімдірек болуы мүмкін. Бұл процесс кэшті қайта толтырғанда белгілі бір уақытты қажет етуі мүмкін, бірақ жалпы өнімділік жоғары болуы мүмкін, себебі процесс процессор ішіндегі ресурстар үшін бәсекелесуге қатыспайды.
Арнайы операциялық жүйелер
Linux-та процестің CPU-ға жақындығын taskset(1) бағдарламасы және sched_setaffinity(2) жүйелік шақыру арқылы өзгертуге болады. Сызымның жақындығы кітапхана функцияларының бірімен өзгертілуі мүмкін: pthread_setaffinity_np(3) немесе pthread_attr_setaffinity_np(3). SGI жүйелерінде dplace процесті процессорлар жиынтығына байланыстырады. DragonFly BSD 1.9 (2007) және одан кейінгі нұсқаларда usched_set жүйелік шақыру процестің жақындығын басқару үшін пайдаланылуы мүмкін. NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 және одан кейінгі нұсқаларда pthread_setaffinity_np және pthread_getaffinity_np қолдануға болады. NetBSD-де psrset құралы белгілі бір CPU жиынтығына сызымның жақындығын орнату үшін пайдаланылады. FreeBSD-де cpuset құралы CPU жиынтықтарын құру және осы жиынтықтарға процестерді тағайындау үшін қолданылады. DragonFly BSD 3.1 (2012) және одан кейінгі нұсқаларында usched құралын белгілі бір CPU жиынтығына процестерді тағайындау үшін пайдалануға болады. Windows NT және оның кейінгі нұсқаларында, сызымдар мен процестердің CPU-ға жақындығын SetThreadAffinityMask және SetProcessAffinityMask API шақырулары арқылы немесе Тапсырмалар менеджерінің интерфейсі арқылы (тек процестер үшін) бөлек орнатуға болады. macOS жақындық API-ін ұсынады, ол ядроға сызымдарды жақындық жиынтықтарына сәйкес қалай жоспарлауға болатындығы туралы кеңес береді. Solaris-те процесстер мен LWP-лерді pbind(1) бағдарламасын пайдалану арқылы процессорға байланыстыруды басқаруға болады. Жақындықты бағдарламалық түрде басқару үшін processor_bind(2) қолданылуы мүмкін. Процессорлық жиынтық және жергілікті топтар тұжырымдамаларын пайдалана отырып, pset_bind(2) немесе lgrp_affinity_get(3LGRP) сияқты жалпы интерфейстер бар. AIX-те процестердің байланысын bindprocessor командасы мен bindprocessor API-мен басқаруға болады.