SMP

A HupWiki-ből...

Tartalomjegyzék

Az SMP jelentése

Symmetric Multi Processing vagy Symmetric Multi Processors. Más névfeloldás is szokásos és helyes: Shared Memory Processing.

SMP-nek az egyik féle többprocesszoros rendszert nevezzük. Az SMP esetében több processzor osztozik ugyanazon a memórián (tehát közös a memória), valamint minden processzor egyforma. A ma elterjedt több magos CPU-k SMP rendszerek önmagukban is.

Az egy processzoros rendszereket Uniprocesszoros rendszereknek hívják.

Nagy ellentettje a többprocesszoros rendszerek körében az MPP.

Jelen helyzet

Manapság gyakorlatilag csak SMP rendszert lehet kapni. A multicore (2 magos, 4 magos, 6 magos, 8 magos) CPU-k jóval népszerűbbek, mint az egymagos társaik. Multicore CPU-val szerelt gép önmagában SMP rendszernek tekinthető.

Kevés (régen 2, most 8) CPU (mag) számig az ilyen többprocesszoros rendszerek közül az SMP megoldásokat kínálják a legelérhetőbb áron. Nagyon sok magot (16, 32) már olcsóbb clusterrel előállítani, 64, 128 mag esetén már csak a cluster vagy klasszikus NUMA architektúra elérhető.

valódi SMP

A PC (i386 kompatibilis) világban az első SMP rendszerek csak memóriaelérés tekintetében voltak szimmetrikusak, vagyis minden (mind a kettő) CPU ugyan látta ugyan azt a memóriát, azonban egyéb hardver erőforrások nem voltak megosztva. Pl interruprok kizárólag az egyik (az első) CPU-hoz futottak be. Hasonlóan, az operációs rendszerek fejlődésében is volt egy olyan szakasz, amikor a hardver ugyan SMP volt, aoznban a kernel csak az egyik CPU-n tudott futni, és legfeljebb a jól megírt alkalmazások használhattak ki 2 CPU-t. Ezen limitációk megszünése miatt kezdett megjelenni a marketing anyagokban a "Valódi SMP" elnevezés. Azonban a mai rendszerekben is van valami (általában nem lényeges) dolog, ami az egyik CPU-hoz van rendelve, emiatt sérti a szimmetrikusságot. Olysamik, hogy pl a firmware vagy a BIOS csak az egyik CPU-n képes dolgozni, vagy hasonlók.

programozása

az SMP rendszerekhez leginkább a multithread pthread programozási modell illik. Általában elmondható, hogy több szálon programozni nehezebb, mint egy szálon. A közös erőforrás (memória) hozzáférésnél előfordulhat, hogy két CPU egyszerre akarja módosítani azt a memóriát. Erre a programozónak ügyelni kell, ez megnehezíti a programozást. Az "ügyelni kell" általában azt jelenti, hogy a közös erőforráshoz való nyúlás (a közös adat módosítása) elött szólni kell a többi szálnak, hogy most kizárolagos hozzáférés történik, majd utána, hogy ennek a kizárólagosságnak vége van. Erra a folyamatra lock, mutex, semaphore kifejezéseket szokták használni, attól függően, hogy pontosan hogyan történik.

Vegyünk egy roppant egyszerű példát, hogy a program számolja, hogy egy eljárás hányszor lett meghívva.

Egyszálú megoldás:

1 eljárás eleje
3 számláló növelése 
5 eljárás vége

Többszalú megoldás:

1 eljárás eleje
2 számlálóhoz való kizárólagos hozzáférés kérése (lock)
3 számláló növelése 
4 számlálóhoz való kizárólagos hozzáférés elengedése (unlock)
5 eljárás vége

(2) esetén, ha már egy másik szál éppen növeli a számlálót (lockolva van), akkor ez a szál a (2) soron áll. Megvárja, amíg a másik szál elér a (4) -hez, és csak utána halad tovább. Azt szokták mondani, hogy lockolja, meg azt, hogy várakozik a lockra. Az igazi gond nem a lockolás maga, hanem az, hogy mit és hogyan lockoljunk. Ha mindent lockolunk, akkor egyszerűbb megírni helyesre a programot, azonban a lock csak egyetlen szálat enged futni: elvész a teljesítmény. Ha keveset lockolunk, pláne, ha sokféle lockot használunk, akkor bonyolódik a program, megnő a hiba esélye.