Кіріспе

CPU процессордың белгілі бір өзегіне тапсырма беру – процессорлық байланыс немесе «кэш байланысы» деп аталады. Бұл процесс немесе жиектерді орталық процессорға (CPU) немесе процессорлар тізбегіне бекітуге және босатуға мүмкіндік береді, соның салдарынан процесс немесе жиек кез келген процессордың орнына белгіленген процессорда немесе процессорларда ғана орындалады. Мұны симметриялық көппроцессорлық жүйедегі негізгі орталық кезекті жоспарлау алгоритмінің өзгеруі ретінде қарастыруға болады. Кезектегі әрбір элемент өзінің байланысты процессорды көрсететін белгімен жабдықталған. Ресурстарды бөлу кезінде әрбір тапсырма басқа процессорларға қарағанда байланысты процессорға басымдық беріледі. Процессорлық байланыс, белгілі бір процессорда орындалған процесс қалдықтары сол процессордың жай-күйінде (мысалы, кэш жадындағы деректер) басқа процесс орындалғаннан кейін де сақталуы мүмкін екенін пайдаланады. Көп процессорлық жүктемеге түсетін және аз үзіліске ие процесске бір процессорда орындалуы тапсырманы орындау жылдамдығын арттыруға мүмкіндік береді, себебі кэштен қате шығу сияқты жағымсыз жағдайлар азаяды. Алайда, бұл қарапайым бағдарламаларды баяулатуы мүмкін, себебі олар процессордың босатылуын күтуге мәжбүр болады. Процессорлық байланыстың нақты мысалы – графикалық рендеринг бағдарламасы сияқты, жиектелмеген қосымшаның бірнеше даналарын іске қосу. Жоспарлау алгоритмінің іске асырылуы процессорлық байланысқа қатысты әртүрлі болуы мүмкін. Кейбір жағдайларда, егер бұл тиімділікті арттырса, кейбір іске асырулар тапсырманы басқа процессорға ауыстыруға рұқсат береді. Мысалы, егер екі процессорлық жүктемеге түсетін тапсырма (A және B) бір процессорға байланысқан болса, ал екінші процессор бос болса, көптеген жоспарлаушылар процессорды толық пайдалану үшін B тапсырмасын екінші процессорға ауыстырады. Содан кейін B тапсырмасы екінші процессормен байланысады, ал A тапсырмасы бастапқы процессормен байланысын сақтайды.

Қолданылуы

Процессордың жақындығы кэш проблемаларын тиімді түрде азайта алады, бірақ ол тұрақты жүктемені теңестіру мәселесін шеше алмайды. Сондай-ақ, процессордың жақындығы біркелкі емес архитектурасы бар жүйелерде күрделене түсетінін ескеріңіз. Мысалы, екі екі ядролы, гиперпотокты процессордан тұратын жүйе жоспарлау алгоритмі үшін қиындық тудырады. Гиперпоток арқылы бір ядрода іске асырылған екі виртуалды процессор арасында толық жақындық, бір физикалық процессордағы екі ядро арасында ішінара жақындық (ядролар кейбір, бірақ барлық емес, кэшті бөліседі), ал жеке физикалық процессорлар арасында жақындық жоқ. Басқа ресурстар да ортақ пайдаланылатындықтан, процессордың жақындығы ғана процессорды жіберу үшін негіз ретінде қолданыла алмайды. Егер процесс белгілі бір ядродағы бір виртуалды гиперпотокты процессорда орындалса, және сол виртуалды процессор қазіргі уақытта жұмыс істесе, бірақ оның жұптас процессоры бос болса, кэш жақындығы процесті бос жұптас процессорға жіберуді ұсынады. Дегенмен, екі виртуалды процессор негізінен барлық есептеу, кэш және жад ресурстары үшін бәсекелеседі. Мұндай жағдайда, егер басқа ядро немесе процессор бос болса, процесті басқа ядроға жіберу тиімдірек болуы мүмкін. Бұл процесс кэшті қайта толтырғанда белгілі бір уақытты қажет етуі мүмкін, бірақ жалпы өнімділік жоғары болуы мүмкін, себебі процесс процессор ішіндегі ресурстар үшін бәсекелесуге қатыспайды.

Арнайы операциялық жүйелер

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-мен басқаруға болады.