A processzoraffinitás vagy processzoraffinitás vagy gyorsítótár - affinitás egy olyan technológia, amely biztosítja, hogy egy folyamatot vagy szálat egy adott CPU-maghoz, CPU-hoz vagy processzorkészlethez rögzítsék és leválasztják , így a folyamat vagy szál csak a megadott magon fut. , processzor vagy processzorok, és nem a többprocesszoros rendszer egyetlen processzorán sem. A processzoraffinitás felfogható a többprocesszoros operációs rendszer központi feladatsor-ütemezési algoritmusának módosításaként. A feladatsor minden eleméhez tartozik egy címke , amely megadja a hozzá tartozó "kapcsolódó" processzorokat.
Az erőforrások lefoglalásakor az egyes feladatokat előnyösen a „kapcsolódó” processzorok egyikén kell végrehajtani. A processzoraffinitás azt a tényt használja ki, hogy egy adott processzoron korábban futó folyamat adatai és beállításai gyorsabban elérhetők lehetnek az adott processzor számára, mint egy másik processzor számára. Ez megtörténhet például a processzor gyorsítótárában lévő folyamatadatok gyorsítótárazása miatt, valamint néhány más helyzetben. Egy ilyen folyamat ütemezése ugyanazon a processzoron való futtatásra javítja a teljesítményét azáltal, hogy csökkenti a teljesítményt rontó eseményeket, például a gyorsítótár elvesztését.
Ezenkívül egyes rendszerekben mindegyik processzor gyorsabban hozzáférhet a RAM egy hozzá közeli régiójához. Ugyanakkor ésszerűnek bizonyul a folyamat folyamatos kötése a processzorhoz, amelynek gyorsabb a hozzáférése a RAM-hoz, ahol a folyamat adatai találhatók.
A processzor-affinitás gyakorlati példája egy nem szálas alkalmazás több példányának futtatása, például egyes grafikus renderelő szoftverek.
A processzorhoz való kötés lehetőségét biztosító feladatütemező algoritmus megvalósítása az adott processzorok jellemzőinek és egy többprocesszoros rendszer felépítésének figyelembevételével történik, amelyet egy ilyen algoritmus vezérel majd. Egyes megvalósítások bizonyos körülmények között lehetővé teszik a feladat átvitelét egy másik processzorra, leküzdve a kötést. Ez azokban az esetekben történik, amikor az ütemező szempontjából egy ilyen váltás a feladatvégrehajtás hatékonyságának növekedéséhez vezet. Például, ha két processzorigényes feladat (A és B) ugyanahhoz a processzorhoz van kötve, és a másik processzor nincs használatban, sok ütemező átváltja a B feladatot a második processzorra, hogy a processzorból a lehető legtöbbet hozza ki a rendszer számára. . A B feladatnak az új processzorhoz való ilyen pillanatban való hozzárendelését maga az ütemező állítja be.
A processzoraffinitás hatékonyan csökkentheti a rendszerbe és/vagy a processzor gyorsítótárába jutó adatokkal kapcsolatos problémákat. De nem ad megoldást a terheléselosztási problémákra [1] . A CPU-affinitás összetettebb a heterogén architektúrájú rendszerekben, és kifinomultabb ütemező logikát igényel, mint a teljesen homogén rendszerekben. Például egy két kétmagos CPU -val rendelkező rendszer , amelyek mindegyike támogatja a Hyper-Threading technológiát , problémát jelent az ütemező algoritmus számára, amely CPU-affinitást feltételez. Ha a rendszer még nagyobb számú processzorral rendelkezik, és például önmagában nem teljesen szimmetrikus, akkor a hatékony feladatütemezés problémája még tovább növekszik.
A fenti, két hiperszálas kétmagos processzorral rendelkező példában az ütemezőnek kétszintű kötési rendszert kell megvalósítania. A gyorsítótár hatékonysága szempontjából az ugyanazon a magon belüli munkavégzés a különböző szálakon egyenértékű, és az ütemezőnek joga van szabadon mozgatni egy feladatot szálról szálra. Az egy processzoron belüli különböző magok „közelségének” szintje alacsonyabb, mivel részben közös processzor-gyorsítótárat használnak, a különböző processzorok „közelségének” szintje még alacsonyabb. Mivel más erőforrások is meg vannak osztva, a CPU-affinitás önmagában nem használható a feladatütemezés alapjául. Például, ha egy folyamat nemrég futott egy virtuális hiperszálas CPU-n valamelyik magban, és ez a virtuális CPU jelenleg foglalt, de ugyanazon mag második virtuális CPU-ja tétlen, a gyorsítótár hatékonyságán alapuló processzoraffinitás azt jelenti, hogy a folyamat át kell vinni egy második (nem futó) azonos magú virtuális processzorra. A két virtuális CPU azonban szinte az összes számítási erőforrásért, gyorsítótár memóriáért és memóriaerőforrásért verseng. Ebben a helyzetben általában hatékonyabb lenne a folyamatot egy másik maghoz vagy CPU-hoz rendelni, ha vannak közöttük üresjáratok. Ez egyszeri teljesítményhiányt eredményezhet, mivel az áthelyezett folyamatnak újra fel kell töltenie a gyorsítótárat adataival. Az általános teljesítmény azonban jobb is lehet, mert a két folyamatnak nem kell versenyeznie ugyanazon a CPU-n belüli erőforrásokért.
A maximális hatékonyság elérése érdekében a feladatütemezőnek mindezeket a szempontokat figyelembe kell vennie. A még nagyobb aszimmetriaszintű rendszerek ( NUMA , fürtök stb.) még nagyobb komplexitást igényelnek az ütemezőtől.
Linuxon egy folyamat processzoraffinitása megtudható vagy beállítható a taskset segédprogrammal [2] . Programozottan ugyanezek a műveletek végrehajthatók a sched_getaffinity és a sched_setaffinity [3] rendszerhívásokkal . A szál affinitása beállítható vagy módosítható a következő könyvtári függvények egyikével: pthread_setaffinity_np [4] vagy pthread_attr_setaffinity_np [5] .
SGI rendszereken egy folyamat a dplace segédprogram segítségével [6] processzorkészlethez társítható .
A DragonFly BSD 1.9 (2007) és újabb verzióiban az usched_set [7] [8] rendszerhívás használható a CPU-affinitás szabályozására . NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 és újabb verziókban a pthread_setaffinity_np és pthread_getaffinity_np [ 9] rendszerhívások használhatók . A NetBSD -ben a [10] psrset segédprogram beállítja egy szál affinitását egy adott CPU-készlethez. A FreeBSD a cpuset [11] segédprogramot használja processzorkészletek létrehozására és folyamatok hozzárendelésére. A DragonFly BSD 3.1 (2012) és újabb verzióiban az usched segédprogram használható folyamatok hozzárendelésére egy adott processzorkészlethez [12] .
Windows NT és újabb rendszereken a szál- és folyamataffinitások külön állíthatók be a SetThreadAffinityMask [13] és a SetProcessAffinityMask [14] API-hívásokkal vagy a Feladatkezelő felületen keresztül (csak folyamatok esetén).
A macOS egy kötési API-t [15] biztosít, amely tippeket ad az operációs rendszer kernelének a szálak kötési készletek szerinti ütemezéséhez.
A Solaris rendszeren a pbind segédprogram [16] segítségével szabályozhatja a folyamatok és a könnyű folyamatok processzorhoz való kötését . A processor_bind [17] rendszerhívás is rendelkezésre áll . Magasabb szintű interfészhívások is elérhetőek, nevezetesen a pset_bind [18] vagy az lgrp_affinity_get [19] , a processzorkészlet és a helycsoport fogalmát használva.
AIX rendszeren a folyamat-összerendeléseket a bindprocessor [ 20] [21] segédprogram és a bindprocessor [20 ] [ 22 ] rendszerhívás segítségével kezelheti .
A z/OS a manapság talán legkifinomultabb feladatütemezőt valósítja meg. Ez biztosítja a hardver erőforrások dinamikusan változó újraelosztását a folyamatok között, beleértve azokat is, amelyek a folyamatok egyes processzormagokhoz, processzorokhoz és csoportjaikhoz való kötésén alapulnak [23].
A Julia párhuzamos programozási nyelv szabványos könyvtára kísérleti támogatást tartalmaz a folyamat-processzor affinitáshoz [24] .