Hem Svampar Implementering av en flertrådig spelmotorarkitektur. Flaskhals av von Neumann arkitektur

Implementering av en flertrådig spelmotorarkitektur. Flaskhals av von Neumann arkitektur

Introduktion. Datortekniken utvecklas i snabb takt. Datorenheter blir kraftfullare, mindre, mer bekväma, men på senare tid har det blivit ett stort problem att öka enheternas prestanda. 1965 kom Gordon Moore (en av Intels grundare) till slutsatsen att "antalet transistorer placerade på ett integrerat kretschip fördubblas var 24:e månad."

Den första utvecklingen inom området för att skapa multiprocessorsystem började på 70-talet. Under lång tid ökade prestandan hos välbekanta enkärniga processorer genom att öka klockfrekvensen (upp till 80% av prestandan bestämdes endast av klockfrekvensen) med en samtidig ökning av antalet transistorer på ett chip. Fysikens grundläggande lagar stoppade denna process: chipsen började överhettas, den tekniska började närma sig storleken på kiselatomer. Alla dessa faktorer har lett till:

  • läckströmmar har ökat, vilket har lett till att värmeavledning och energiförbrukning har ökat.
  • Processorn har blivit mycket "snabbare" än minnet. Prestandan försämrades på grund av fördröjningen av åtkomst till RAM och inläsning av data i cachen.
  • det finns något sådant som en "von Neumann-flaskhals". Det betyder ineffektiviteten hos processorarkitekturen när ett program körs.

Multiprocessorsystem (som ett av sätten att lösa problemet) användes inte i stor utsträckning, eftersom de krävde dyra och svåra att tillverka multiprocessormoderkort. Utifrån detta ökade produktiviteten på andra sätt. Konceptet med multithreading visade sig vara effektivt - den samtidiga bearbetningen av flera strömmar av kommandon.

Hyper-Threading Technology (HTT) eller superthreading-teknik som gör att en processor kan köra flera programtrådar på en enda kärna. Det var HTT, enligt många experter, som blev förutsättningen för skapandet av flerkärniga processorer. Exekveringen av processorn av flera programtrådar samtidigt kallas trådnivåparallellism (TLP – trådnivåparallellism).

För att låsa upp potentialen hos en flerkärnig processor måste det körbara programmet använda alla datorkärnor, vilket inte alltid är möjligt. Gamla serieprogram som bara kunde använda en kärna kommer inte längre att köras snabbare på en ny generation processorer, så programmerare är allt mer involverade i utvecklingen av nya mikroprocessorer.

1. Allmänna begrepp

Arkitektur i vid mening är en beskrivning av ett komplext system som består av många element.

Under utvecklingsprocessen utvecklas halvledarstrukturer (mikrokretsar), därför förändras principerna för att konstruera processorer, antalet element som ingår i deras sammansättning, hur deras interaktion är organiserad ständigt. CPU: er med samma grundläggande principer för struktur kallas därför vanligtvis processorer med samma arkitektur. Och dessa principer i sig kallas processorarkitektur (eller mikroarkitektur).

Mikroprocessorn (eller processorn) är huvudkomponenten i en dator. Den bearbetar information, kör program och styr andra enheter i systemet. Processorns kraft avgör hur snabbt program kommer att köras.

Kärnan är grunden för vilken mikroprocessor som helst. Den består av miljontals transistorer placerade på ett kiselchip. Mikroprocessorn är uppdelad i speciella celler, som kallas allmänna register (RON). Processorns arbete består i allmänhet i att extrahera kommandon och data från minnet i en viss sekvens och exekvera dem. Dessutom, för att öka hastigheten på datorn, är mikroprocessorn utrustad med ett internt cacheminne. Cache är processorns interna minne som används som buffert (för att skydda mot avbrott i kommunikationen med RAM).

Intel-processorerna som används i IBM-kompatibla datorer har mer än tusen instruktioner och tillhör processorerna med en utökad instruktionsuppsättning - CISC-processorer (CISC - Complex Instruction Set Computing).

1.1 Högpresterande datoranvändning. Parallellism

Utvecklingstakten för datorteknik är lätt att följa: från ENIAC (den första elektroniska digitaldatorn för allmänna ändamål) med en prestanda på flera tusen operationer per sekund till superdatorn Tianhe-2 (1000 biljoner flyttalsoperationer per sekund). Det betyder att beräkningshastigheten har ökat med en biljon gånger på 60 år. Skapandet av högpresterande datorsystem är en av de svåraste vetenskapliga och tekniska uppgifterna. Medan hårdvarans beräkningshastighet bara har ökat med några miljoner gånger, har den totala beräkningshastigheten ökat med biljoner gånger. Denna effekt uppnås genom användning av parallellitet i alla beräkningsstadier. Parallell beräkning kräver sökandet efter en rationell fördelning av minne, tillförlitliga sätt att överföra information och koordinering av beräkningsprocesser.

1.2 Symmetrisk multiprocessing

Symmetric Multiprocessing (förkortat SMP) eller symmetrisk multiprocessing är en speciell arkitektur av multiprocessorsystem där flera processorer har tillgång till ett delat minne. Detta är en mycket vanlig arkitektur, flitigt använt på senare tid.

När man använder SMP arbetar flera processorer samtidigt i en dator, var och en med sin uppgift. Ett SMP-system med ett högkvalitativt operativsystem fördelar rationellt uppgifter mellan processorer, vilket säkerställer en jämn belastning på var och en av dem. Det finns dock ett problem med minnesomkastning, eftersom även enprocessorsystem kräver relativt lång tid för detta. Således sker åtkomst till RAM i SMP sekventiellt: först en processor, sedan den andra.

På grund av ovanstående funktioner används SMP-system uteslutande inom det vetenskapliga området, industrin, näringslivet, extremt sällan på arbetskontor. Utöver de höga kostnaderna för hårdvaruimplementering kräver sådana system mycket dyr och högkvalitativ programvara som ger flertrådsutförande av uppgifter. Vanliga program (spel, textredigerare) kommer inte att fungera effektivt i SMP-system, eftersom de inte ger denna grad av parallellitet. Om man anpassar vilket program som helst för ett SMP-system blir det extremt ineffektivt att arbeta på enprocessorsystem, vilket leder till att man måste skapa flera versioner av samma program för olika system. Undantaget är till exempel programmet ABLETON LIVE (designat för att skapa musik och förbereda Dj-set), som har stöd för multiprocessorsystem. Om du kör ett vanligt program på ett multiprocessorsystem kommer det fortfarande att köras lite snabbare än på en enskild processor. Detta beror på det så kallade hårdvaruavbrottet (stoppar programmet för bearbetning av kärnan), som exekveras på en annan ledig processor.

Ett SMP-system (som alla andra system baserat på parallell beräkning) ställer ökade krav på en sådan minnesparameter som minnesbussens bandbredd. Detta begränsar ofta antalet processorer i ett system (moderna SMP-system fungerar effektivt med upp till 16 processorer).

Eftersom processorer har delat minne blir det nödvändigt att använda det rationellt och koordinera data. I ett multiprocessorsystem visar det sig att flera cachar fungerar för en delad minnesresurs. Cachekoherens är en cache-egenskap som säkerställer integriteten hos data som lagras i individuella cacher för en delad resurs. Detta koncept är ett specialfall av begreppet minneskoherens, där flera kärnor har tillgång till ett gemensamt minne (det är allestädes närvarande i moderna flerkärniga system). Om vi ​​beskriver dessa begrepp i allmänna termer, så blir bilden följande: samma datablock kan laddas in i olika cacher, där data bearbetas olika.

Om några meddelanden om dataändring inte används kommer ett fel att uppstå. Cachekoherens är utformad för att lösa sådana konflikter och bibehålla konsistens av data i cacheminnet.

SMP-system är en delmängd av MIMD-klassificeringen (multi-instruction multi data computing system) av datorsystem enligt Flynn (professor vid Stanford University, medgrundare av Palyn Associates). Enligt denna klassificering kan nästan alla varianter av parallella system hänföras till MIMD.

Indelningen av multiprocessorsystem i typer sker på basis av uppdelning enligt principen om minnesanvändning. Detta tillvägagångssätt gjorde det möjligt att särskilja följande viktiga typer

multiprocessorsystem - multiprocessorer (multiprocessorsystem med delat delat minne) och multidatorer (system med separat minne). Delad data som används vid parallell beräkning kräver synkronisering. Uppgiften med datasynkronisering är ett av de viktigaste problemen, och dess lösning i utvecklingen av multiprocessor och multicore och följaktligen den nödvändiga programvaran är en prioritet för ingenjörer och programmerare. Data kan delas med fysisk minnesallokering. Detta tillvägagångssätt kallas icke-uniform minnesåtkomst (NUMA).

Dessa system inkluderar:

  • System där endast den individuella processorcachen används för att representera data (minnesarkitektur endast cache).
  • System med lokal cachekoherens för olika processorer (cache-koherent NUMA).
  • System som ger delad åtkomst till individuellt processorminne utan att implementera icke-cache-koherent NUMA på hårdvarunivå.

Förenkling av problemet med att skapa multiprocessorsystem uppnås genom att använda distribuerat delat minne, men denna metod leder till en märkbar ökning av komplexiteten i parallell programmering.

1.3 Samtidig flertrådning

Baserat på alla ovanstående nackdelar med symmetrisk multiprocessing är det vettigt att utveckla och utveckla andra sätt att förbättra prestanda. Om du analyserar driften av varje enskild transistor i processorn kan du uppmärksamma ett mycket intressant faktum - när du utför de flesta beräkningsoperationer är långt ifrån alla processorkomponenter inblandade (enligt nyare studier, cirka 30% av alla transistorer). Således, om processorn utför, säg, en enkel aritmetisk operation, är det mesta av processorn inaktiv, därför kan den användas för andra beräkningar. Så om processorn för närvarande utför verkliga operationer, kan en heltalsaritmetisk operation laddas in i den fria delen. För att öka belastningen på processorn kan du skapa spekulativ (eller avancerad) exekvering av operationer, vilket kräver en stor komplikation av processorns hårdvarulogik. Om programmet fördefinierar trådar (sekvenser av kommandon) som kan utföras oberoende av varandra, kommer detta att avsevärt förenkla uppgiften (denna metod är lätt att implementera på hårdvarunivå). Denna idé, som tillhör Dean Tulsen (utvecklad av honom 1955 vid University of Washington), kallas simultaneous multithreading (simultaneous multithreading). Den utvecklades senare av Intel under namnet hyperthreading. Till exempel, en processor som kör många trådar uppfattas av Windows operativsystem som flera processorer. Användningen av denna teknik kräver återigen en lämplig nivå av mjukvara. Den maximala effekten från användningen av multithreading-teknik är cirka 30 %.

1.4 Flerkärnig

Multithreading-teknik är implementeringen av multi-core på mjukvarunivå. Ytterligare ökning av prestanda kräver som alltid förändringar i processorns hårdvara. Komplikationen av system och arkitekturer är inte alltid effektiv. Det finns en motsatt åsikt: "allt genialt är enkelt!". För att öka processorns prestanda är det faktiskt inte nödvändigt att öka dess klockfrekvens, komplicera logiska komponenter och hårdvarukomponenter, eftersom det räcker att bara rationalisera och förfina den befintliga tekniken. Denna metod är mycket lönsam - det finns inget behov av att lösa problemet med att öka processorns värmeavledning, utveckling av ny dyr utrustning för produktion av mikrokretsar. Detta tillvägagångssätt implementerades som en del av multi-core-tekniken - implementeringen av flera datorkärnor på ett enda chip. Om du tar den ursprungliga processorn och jämför prestandavinsterna från att implementera flera prestandaförbättringar är det tydligt att flerkärnig teknik är det bästa alternativet.

Om vi ​​jämför arkitekturerna för en symmetrisk multiprocessor och en flerkärnig, kommer de att visa sig vara nästan identiska. Kärnornas cacheminne kan vara på flera nivåer (lokalt och delat, och data från RAM-minnet kan laddas direkt in i andranivåns cacheminne). Baserat på de övervägda fördelarna med multi-core-arkitekturen för processorer fokuserar tillverkarna på det. Denna teknik visade sig vara ganska billig att implementera och universell, vilket gjorde det möjligt att ta den till en bred marknad. Dessutom har den här arkitekturen gjort sina egna justeringar av Moores lag: "antalet datorkärnor i processorn kommer att fördubblas var 18:e månad."

Om man tittar på den moderna datorteknikmarknaden kan man se att enheter med fyra- och åttakärniga processorer dominerar. Dessutom säger processortillverkarna att processorer med hundratals processorkärnor snart kommer att synas på marknaden. Som flera gånger har sagts tidigare avslöjas den fulla potentialen av en flerkärnig arkitektur endast med högkvalitativ programvara. Sålunda är produktionssfären för datorhårdvara och mjukvara mycket nära besläktad.

Men med erövringen av nya toppar i frekvensindikatorer blev det svårare att öka det, eftersom detta påverkade ökningen av TDP för processorer. Därför började utvecklarna växa processorer i bredd, nämligen att lägga till kärnor, och konceptet med flera kärnor uppstod.

För bokstavligen 6-7 år sedan var flerkärniga processorer praktiskt taget oerhörda. Nej, flerkärniga processorer från samma IBM-företag fanns tidigare, men utseendet på den första dual-core processorn för stationära datorer, ägde rum först 2005, och denna processor kallades Pentium D. Under 2005 släpptes AMD:s dubbelkärniga Opteron, men för serversystem.

I den här artikeln kommer vi inte att fördjupa oss i historiska fakta i detalj, utan kommer att diskutera moderna flerkärniga processorer som en av CPU:ns egenskaper. Och viktigast av allt - vi måste ta reda på vad denna multi-core ger i form av prestanda för processorn och för dig och mig.

Ökad prestanda med multi-core

Principen för att öka processorprestanda på grund av flera kärnor är att dela upp exekveringen av trådar (olika uppgifter) i flera kärnor. Sammanfattningsvis har nästan varje process som körs på ditt system flera trådar.

Jag kommer genast att reservera att operativsystemet praktiskt taget kan skapa många trådar för sig själv och göra allt samtidigt, även om processorn fysiskt är enkärnig. Denna princip implementerar samma Windows multitasking (till exempel lyssna på musik och skriva samtidigt).


Låt oss ta ett antivirusprogram som exempel. Vi kommer att ha en tråd som skannar datorn, den andra - uppdatering av antivirusdatabasen (vi har förenklat allt för att förstå det allmänna konceptet).

Och fundera på vad som kommer att hända i två olika fall:

a) Enkärnig processor. Eftersom två trådar körs samtidigt, måste vi skapa för användaren (visuellt) denna exekvering samtidigt. Operativsystemet är knepigt:det finns en växling mellan exekveringen av dessa två trådar (dessa växlar är momentana och tiden är i millisekunder). Det vill säga, systemet "utförde" uppdateringen lite, bytte sedan plötsligt till skanning och sedan tillbaka till uppdatering. För dig och mig verkar det alltså som om dessa två uppgifter utförs samtidigt. Men vad går förlorat? Självklart prestation. Så låt oss titta på det andra alternativet.

b) Processorn är flerkärnig. I det här fallet kommer denna omkoppling inte att ske. Systemet kommer tydligt att skicka varje tråd till en separat kärna, vilket som ett resultat gör att vi kan bli av med bytet från tråd till tråd som är skadligt för prestanda (låt oss idealisera situationen). Två trådar löper samtidigt, detta är principen för multi-core och multi-threading. I slutändan kommer vi att utföra skanningar och uppdateringar mycket snabbare på en flerkärnig processor än på en enkärnig. Men det finns en hake - inte alla program stöder multi-core. Inte alla program kan optimeras på detta sätt. Och allt händer långt ifrån att vara så perfekt som vi har beskrivit. Men varje dag skapar utvecklare fler och fler program vars kod är perfekt optimerad för exekvering på flerkärniga processorer.

Är flerkärniga processorer nödvändiga? Vardaglig rimlighet

val av processor för en dator (nämligen när man tänker på antalet kärnor) bör man bestämma huvudtyperna av uppgifter som den kommer att utföra.

För att förbättra kunskaperna inom området datorhårdvara kan du läsa materialet om processorsocklar .

Utgångspunkten kan kallas dual-core-processorer, eftersom det inte är meningsfullt att återgå till enkärniga lösningar. Men dual-core processorer är annorlunda. Det kanske inte är den "senaste" Celeron, eller det kan vara en Core i3 på Ivy Bridge, precis som AMD har Sempron eller Phenom II. Naturligtvis, på grund av andra indikatorer, kommer deras prestanda att vara väldigt olika, så du måste titta på allt på ett heltäckande sätt och jämföra multi-core med andra. processoregenskaper.

Till exempel har Core i3 på Ivy Bridge Hyper-Treading-teknik, vilket gör att du kan bearbeta 4 trådar samtidigt (operativsystemet ser 4 logiska kärnor, istället för 2 fysiska). Och samma Celeron skryter inte med sådant.

Men låt oss återgå direkt till reflektionerna kring de uppgifter som krävs. Om det behövs en dator för kontorsarbete och surfning på Internet räcker det med en dubbelkärnig processor för det.

När det kommer till spelprestanda behöver du 4 kärnor eller fler för att vara bekväm i de flesta spel. Men här dyker själva haken upp: alla spel har inte optimerad kod för 4-kärniga processorer, och om de är optimerade är det inte så effektivt som vi skulle vilja. Men i princip för spel nu är den optimala lösningen just den fjärde kärnan.


Idag är samma 8-kärniga AMD-processorer redundanta för spel, det är antalet kärnor som är redundant, men prestandan är inte i nivå utan de har andra fördelar. Samma 8 kärnor kommer att hjälpa mycket i uppgifter där kraftfullt arbete med en högkvalitativ flertrådig belastning behövs. Detta inkluderar till exempel rendering (beräkning) av video eller serverberäkning. Därför behövs 6, 8 eller fler kärnor för sådana uppgifter. Och snart kommer spel att kunna ladda 8 eller fler kärnor med hög kvalitet, så i framtiden är allt väldigt rosa.

Glöm inte att det fortfarande finns många uppgifter som skapar en entrådig belastning. Och du bör ställa dig frågan: behöver jag den här 8-kärniga eller inte?

Sammanfattningsvis skulle jag återigen vilja notera att fördelarna med multi-core manifesteras under "tungt" beräkningsmässigt flertrådigt arbete. Och om du inte spelar spel med orimliga krav och inte gör specifika typer av arbete som kräver bra datorkraft, så är det helt enkelt inte vettigt att spendera pengar på dyra flerkärniga processorer (

Efter att ha behandlat teorin om multithreading, låt oss överväga ett praktiskt exempel - Pentium 4. Redan i utvecklingsstadiet av denna processor fortsatte Intels ingenjörer att arbeta med att öka dess prestanda utan att göra ändringar i programgränssnittet. Fem enkla metoder övervägdes:

Öka klockfrekvensen;

Placera två processorer på ett chip;

Introduktion av nya funktionsblock;

Transportör förlängning;

Använder multithreading.

Det mest uppenbara sättet att förbättra prestandan är att öka klockhastigheten utan att ändra andra parametrar. Som regel har varje efterföljande processormodell en något högre klockhastighet än den föregående. Tyvärr, med en rät linje ökning av klockhastigheten, ställs utvecklare inför två problem: ökad strömförbrukning (vilket är relevant för bärbara datorer och andra batteridrivna datorenheter) och överhettning (vilket kräver effektivare kylflänsar).

Den andra metoden – att placera två processorer på ett chip – är relativt enkel, men det innebär att chippets yta fördubblas. Om varje processor förses med sin egen cache halveras antalet chips per wafer, men det innebär också dubbelt så mycket produktionskostnad. Om båda processorerna har ett delat cacheminne kan en betydande ökning av det ockuperade området undvikas, men i det här fallet uppstår ett annat problem - mängden cacheminne per processor halveras, och detta påverkar oundvikligen prestandan. Dessutom, medan professionella serverapplikationer kan fullt ut utnyttja resurserna hos flera processorer, har vanliga skrivbordsprogram mycket mindre intern parallellitet.

Införandet av nya funktionsblock är inte heller svårt, men det är viktigt att hitta en balans här. Vad är poängen med ett dussin ALU om chipet inte kan ge instruktioner till pipelinen i en takt som kan ladda alla dessa ALU?

En pipeline med ett ökat antal steg, som kan dela upp uppgifter i mindre segment och bearbeta dem under korta tidsperioder, förbättrar å ena sidan prestandan, å andra sidan ökar de negativa konsekvenserna av felförutsägelser av övergångar, cachemissar, avbrott och andra händelser som stör den normala kursinstruktionsbehandlingen i processorn. Dessutom, för att fullt ut förverkliga kapaciteten hos den utökade rörledningen, är det nödvändigt att öka klockfrekvensen, och detta leder som vi vet till ökad energiförbrukning och värmeavledning.

Slutligen kan du implementera multithreading. Fördelen med denna teknik är att den introducerar en extra mjukvaru-tråd som gör att hårdvaruresurser som annars skulle vara lediga kan tas i bruk. Baserat på resultaten från experimentella studier fann Intel-utvecklare att en ökning av chipytan med 5 % vid implementering av multithreading för många applikationer ger en prestandaökning på 25 %. Xeon var den första Intel-processorn som stödde multithreading 2002. Därefter, med start vid 3,06 GHz, introducerades multithreading i Pentium 4. Intel kallar implementeringen av multithreading i Pentium 4 hyperthreading.

* alltid aktuella frågor, vad du bör vara uppmärksam på när du väljer en processor, för att inte göra ett misstag.

Vårt mål i den här artikeln är att beskriva alla faktorer som påverkar processorprestanda och andra prestandaegenskaper.

Det är förmodligen ingen hemlighet för någon att processorn är den huvudsakliga beräkningsenheten i en dator. Man kan till och med säga - den viktigaste delen av datorn.

Det är han som sköter nästan alla processer och uppgifter som förekommer i datorn.

Oavsett om det är att titta på videor, musik, surfa på Internet, skriva och läsa i minnet, bearbeta 3D och video, spel. Och många fler.

Därför att välja C central P processor, bör behandlas mycket försiktigt. Det kan visa sig att du bestämmer dig för att installera ett kraftfullt grafikkort och en processor som inte motsvarar dess nivå. I det här fallet kommer processorn inte att avslöja grafikkortets potential, vilket kommer att sakta ner dess arbete. Processorn kommer att vara fulladdad och bokstavligen koka, och grafikkortet väntar på sin tur och arbetar med 60-70% av dess kapacitet.

Det är därför, när du väljer en balanserad dator, inte kostar försumma processorn till förmån för ett kraftfullt grafikkort. Processorkraften borde räcka för att låsa upp grafikkortets potential, annars är det bara pengar som slängs.

Intel vs. AMD

*jaga för alltid

Företag Intel, har enorma mänskliga resurser och nästan outtömlig ekonomi. Många innovationer inom halvledarindustrin och nya teknologier kommer från detta företag. Processorer och utvecklingar Intel, i genomsnitt för 1-1,5 år före ingenjörernas utveckling AMD. Men som du vet måste du betala för möjligheten att ha den modernaste tekniken.

Processor prispolicy Intel, är baserad på antal kärnor, cachebelopp, men också på arkitekturens "friskhet"., prestanda per klockawatt,chipprocessteknik. Värdet på cacheminnet, "finanserna i den tekniska processen" och andra viktiga egenskaper hos processorn kommer att övervägas nedan. För att ha sådan teknik som en gratis frekvensmultiplikator måste du också betala ett extra belopp.

Företag AMD, till skillnad från företaget Intel, strävar efter tillgängligheten för sina processorer för slutkonsumenten och för en kompetent prispolicy.

Man kan till och med säga det AMD– « Folkets stämpel". I dess prislappar hittar du det du behöver till ett mycket attraktivt pris. Vanligtvis ett år efter införandet av en ny teknik, företaget Intel, en analog av tekniken från AMD. Om du inte jagar den högsta prestandan och är mer uppmärksam på prislappen än på närvaron av avancerad teknik, då företagets produkter AMD- bara för dig.

Prispolicy AMD, baseras mer på antalet kärnor och mycket lite på mängden cacheminne, förekomsten av arkitektoniska förbättringar. I vissa fall, för möjligheten att ha ett cacheminne på den tredje nivån, måste du betala lite extra ( Fenomen har ett cacheminne nivå 3, Athlon innehåll med endast begränsade, 2 nivåer). Men ibland AMD skämmer bort sina fans förmågan att låsa upp billigare processorer till dyrare. Du kan låsa upp kärnor eller cacheminne. Förbättra Athlon innan Fenomen. Detta är möjligt på grund av den modulära arkitekturen och bristen på några billigare modeller, AMD inaktiverar helt enkelt några dyrare on-chip-block (genom programvara).

Kärnor– förbli praktiskt taget oförändrade, endast deras antal skiljer sig (gäller för processorer 2006-2011 år). På grund av modulariteten hos dess processorer gör företaget ett utmärkt jobb med att sälja avvisade chips, som, när vissa block stängs av, blir en processor från en mindre produktiv linje.

Företaget har arbetat med en helt ny arkitektur i många år under kodnamnet Bulldozer, men vid tidpunkten för utgivningen 2011 år visade nya processorer inte den bästa prestandan. AMD syndade på operativsystem att de inte förstår de arkitektoniska egenskaperna hos dubbla kärnor och "annan multithreading".

Enligt företagsrepresentanter bör du vänta på speciella korrigeringar och patchar för att känna full prestanda hos dessa processorer. Dock i början 2012 år sköt företagets representanter upp lanseringen av en uppdatering för att stödja arkitekturen Bulldozer för andra halvåret.

Processorfrekvens, antal kärnor, multitrådning.

Ibland Pentium 4 och framför honom CPU-frekvens, var den huvudsakliga processorprestandafaktorn när man valde en processor.

Detta är inte förvånande, eftersom processorarkitekturer var speciellt designade för att uppnå höga frekvenser, detta återspeglades särskilt i processorn Pentium 4 på arkitektur nätburst. Hög frekvens var inte effektiv med den långa pipeline som användes i arkitekturen. Även Athlon XP frekvens 2GHz, när det gäller prestanda var högre än Pentium 4 c 2,4 GHz. Så det var ren marknadsföring. Efter detta fel, företaget Intel Jag insåg mina misstag och tillbaka till den goda sidan Jag började arbeta inte med frekvenskomponenten, utan med prestanda per klocka. Från arkitektur nätburst fick vägra.

Vad oss ger flera kärnor?

Fyrkärnig processor 2,4 GHz, i flertrådade applikationer, skulle teoretiskt sett vara ungefär lika med en enkärnig processor med en frekvens på 9,6 GHz eller 2-kärnig processor med en frekvens 4,8 GHz. Men det är bara i teorin. Praktiskt tagetå andra sidan kommer två dual-core processorer i två sockets moderkort att vara snabbare än en 4-core processor vid samma driftsfrekvens. Busshastighetsgränser och minnesfördröjningar gör sig påminda.

* Med förbehåll för samma arkitekturer och mängden cacheminne

Multi-core, gör det möjligt att utföra instruktioner och beräkningar i delar. Till exempel måste du utföra tre aritmetiska operationer. De två första exekveras på var och en av processorkärnorna och resultaten läggs till i cacheminnet, där nästa åtgärd kan utföras med dem av vilken som helst av de lediga kärnorna. Systemet är väldigt flexibelt, men utan ordentlig optimering kanske det inte fungerar. Därför är optimering för multi-core för arkitekturen för processorer i OS-miljön mycket viktig.

Appar som "älskar" och använda sig av multithreading: arkiverare, videospelare och kodare, antivirus, defragmenteringsprogram, grafisk redaktör, webbläsare, Blixt.

Även "fans" av multithreading inkluderar sådana operativsystem som Windows 7 Och Windows Vista, liksom många OS, baserat på kärnan linux, som går märkbart snabbare med en flerkärnig processor.

Mest spel, ibland räcker det med en 2-kärnig processor vid en hög frekvens. Nu finns det dock fler och fler spel "vässade" för multithreading. Ta åtminstone dessa sandlåda spel som GTA 4 eller prototyp, där på en 2-kärnig processor med en frekvens nedan 2,6 GHz- du känner dig inte bekväm, bildfrekvensen faller under 30 bilder per sekund. Även om i det här fallet är orsaken till sådana incidenter troligen den "svaga" optimeringen av spel, brist på tid eller "inte direkta" händer hos de som överförde spel från konsoler till PC.

När du köper en ny processor för spel bör du nu vara uppmärksam på processorer med 4 eller fler kärnor. Men ändå, försumma inte de 2-kärniga processorerna från den "övre kategorin". I vissa spel känns dessa processorer ibland bättre än vissa flerkärniga.

Processorns cache.

- Detta är ett dedikerat område av processorchippet, där mellanliggande data bearbetas och lagras mellan processorkärnor, RAM och andra bussar.

Den körs med en mycket hög klockhastighet (vanligtvis på frekvensen av själva processorn), har en mycket hög bandbredd och processorkärnor arbetar direkt med den ( L1).

På grund av henne brist, kan processorn vara inaktiv i tidskrävande uppgifter och vänta på att ny data ska bearbetas i cachen. Även cacheminne tjänar till register över ofta upprepade data som snabbt kan återställas vid behov utan onödiga beräkningar, utan att tvinga processorn att slösa tid på dem igen.

Prestanda lägger också till det faktum att om cacheminnet kombineras, och alla kärnor kan lika mycket använda data från den. Detta ger ytterligare möjligheter till flertrådsoptimering.

Denna teknik används nu för nivå 3 cache. För processorer Intel det fanns processorer med en kombinerad nivå 2-cache ( C2D E 7***,E8***), tack vare vilken denna metod verkade öka multitrådsprestanda.

Vid överklockning av processorn kan cacheminnet bli en svag punkt, vilket hindrar processorn från att överklocka mer än sin maximala driftsfrekvens utan fel. Fördelen är dock att den kommer att köras på samma frekvens som den överklockade processorn.

I allmänhet gäller att ju större cacheminnet är snabbare CPU. I vilka applikationer?

I alla applikationer där mycket flyttalsdata, instruktioner och trådar används används cacheminne aktivt. Cache-minne är mycket populärt arkiverare, videokodare, antivirus Och grafisk redaktör etc.

Fördelaktigt till en stor mängd cacheminne är spel. Speciellt strategier, auto-sims, RPGs, SandBox och alla spel där det finns mycket små detaljer, partiklar, geometrielement, informationsflöden och fysiska effekter.

Cacheminne spelar en mycket viktig roll för att låsa upp potentialen hos system med 2 eller fler grafikkort. När allt kommer omkring faller en del av belastningen på interaktionen mellan processorkärnorna både sinsemellan och för att arbeta med strömmarna från flera videochips. Det är i det här fallet som organisationen av cacheminnet är viktig, och cacheminnet för den tredje nivån av en stor volym är mycket användbart.

Cacheminnet är alltid utrustat med skydd mot eventuella fel ( ECC), vid upptäckt av vilka de korrigeras. Detta är mycket viktigt, eftersom ett litet fel i cacheminnet, under bearbetning, kan förvandlas till ett gigantiskt, kontinuerligt fel, från vilket hela systemet kommer att "ligga ner".

Företagsteknologier.

(Hyper Threading, HT)–

för första gången användes tekniken i processorer Pentium 4, men det fungerade inte alltid korrekt och saktade ofta ner processorn mer än accelererade den. Anledningen var en för lång pipeline och ett oavslutat förgreningssystem. Tillämpas av företaget Intel, det finns inga analoger till tekniken än, om det inte anses vara en analog då? vad företagets ingenjörer genomförde AMD inom arkitektur Bulldozer.

Principen för systemet är sådan att för varje fysisk kärna, två datortrådar, istället för en. Det vill säga om du har en 4-kärnig processor med HT (Core i 7), så har du virtuella trådar 8 .

Prestandavinsten uppnås på grund av att data kan komma in i pipelinen redan i mitten, och inte nödvändigtvis i början. Om några processorenheter som kan utföra denna åtgärd är inaktiva får de en uppgift som ska utföras. Prestandaökningen är inte densamma som för riktiga fysiska kärnor, utan jämförbar (~ 50-75 %, beroende på typ av applikation). Det är ganska sällsynt att i vissa applikationer, HT påverkar negativt på prestanda. Detta beror på dålig optimering av applikationer för denna teknik, oförmågan att förstå att det finns "virtuella" trådar och avsaknaden av begränsare för att ladda trådar jämnt.

TurboLyft - en mycket användbar teknik som ökar frekvensen av de mest använda processorkärnorna, beroende på deras arbetsbelastning. Det är mycket användbart när applikationen inte vet hur man använder alla 4 kärnor och bara laddar en eller två, medan deras frekvens ökar, vilket delvis kompenserar för prestanda. En analog av denna teknik i företaget AMD, är tekniken Turbo kärna.

, 3 nu! instruktioner. Designad för att snabba upp processorn in multimedia beräkningar (video, musik, 2D/3D-grafik, etc.), samt påskynda arbetet med sådana program som arkiverare, program för att arbeta med bilder och video (med stöd av instruktioner från dessa program).

3nu! - ganska gammal teknik AMD, som innehåller ytterligare instruktioner för bearbetning av multimediainnehåll, förutom SSE första versionen.

* Nämligen möjligheten till strömbehandling av reella tal med enkel precision.

Närvaron av den senaste versionen är ett stort plus, processorn börjar utföra vissa uppgifter mer effektivt med korrekt mjukvaruoptimering. Processorer AMD har liknande namn, men något annorlunda.

* Exempel - SSE 4.1 (Intel) - SSE 4A (AMD).

Dessutom är dessa instruktionsuppsättningar inte identiska. Dessa är analoger, där det finns små skillnader.

cool'n'quiet, speedstep, CoolCore, Förbättrad halv Tillstånd(C1E) OchT. d.

Dessa tekniker, vid låg belastning, minskar processorns frekvens genom att minska multiplikatorn och kärnspänningen, inaktivera en del av cachen, etc. Detta gör att processorn kan värma upp mycket mindre och förbruka mindre energi, göra mindre ljud. Om ström behövs återgår processorn till sitt normala tillstånd på en bråkdel av en sekund. På standardinställningar bios nästan alltid aktiverade, om så önskas kan de inaktiveras för att minska eventuella "friser" när man byter i 3D-spel.

Vissa av dessa tekniker styr hastigheten på fläktarna i systemet. Till exempel, om processorn inte behöver förbättrad värmeavledning och inte är under belastning, reduceras processorns fläkthastighet ( AMD Cool'n'Quiet, Intel Speed ​​​​Step).

Intel Virtualization Technology Och AMD virtualisering.

Dessa hårdvaruteknologier tillåter, med hjälp av speciella program, att köra flera operativsystem samtidigt, utan någon betydande prestandaförlust. Det används också för korrekt drift av servrar, eftersom de ofta har mer än ett operativsystem installerat på dem.

Kör Inaktivera Bit OchNej Kör Bit en teknik designad för att skydda en dator från virusattacker och programvarubuggar som kan orsaka en systemkrasch av buffer-överflöde.

Intel 64 , AMD 64 , EM 64 T - denna teknik gör att processorn kan arbeta både i OS med 32-bitars arkitektur och i OS med 64-bitars arkitektur. Systemet 64 bitar- När det gäller fördelar, för den genomsnittliga användaren, skiljer det sig genom att mer än 3,25 GB RAM kan användas i detta system. På 32-bitars system, använd b handla om Mer RAM är inte möjligt på grund av den begränsade mängden adresserbart minne* .

De flesta applikationer med en 32-bitars arkitektur kan köras på ett system med ett 64-bitars OS.

* Vad ska man göra om ingen redan 1985 ens kunde tänka på så gigantiska, med den tidens mått mätt, mängder RAM.

Dessutom.

Några ord om

Denna punkt är värd att uppmärksamma noga. Ju tunnare den tekniska processen är, desto mindre förbrukar processorn energi och som ett resultat värms den upp mindre. Och bland annat – den har en högre säkerhetsmarginal för överklockning.

Ju tunnare den tekniska processen är, desto mer kan du "linda" i chippet (och inte bara) och öka processorns kapacitet. Värmeavledning och effektförbrukning minskar också proportionellt, på grund av lägre strömförluster och en minskning av kärnområdet. Man kan se en trend att med varje ny generation av samma arkitektur på en ny processteknik växer också strömförbrukningen, men så är det inte. Det är bara det att tillverkare går mot ännu bättre prestanda och kliver över värmeavledningslinjen för den tidigare generationens processorer på grund av en ökning av antalet transistorer, vilket inte är proportionellt mot en minskning av den tekniska processen.

inbyggd i processorn.

Om du inte behöver en integrerad videokärna bör du inte köpa en processor med den. Du får bara sämre värmeavledning, extra värme (inte alltid), sämre överklockningspotential (inte alltid) och överbetalda pengar.

Dessutom är de kärnor som är inbyggda i processorn endast lämpliga för att ladda operativsystemet, surfa på Internet och titta på videor (och även då inte av någon kvalitet).

Marknadstrender förändras fortfarande och möjligheten att köpa en produktiv processor från Intel Utan en videokärna tappar den mindre och mindre. Policyn med tvångsinförande av den inbyggda videokärnan, dök upp med processorer Intel kodnamn Sandig bro, vars främsta innovation var den inbyggda kärnan i samma tillverkningsprocess. Videokärnan finns gemensamt med processor på en kristall, och inte lika enkelt som i tidigare generationer av processorer Intel. För dem som inte använder det finns det nackdelar i form av viss överbetalning för processorn, förskjutningen av värmekällan i förhållande till mitten av värmefördelningskåpan. Men det finns också plus. Inaktiverad videokärna, kan användas för mycket snabb videokodning med hjälp av teknik Snabbsynkronisering tillsammans med speciell programvara som stöder denna teknik. I framtiden, Intel lovar att utöka vyerna för att använda den inbyggda videokärnan för parallell beräkning.

Uttag för processorer. Plattformens livslängder.


Intel leder en grov policy för sina plattformar. Livslängden för varje (datumet för början och slutet av försäljningen av processorer för det) överstiger vanligtvis inte 1,5 - 2 år. Dessutom har företaget flera parallella utvecklingsplattformar.

Företag AMD, har motsatt kompatibilitetspolicy. Till hennes plattform AM 3, alla processorer från framtida generationer som stödjer DDR3. Även när plattformen går till AM3+ och senare, antingen nya processorer under AM 3, eller så kommer nya processorer att vara kompatibla med gamla moderkort, och det blir möjligt att göra en uppgradering som är smärtfri för plånboken genom att endast byta processor (utan att byta moderkort, RAM etc.) och flasha moderkortet. De enda nyanserna av inkompatibilitet kan vara när du byter typ, eftersom en annan minneskontroller inbyggd i processorn kommer att krävas. Så kompatibiliteten är begränsad och stöds inte av alla moderkort. Men i allmänhet, för en ekonomisk användare eller de som inte är vana vid att byta plattform helt vartannat år - valet av processortillverkaren är förståeligt - detta AMD.

CPU kylning.

Levereras med processor som standard LÅDA-ny kylare som bara gör jobbet. Det är en bit aluminium med en inte särskilt hög spridningsyta. Effektiva kylare baserade på värmerör och plattor fästa på dem är designade för högeffektiv värmeavledning. Om du inte vill höra överdrivet fläktljud bör du överväga att köpa en alternativ, effektivare heatpipe-kylare eller ett vätskekylsystem med sluten eller öppen slinga. Sådana kylsystem kommer dessutom att möjliggöra överklockning för processorn.

Slutsats.

Alla viktiga aspekter som påverkar processorns prestanda och prestanda har beaktats. Låt oss sammanfatta vad du ska hålla utkik efter:

  • Välj tillverkare
  • Processorarkitektur
  • Processteknik
  • CPU-frekvens
  • Antal processorkärnor
  • Processorcachestorlek och typ
  • Stöd för teknik och instruktioner
  • Kvalitetskylning

Vi hoppas att detta material kommer att hjälpa dig att förstå och besluta om valet av en processor som uppfyller dina förväntningar.

saul 9 september 2015 klockan 13:38

Implementering av en flertrådig spelmotorarkitektur

  • Intel blogg,
  • spelutveckling,
  • parallell programmering,
  • Webbplatsutveckling
  • Översättning

Med tillkomsten av flerkärniga processorer blev det nödvändigt att skapa en spelmotor baserad på en parallell arkitektur. Användningen av alla processorer i systemet – både grafik (GPU) och central processor (CPU) – öppnar upp för mycket fler möjligheter jämfört med en entrådig GPU-endast motor. Genom att till exempel använda fler CPU-kärnor kan du förbättra grafiken genom att öka antalet fysiska objekt som används i spelet, samt uppnå ett mer realistiskt karaktärsbeteende genom implementering av avancerad artificiell intelligens (AI).
Tänk på funktionerna i implementeringen av spelmotorns flertrådiga arkitektur.

1. Introduktion

1.1. Översikt

Den flertrådiga arkitekturen i spelmotorn gör att du kan använda alla plattformsprocessorers kapacitet maximalt. Det innebär parallell exekvering av olika funktionsblock på alla tillgängliga processorer. Det är dock inte så lätt att genomföra ett sådant system. Separata element i spelmotorn interagerar ofta med varandra, vilket kan leda till fel när de exekveras samtidigt. För att hantera sådana scenarier tillhandahåller motorn speciella datasynkroniseringsmekanismer som utesluter eventuell blockering. Den implementerar också samtidiga datasynkroniseringstekniker för att hålla exekveringstiden till ett minimum.

För att förstå materialet som presenteras måste du vara väl insatt i moderna metoder för att skapa datorspel, stödja multithreading för spelmotorer eller förbättra applikationernas prestanda i allmänhet.

2. Tillstånd för parallell avrättning

Parallellt exekveringstillstånd är ett nyckelbegrepp för multithreading. Endast genom att dela upp spelmotorn i separata system, som vart och ett arbetar i sitt eget läge och praktiskt taget inte interagerar med resten av motorn, kan man uppnå den största effektiviteten vid parallell beräkning och minska tiden som krävs för synkronisering. Det är inte möjligt att helt isolera enskilda delar av motorn, exklusive alla vanliga resurser. Men för operationer som att hämta objekts position eller orientering, kan enskilda system använda lokala kopior av data snarare än delade resurser. Detta gör att du kan minimera beroendet av data i olika delar av motorn. Meddelanden om ändringar av delad data som görs av ett enda system skickas till tillståndschefen, som ställer dem i kö. Detta kallas meddelandeläget. Detta läge förutsätter att motorsystemen, efter att ha slutfört utförandet av uppgifter, får meddelanden om ändringar och uppdaterar sina interna data i enlighet därmed. Denna mekanism kan avsevärt minska tiden för synkronisering och systemens beroende av varandra.

2.1 Körtillstånd

För att exekveringstillståndshanteraren ska fungera effektivt rekommenderas det att synkronisera operationer på en specifik klockpuls. Detta gör att alla system kan arbeta samtidigt. I detta fall behöver inte klockfrekvensen motsvara bildhastigheten. Och längden på cyklerna kanske inte beror på frekvensen. Den kan väljas på ett sådant sätt att en cykel motsvarar den tid som krävs för att sända en ram (oavsett dess storlek). Med andra ord, frekvensen eller varaktigheten av cyklerna bestäms av den specifika implementeringen av tillståndschefen. Figur 1 visar ett "fritt" stegdriftsläge, vilket inte kräver att alla system slutför en operation i samma klockcykel. Läget i vilket alla system slutför sina operationer i en klockcykel kallas "hårt" stegläge. Det visas schematiskt i figur 2.


Figur 1. Exekveringsstatus i fritt stegläge

2.1.1. Frigångsläge
I det fria steg-för-steg-läget arbetar alla system kontinuerligt under en förutbestämd tidsperiod som krävs för att slutföra nästa del av beräkningarna. Namnet "gratis" bör dock inte tas bokstavligt: ​​systemen synkroniseras inte vid ett godtyckligt ögonblick, de är bara "fria" när det gäller att välja antalet cykler som krävs för att slutföra nästa steg.
I det här läget är det vanligtvis inte tillräckligt att skicka ett enkelt meddelande om tillståndsändring till tillståndschefen. Det är också nödvändigt att överföra uppdaterade data. Detta beror på att systemet som har ändrat de delade data kan vara på gång medan ett annat system som väntar på data är redo att uppdateras. I det här fallet krävs mer minne eftersom fler kopior av data måste skapas. Därför kan det "fria" läget inte betraktas som en universell lösning för alla tillfällen.
2.1.2. Hårt svängläge
I detta läge slutförs exekveringen av uppgifter för alla system i en klockcykel. Denna mekanism är lättare att implementera och kräver inte överföring av uppdaterade data tillsammans med meddelandet. Om det behövs kan ett system helt enkelt begära nya värden från ett annat system (naturligtvis i slutet av körcykeln).
I hårt läge är det möjligt att implementera ett pseudofritt stegläge genom att fördela beräkningar mellan olika steg. I synnerhet kan detta krävas för AI-beräkningar, där det initiala "gemensamma målet" beräknas i den första cykeln, som gradvis förfinas i de följande stegen.


Figur 2. Exekveringsstatus i hårt stegläge

2.2. Datasynkronisering

Att ändra delad data av flera system kan resultera i motstridiga ändringar. I det här fallet måste meddelandesystemet tillhandahålla en algoritm för att välja rätt totalvärde. Det finns två huvudsakliga tillvägagångssätt baserat på följande kriterier.
  • Tid: Det slutliga värdet är den senast gjorda ändringen.
  • Prioritet: Slutvärdet är ändringen som gjorts av systemet med högst prioritet. Om prioriteringen av systemen är densamma kan du också ta hänsyn till tidpunkten för ändringarna.
All föråldrad data (enligt något av kriterierna) kan helt enkelt skrivas över eller uteslutas från aviseringskön.
Eftersom det totala värdet kan bero på i vilken ordning ändringarna görs, kan det vara mycket svårt att använda relativa värden för den totala datan. I sådana fall bör absoluta värden användas. Sedan, när du uppdaterar lokal data, kan system helt enkelt ersätta de gamla värdena med de nya. Den optimala lösningen är att välja absoluta eller relativa värden beroende på den specifika situationen. Till exempel bör allmänna data som position och orientering ha absoluta värden eftersom ordningen i vilka ändringar görs är viktig för dem. Relativa värden kan användas till exempel för ett partikelgenereringssystem, eftersom all information om partiklar endast lagras i sig själv.

3. Motor

När man utvecklar motorn ligger fokus på den flexibilitet som behövs för att ytterligare utöka dess funktionalitet. Detta kommer att optimera det för användning under vissa begränsningar (till exempel minne).
Motorn kan villkorligt delas upp i två delar: ramverk och chefer. Ramverket (se avsnitt 3.1) inkluderar delar av spelet som replikeras vid körning, det vill säga de finns i flera instanser. Det inkluderar också de element som är involverade i exekveringen av huvudspelsslingan. Managers (se avsnitt 3.2) är Singleton-objekt som ansvarar för att utföra den logiska delen av spelet.
Nedan är ett diagram över spelmotorn.


Figur 3. Motorns allmänna arkitektur

Observera att funktionella spelmoduler, eller system, inte är en del av motorn. Motorn förenar dem bara med varandra och fungerar som ett anslutningselement. Denna modulära organisation gör det möjligt att ladda och lossa system efter behov.

Interaktionen mellan motorn och systemen utförs med hjälp av gränssnitt. De är implementerade på ett sådant sätt att de ger motorn tillgång till systemens funktioner och systemen till motorns chefer.
Ett detaljerat diagram över motorn finns i Appendix A, "Motordiagram".

Faktum är att alla system är oberoende av varandra (se avsnitt 2, "Samtidig exekveringsstatus"), vilket innebär att de kan utföra åtgärder parallellt utan att påverka driften av andra system. Varje dataändring kommer dock att medföra vissa svårigheter, eftersom systemen måste interagera med varandra. Informationsutbyte mellan system är nödvändigt i följande fall:

  • att informera ett annat system om en ändring i delad data (till exempel position eller orientering av objekt);
  • för att utföra funktioner som inte är tillgängliga för detta system (till exempel anropar AI-systemet systemet för att beräkna objektets geometriska eller fysiska egenskaper för att utföra ett strålkorsningstest).
I det första fallet kan den tillståndschef som beskrivs i föregående avsnitt användas för att hantera informationsutbytet. (Se avsnitt 3.2.2, "Statschef" för mer information om tillståndschefen.)
I det andra fallet är det nödvändigt att implementera en speciell mekanism som gör att du kan tillhandahålla tjänster från ett system för användning av ett annat. En fullständig beskrivning av denna mekanism finns i avsnitt 3.2.3, Service Manager.

3.1. ramverk

Ramverket tjänar till att kombinera alla delar av motorn. Det är där motorn initieras, med undantag för chefer, som instansieras globalt. Den lagrar också sceninformation. För att uppnå större flexibilitet implementeras scenen som en så kallad universell scen, som innehåller universella objekt. De är containrar som kombinerar olika funktionella delar av scenen. Se avsnitt 3.1.2 för detaljer.
Huvudspelslingan är också implementerad i ramverket. Schematiskt kan det representeras enligt följande.


Figur 4. Huvudspelslinga

Motorn körs i en fönstermiljö, så det första steget i spelslingan är att behandla alla väntande OS-fönstermeddelanden. Om detta inte görs kommer motorn inte att svara på OS-meddelanden. I det andra steget tilldelar schemaläggaren uppgifter med hjälp av aktivitetshanteraren. Denna process beskrivs i avsnitt 3.1.1 nedan. Därefter skickar statschefen (se avsnitt 3.2.2) information om de ändringar som gjorts i motorsystemen som den kan påverka. I det sista steget, beroende på exekveringsstatus, bestämmer ramverket om motorn ska avslutas eller fortsätta, till exempel för att flytta till nästa scen. Information om motorns tillstånd lagras i miljöhanteraren. Se avsnitt 3.2.4 för detaljer.

3.1.1. Schemaläggare
Schemaläggaren genererar en exekveringsreferensklocka vid en specificerad frekvens. Om benchmarking-läget kräver att nästa operation startar omedelbart efter att den föregående har slutförts, utan att vänta på slutet av cykeln, kan frekvensen vara obegränsad.
På en klocksignal sätter schemaläggaren, med hjälp av aktivitetshanteraren, systemen i exekveringsläge. I läget för fritt steg (avsnitt 2.1.1) kontrollerar schemaläggaren system för att avgöra hur många markeringar de behöver för att slutföra en uppgift. Baserat på resultaten av omröstningen bestämmer schemaläggaren vilka system som är redo att köras och vilka som kommer att slutföra arbetet i en viss cykel. Schemaläggaren kan ändra antalet markeringar om något system behöver mer tid att köra. I hårdstegsläge (avsnitt 2.1.2) startar och avslutar alla system exekveringen på samma klockcykel, så schemaläggaren väntar på att alla system ska slutföra exekveringen.
3.1.2. Universell scen och objekt
Den universella scenen och objekten är behållare för funktionalitet implementerad i andra system. De är endast avsedda för interaktion med motorn och utför inga andra funktioner. De kan dock utökas för att dra nytta av funktioner som finns på andra system. Detta möjliggör svag koppling. Den universella scenen och objekten kan faktiskt använda egenskaperna hos andra system utan att vara bundna till dem. Det är denna egenskap som utesluter systemens beroende av varandra och gör det möjligt för dem att arbeta samtidigt.
Diagrammet nedan visar expansionen av den universella scenen och objektet.


Figur 5. Expandera den universella scenen och objektet

Betrakta principen för tilläggen i följande exempel. Låt oss säga att en universell universell scen utökas, scenen utökas för att använda användningen av grafiska, fysiska och andra egenskaper. I det här fallet kommer den "grafiska" delen av tillägget att ansvara för att initiera displayen, och dess "fysiska" del kommer att ansvara för att implementera fysiska lagar för fasta ämnen, såsom gravitation. Scener innehåller objekt, så en generisk scen kommer också att innehålla flera generiska objekt. Generiska objekt kan också utökas till att använda grafiska, fysiska och andra egenskaper. Till exempel kommer ritningen av ett objekt på skärmen att implementeras av grafiska förlängningsfunktioner, och beräkningen av interaktionen mellan stela kroppar kommer att implementeras av fysiska.

Ett detaljerat diagram över växelverkan mellan motor och system ges i bilaga B, "Diagrammet över växelverkan mellan motor och system."
Observera att den generiska scenen och det generiska objektet är ansvariga för att registrera alla sina "tillägg" hos tillståndschefen så att alla tillägg kan meddelas om ändringar som gjorts av andra tillägg (dvs andra system). Ett exempel skulle vara en grafisk anknytning registrerad för att ta emot meddelanden om positions- och orienteringsändringar gjorda av en fysisk anknytning.
För detaljerad information om systemkomponenter, se avsnitt 5.2, Systemkomponenter.

3.2. Chefer

Chefer sköter driften av motorn. De är Singleton-objekt, vilket betyder att det bara finns en instans av varje managertyp. Detta är nödvändigt eftersom dubbelarbete av chefsresurser oundvikligen kommer att leda till redundans och negativt påverka resultatet. Dessutom ansvarar chefer för att implementera gemensamma funktioner för alla system.
3.2.1. Aktivitetshanteraren
Aktivitetshanteraren ansvarar för att hantera systemuppgifter i trådpoolen. För att säkerställa optimal nx-skalning och för att förhindra att redundanta trådar tilldelas, vilket eliminerar onödig uppgiftsbyte i operativsystemet, skapar trådpoolen en tråd per processor.

Schemaläggaren ger uppgiftshanteraren en lista över uppgifter som ska utföras, samt information om vilka uppgifter som ska utföras för att vänta. Den tar emot denna information från olika system. Varje system får bara en uppgift att utföra. Denna metod kallas funktionell nedbrytning. Men för databehandling kan varje sådan uppgift delas upp i ett godtyckligt antal deluppgifter (dataupplösning).
Nedan är ett exempel på fördelningen av uppgifter mellan trådar för ett fyrkärnigt system.


Figur 6. Exempel på en trådpool som används av aktivitetshanteraren

Förutom att bearbeta schemaläggarförfrågningar om åtkomst till huvuduppgifterna kan aktivitetshanteraren arbeta i initieringsläget. Den sekventiellt pollar systemen från varje tråd så att de kan initiera de lokala datalagren som behövs för arbetet.
Tips för att implementera en uppgiftshanterare finns i bilaga D, Tips för att implementera uppgifter.

3.2.2. Statschef
Tillståndschefen är en del av meddelandemekanismen. Den spårar ändringar och skickar meddelanden om dem till alla system som kan påverkas av dessa ändringar. För att inte skicka onödiga aviseringar lagrar statschefen information om vilka system som ska anmälas i ett visst fall. Denna mekanism implementeras baserat på observatörsmönstret (se Appendix C, Observer (designmönster)). Kortfattat innebär detta mönster användning av en "observatör" som tittar på eventuella förändringar i ämnet, medan förändringskontrollanten fungerar som en mellanhand mellan dem.

Mekanismen fungerar enligt följande. 1. Observatören talar om för förändringskontrollanten (eller tillståndschefen) vilka ämnen den vill övervaka för förändringar. 2. Ämnet meddelar den registeransvarige om alla sina ändringar. 3. På signal från ramverket meddelar kontrollanten observatören om förändringar i ämnet. 4. Observatören skickar en begäran till försökspersonen om att få uppdaterad data.

I det fria stegläget (se avsnitt 2.1.1) blir implementeringen av denna mekanism något mer komplicerad. Först måste de uppdaterade uppgifterna skickas tillsammans med ändringsmeddelandet. Polling är inte tillämpligt i det här läget. Faktum är att om systemet som ansvarar för ändringarna ännu inte har slutfört exekveringen vid den tidpunkt då begäran tas emot, kommer det inte att kunna tillhandahålla uppdaterade data. För det andra, om ett system ännu inte är redo att ta emot ändringar vid slutet av klockan, kommer tillståndshanteraren att behöva hålla fast vid de ändrade data tills alla system som är registrerade för att ta emot det är redo.

Ramverket ger två statliga chefer för detta: för hantering av förändringar på scennivå och på objektnivå. Vanligtvis är scen- och objektmeddelanden oberoende av varandra, så att använda två separata hanterare eliminerar behovet av att behandla onödiga data. Men om scenen behöver ta hänsyn till ett objekts tillstånd kan den registreras på för att få meddelanden om dess ändringar.

För att inte utföra onödig synkronisering bildar tillståndshanteraren en kö av ändringsmeddelanden separat för varje tråd som skapas av aktivitetshanteraren. Därför krävs ingen synkronisering vid åtkomst till kön. Avsnitt 2.2 beskriver en metod som kan användas för att slå samman köer efter exekvering.


Figur 7. Generisk meddelande om intern ändring av objekt

Ändringsmeddelanden behöver inte skickas sekventiellt. Det finns ett sätt att fördela dem parallellt. När du utför en uppgift arbetar systemet med alla dess objekt. Till exempel, när fysiska objekt interagerar med varandra, hanterar det fysiska systemet deras rörelse, beräkning av kollisioner, nya agerande krafter etc. När ett systemobjekt tar emot meddelanden interagerar inte med andra objekt i sitt system. Den interagerar med dess associerade generiska objekttillägg. Detta innebär att generiska objekt nu är oberoende av varandra och kan uppdateras samtidigt. Detta tillvägagångssätt utesluter inte kantfall som bör beaktas i synkroniseringsprocessen. Det låter dig dock använda parallellkörningsläget när det verkade som att du bara kunde agera sekventiellt.

3.2.3. Servicechef
Service Manager ger system åtkomst till funktioner i andra system som annars skulle vara otillgängliga för dem. Det är viktigt att förstå att funktioner nås via gränssnitt och inte direkt. Information om systemgränssnitt lagras även i servicehanteraren.
För att undvika systemberoende av varandra har var och en av dem bara en liten uppsättning tjänster. Dessutom bestäms möjligheten att använda en viss tjänst inte av systemet självt, utan av tjänstechefen.


Figur 8. Exempel på servicechef

Servicechefen har en annan funktion. Det ger system tillgång till egenskaperna hos andra system. Egenskaper är systemspecifika värden som inte skickas i meddelandesystemet. Detta kan vara en förlängning av skärmupplösningen i ett grafiskt system, eller en tyngdkraftsstorlek i ett fysiskt. Service Manager ger systemen tillgång till sådan data, men tillåter inte att de direkt kontrolleras. Den placerar egenskapsändringar i en speciell kö och publicerar dem först efter sekventiell exekvering. Observera att tillgång till egenskaperna för ett annat system sällan krävs och bör inte missbrukas. Till exempel kan du behöva den för att aktivera och inaktivera trådramsläget i grafiksystemet från konsolfönstret, eller för att ändra skärmupplösningen på spelarens begäran från användargränssnittet. Denna funktion används främst för att ställa in parametrar som inte ändras från bildruta till bildruta.

3.2.4. Miljöchef
  • Miljöhanteraren tillhandahåller körtidsmiljön för motorn. Dess funktioner kan villkorligt delas in i följande grupper.
  • Variabler: namn och värden på vanliga variabler som används av alla delar av motorn. Vanligtvis bestäms variabla värden när en scen eller vissa användarinställningar laddas. Motorn och olika system kan komma åt dem genom att skicka en förfrågan.
  • Execution: Exekveringsdata, såsom slutförandet av en scen eller programexekvering. Dessa parametrar kan ställas in och begäras av både systemen själva och motorn.
3.2.5. Plattformschef
Plattformshanteraren implementerar en abstraktion för operativsystemanrop och tillhandahåller även ytterligare funktionalitet utöver den enkla abstraktionen. Fördelen med detta tillvägagångssätt är inkapslingen av flera typiska funktioner inom ett enda samtal. Det vill säga, de behöver inte implementeras separat för varje anropande element, vilket överbelastas med detaljer om OS-anrop.
Tänk som ett exempel att ringa plattformshanteraren för att ladda systemets dynamiska bibliotek. Den startar inte bara upp systemet, utan får även funktionsingångspunkter och anropar bibliotekets initialiseringsfunktion. Hanteraren lagrar också biblioteksbeskrivningen och laddar ur den när motorn avslutas.

Plattformshanteraren är också ansvarig för att tillhandahålla information om processorn, såsom SIMD-instruktioner som stöds, och för att initiera ett visst driftsätt för processer. Andra systemfrågefunktioner kan inte användas.

4. Gränssnitt

Gränssnitt är medlet för interaktion mellan ramverket, chefer och system. Ramverket och cheferna är en del av motorn, så de kan interagera med varandra direkt. System hör inte till motorn. Dessutom utför de alla olika funktioner, vilket leder till behovet av att skapa en enda metod för interaktion med dem. Eftersom system inte kan kommunicera direkt med chefer måste de tillhandahålla ett annat sätt att komma åt dem. Alla chefers funktioner bör dock inte vara öppna för system. Vissa av dem är endast tillgängliga för ramverket.

Gränssnitt definierar en uppsättning funktioner som krävs för att använda en standardåtkomstmetod. Detta sparar ramverket från att behöva känna till implementeringsdetaljerna för specifika system, eftersom det bara kan interagera med dem genom en specifik uppsättning samtal.

4.1. Ämnes- och observatörsgränssnitt

Huvudsyftet med ämnes- och observatörsgränssnitten är att registrera vilka observatörer som ska skicka meddelanden om vilka ämnen, samt att skicka sådana meddelanden. Att registrera och koppla från en observatör är standardfunktioner för alla aktörer som ingår i deras gränssnittsimplementering.

4.2. Managergränssnitt

Chefer, trots att de är Singleton-objekt, är direkt tillgängliga endast för ramverket. Andra system kan bara komma åt chefer via gränssnitt som endast representerar en delmängd av deras övergripande funktionalitet. Efter initiering skickas gränssnittet till systemet, som använder det för att arbeta med vissa funktioner hos chefen.
Det finns inget enskilt gränssnitt för alla chefer. Var och en av dem har sitt eget separata gränssnitt.

4.3. Systemgränssnitt

För att ett ramverk ska få tillgång till systemkomponenter behöver det gränssnitt. Utan dem skulle stöd för varje nytt motorsystem behöva implementeras separat.
Varje system innehåller fyra komponenter, så det måste finnas fyra gränssnitt. Nämligen: system, scen, objekt och uppgift. Se avsnitt 5, System för en detaljerad beskrivning. Gränssnitt är ett sätt att få tillgång till komponenter. Systemgränssnitten låter dig skapa och ta bort scener. Scengränssnitt låter dig i sin tur skapa och förstöra objekt, samt begära information om systemets huvuduppgift. Uppgiftsgränssnittet används i första hand av aktivitetshanteraren vid tilldelning av uppgifter till en trådpool.
Eftersom scenen och objektet, som delar av systemet, måste interagera med varandra och med den universella scenen och objektet som de är knutna till, skapas även deras gränssnitt utifrån subjektets och betraktarens gränssnitt.

4.4. Ändra gränssnitt

Dessa gränssnitt tjänar till att överföra data mellan system. Alla system som gör ändringar av en viss typ måste implementera detta gränssnitt. Geometri är ett exempel. Geometrigränssnittet inkluderar metoder för att bestämma ett elements position, orientering och skala. Varje system som gör ändringar i geometrin måste implementera ett gränssnitt så att åtkomst till de ändrade data inte kräver kunskap om andra system.

5. System

System är den del av motorn som ansvarar för att implementera spelets funktionalitet. De utför alla grundläggande uppgifter utan vilka motorn inte skulle vara vettig. Interaktion mellan motorn och systemen görs med hjälp av gränssnitt (se avsnitt 4.3, "Systemgränssnitt"). Detta är nödvändigt för att inte överbelasta motorn med information om olika typer av system. Gränssnitt gör det mycket lättare att lägga till ett nytt system eftersom motorn inte behöver ta hänsyn till alla implementeringsdetaljer.

5.1. Typer

Motorsystem kan löst delas in i flera fördefinierade kategorier, motsvarande standardspelkomponenter. Till exempel: geometri, grafik, fysik (kollision av stela kroppar), ljud, ingångsbearbetning, AI och animation.
System med icke-standardiserade funktioner tillhör en separat kategori. Det är viktigt att förstå att alla system som modifierar data för en viss kategori måste vara medvetna om den kategorins gränssnitt, eftersom motorn inte tillhandahåller sådan information.

5.2. Systemkomponenter

För varje system behöver flera komponenter implementeras. Här är några av dem: system, scen, objekt och uppgift. Alla dessa komponenter tjänar till att interagera med olika delar av motorn.
Diagrammet nedan visar interaktionerna mellan de olika komponenterna.


Figur 9. Systemkomponenter

Ett detaljerat diagram över kopplingarna mellan motorns system ges i bilaga B, "Skimet för interaktion mellan motorn och systemen."

5.2.1. Systemet
"System"-komponenten, eller helt enkelt systemet, är ansvarig för att initiera systemresurser, som praktiskt taget inte kommer att förändras under driften av motorn. Till exempel analyserar grafiksystemet adresserna till resurser för att bestämma deras plats och påskynda laddningen när resursen används. Den ställer också in skärmupplösningen.
Systemet är den huvudsakliga ingången till ramverket. Den ger information om sig själv (som systemtyp) samt metoder för att skapa och ta bort scener.
5.2.2. Scen
Scenkomponenten, eller systemscenen, är ansvarig för att hantera resurserna som är relaterade till den aktuella scenen. Universal Scene använder systemscener för att utöka funktionaliteten genom att använda deras funktioner. Ett exempel är en fysisk scen, som används för att skapa en ny spelvärld och bestämmer gravitationskrafterna i den när scenen initieras.
Scener tillhandahåller metoder för att skapa och förstöra objekt, såväl som en "uppgifts"-komponent för att bearbeta scenen och en metod för att komma åt den.
5.2.3. Ett objekt
Objektkomponenten, eller systemobjektet, tillhör scenen och associeras vanligtvis med vad användaren ser på skärmen. Det generiska objektet använder systemobjektet för att utöka funktionaliteten genom att exponera dess egenskaper som om det vore dess egna.
Ett exempel skulle vara den geometriska, grafiska och fysiska förlängningen av ett generiskt objekt för att visa en träbalk på skärmen. Geometriska egenskaper inkluderar objektets position, orientering och skala. För att visa det kommer grafiksystemet att använda ett speciellt rutnät. Och det fysiska systemet kommer att ge det egenskaperna hos en fast kropp för att beräkna interaktioner med andra kroppar och de verkande tyngdkrafterna.

I vissa fall måste ändringar av det generiska objektet eller en av dess tillägg beaktas i systemobjektet. För detta ändamål kan du skapa en speciell länk som gör att du kan spåra de ändringar som gjorts.

5.2.4. En uppgift
Uppgiftskomponenten, eller systemuppgiften, används för att bearbeta scenen. Uppgiften får ett kommando för att uppdatera scenen från aktivitetshanteraren. Detta är en signal för att köra systemfunktioner på scenobjekt.
Utförandet av en uppgift kan delas upp i deluppgifter, och distribuera dem även med hjälp av uppgiftshanteraren till ett ännu större antal trådar. Detta är ett bekvämt sätt att skala motorn över flera processorer. Denna metod kallas datanedbrytning.
Information om att ändra objekt i processen att uppdatera scenuppgifter skickas till tillståndschefen. Se avsnitt 3.2.2 för detaljer om statschefen.

6. Kombinera alla komponenter

Alla de ovan beskrivna elementen är sammankopplade och ingår i en helhet. Driften av motorn kan villkorligt delas upp i flera steg, som beskrivs i följande avsnitt.

6.1. Initieringsfas

Motorns arbete börjar med initieringen av chefer och ramverket.
  • Ramverket kallar scenladdaren.
  • Efter att ha bestämt vilka system scenen kommer att använda, ringer lastaren plattformschefen för att ladda lämpliga moduler.
  • Plattformshanteraren laddar lämpliga moduler och skickar dem till gränssnittshanteraren och anropar dem sedan för att skapa ett nytt system.
  • Modulen returnerar till laddaren en pekare till systeminstansen som implementerar systemgränssnittet.
  • Servicehanteraren registrerar alla tjänster som systemmodulen tillhandahåller.


Figur 10. Initiering av motorns chefer och system

6.2. Scenladdningsstadium

Kontrollen återförs till lastaren, som laddar scenen.
  • Lastaren skapar en universell scen. För att instansiera systemscener anropar den systemgränssnitten, vilket utökar funktionaliteten för den generiska scenen.
  • En generisk scen definierar vilken data varje systemscen kan ändra och vilka ändringar den ska meddelas om.
  • Efter att ha matchat scenerna som gör vissa ändringar och vill bli meddelade om dem, skickar den generiska scenen denna information till tillståndschefen.
  • För varje scenobjekt skapar laddaren ett generiskt objekt och bestämmer sedan vilka system som kommer att utöka det generiska objektet. Korrespondens mellan systemobjekt bestäms enligt samma schema som används för scener. Den överlämnas också till statschefen.
  • Med hjälp av de resulterande scengränssnitten skapar laddaren instanser av systemobjekt och använder dem för att utöka generiska objekt.
  • Schemaläggaren frågar scengränssnitten om information om deras huvuduppgifter för att skicka denna information till uppgiftshanteraren under exekvering.


Figur 11. Initialisering av den universella scenen och objektet

6.3. Stadium av spelcykeln

  • Plattformshanteraren används för att behandla fönstermeddelanden och andra element som är nödvändiga för att den aktuella plattformen ska fungera.
  • Styrningen går sedan vidare till schemaläggaren, som väntar på att cykelns slut ska fortsätta.
  • I slutet av en bock i fritt stegläge kontrollerar schemaläggaren vilka uppgifter som har slutförts. Alla slutförda uppgifter (det vill säga redo att utföras) överförs till uppgiftshanteraren.
  • Schemaläggaren bestämmer vilka uppgifter som ska slutföras i den aktuella cykeln och väntar på att de ska slutföras.
  • I hårt stegningsläge upprepas dessa operationer varje klockcykel. Schemaläggaren lämnar över alla uppgifter till chefen och väntar på att de ska slutföra.
6.3.1. Uppgifts slutförande
Kontrollen övergår till uppgiftshanteraren.
  • Den bildar en kö av alla mottagna uppgifter, och sedan, när fria trådar dyker upp, börjar den att utföra dem. (Processen att utföra uppgifter skiljer sig åt beroende på system. System kan arbeta med endast en uppgift eller bearbeta flera uppgifter från kön samtidigt, och på så sätt realisera parallell exekvering.)
  • Under exekvering kan uppgifter arbeta med hela scenen eller bara med vissa objekt, och ändra deras interna data.
  • System bör meddelas om alla ändringar av delad data (som position eller orientering). Därför, när en uppgift exekveras, informerar systemscenen eller objektet observatören om eventuella ändringar. I detta fall fungerar observatören faktiskt som en förändringskontrollant, som är en del av tillståndschefen.
  • Ändringskontrollanten köar ändringsmeddelanden för vidare bearbetning. Den ignorerar ändringar som inte påverkar den givna observatören.
  • För att använda vissa tjänster anropar uppgiften servicechefen. Servicehanteraren låter dig också ändra egenskaperna för andra system som inte är tillgängliga för överföring i meddelandemekanismen (till exempel ändrar datainmatningssystemet skärmtillägget - en egenskap hos grafiksystemet).
  • Tasks kan också anropa miljöhanteraren för att få miljövariabler och för att ändra tillståndet för exekvering (avstängning av exekvering, övergång till nästa scen, etc.).


Figur 12. Task manager och uppgifter

6.3.2. Uppdatering av data
Efter att alla uppgifter i den aktuella cykeln har slutförts, anropar huvudspelsslingan tillståndschefen för att starta datauppdateringsfasen.
  • Tillståndschefen kallar var och en av sina ändringskontrollanter i tur och ordning för att distribuera ackumulerade meddelanden. Kontrollanten kontrollerar vilka observatörer som ska skicka ändringsmeddelanden för vart och ett av försökspersonerna.
  • Den ringer sedan upp den önskade observatören och meddelar den om ändringen (meddelandet innehåller även en pekare till ämnets gränssnitt). I löst stegläge får observatören de ändrade uppgifterna från växlingskontrollanten, men i hårdstegsläge måste den begära det från försökspersonen själv.
  • Vanligtvis är de observatörer som är intresserade av att ta emot meddelanden om systemobjektändringar andra systemobjekt som är associerade med samma generiska objekt. Detta gör att du kan dela upp processen att göra ändringar i flera uppgifter som kan utföras parallellt. För att förenkla synkroniseringsprocessen kan du kombinera alla relaterade generiska objekttillägg i en uppgift.
6.3.3. Utförandekontroll och avsluta
Det sista steget i spelslingan är att kontrollera körtidens tillstånd. Det finns flera sådana tillstånd: arbete, paus, nästa scen, etc. Om arbetstillståndet väljs kommer nästa iteration av loopen att startas. "Exit"-tillståndet betyder att slingan är klar, resurser frigörs och applikationen avslutas. Du kan implementera andra tillstånd, som "paus", "nästa scen" etc.

7. Slutsats

Huvudidén med den här artikeln ges i avsnitt 2, "Status för samtidig exekvering". Tack vare funktionell nedbrytning och datanedbrytning är det möjligt att realisera inte bara motorns multitrådning, utan även dess skalbarhet till ännu fler kärnor i framtiden. För att eliminera synkroniseringskostnader samtidigt som du håller data uppdaterad, använd tillståndshanterare utöver meddelandemekanismen.

Observer-mönstret är en funktion i meddelandemotorn. Det är viktigt att ha en god förståelse för hur det fungerar för att välja det bästa sättet att implementera det för motorn. I själva verket är detta en mekanism för interaktion mellan olika system, som säkerställer synkronisering av gemensamma data.

Task management spelar en viktig roll i fördelningen av arbetsbelastningen. Appendix D ger tips för att skapa en effektiv uppgiftshanterare för en spelmotor.

Som du kan se är multithreading av spelmotorn möjlig på grund av en väldefinierad struktur och meddelandeutbytesmekanism. Med dess hjälp kan du avsevärt förbättra prestandan hos moderna och framtida processorer.

Bilaga A. Motorschema

Bearbetningen startas från huvudspelslingan (se figur 4, "Main Game Loop").


Bilaga B. Schemat för samverkan mellan motorn och systemen


Bilaga C. Observer (designmönster)

Observer-mönstret beskrivs i detalj i boken Object-Oriented Design Techniques. Design Patterns, Gamma E., Helm R., Johnson R., Vlissides J. Den publicerades första gången på engelska 1995 av Addison-Wesley.

Huvudidén med denna modell är följande: om vissa element behöver meddelas om ändringar av andra element, behöver de inte titta igenom listan över alla möjliga ändringar och försöka hitta nödvändiga data i den. Modellen innebär ett subjekt och en observatör som används för att skicka ändringsmeddelanden. Observatören håller reda på eventuella förändringar i ämnet. Ändringsregulatorn fungerar som en mellanhand mellan dessa två komponenter. Följande diagram illustrerar detta samband.


Figur 13. Mönster "Observer"

Processen för att använda denna modell beskrivs nedan.

  1. Ändringskontrollanten registrerar en observatör och ett ämne som den vill bli underrättad om.
  2. Växlingskontrollanten är faktiskt en observatör. Istället för betraktaren, tillsammans med subjektet, registrerar han sig själv. Ändringskontrollanten håller också sin lista över observatörer och ämnen registrerade hos dem.
  3. Ämnet lägger till en observatör (det vill säga en ändringskontrollant) till sin lista över observatörer som vill bli meddelade om ändringarna. Ibland anges dessutom typen av förändringar, vilket avgör vilka förändringar som betraktaren är intresserad av. Detta gör att du kan effektivisera processen för att skicka ändringsmeddelanden.
  4. Vid ändring av data eller tillstånd meddelar försökspersonen observatören via en återuppringningsmekanism och förmedlar information om de ändrade typerna.
  5. Ändringskontrollern bildar en kö av ändringsmeddelanden och väntar på en signal för att distribuera dem mellan objekt och system.
  6. Under distributionen pratar växlingskontrollanten med riktiga observatörer.
  7. Observatörer begär information om de ändrade uppgifterna eller tillståndet från försökspersonen (eller får det tillsammans med meddelanden).
  8. Innan en observatör raderas, eller om den inte längre behöver meddelas om ett ämne, avregistrerar den sig från det ämnet i växlingskontrollanten.
Det finns många olika sätt att implementera uppgiftsfördelning. Det är dock bäst att hålla antalet arbetartrådar lika med antalet tillgängliga plattformslogiska processorer. Försök att inte knyta uppgifter till en specifik tråd. Utförandetiden för uppgifter i olika system sammanfaller inte alltid. Detta kan leda till ojämn lastfördelning mellan arbetartrådar och påverka effektiviteten. För att göra denna process enklare, använd uppgiftshanteringsbibliotek som

Nytt på plats

>

Mest populär