2017 computerarchitectuur F. Vonk versie 1 2-8-2017
inhoudsopgave 1. inleiding... - 3-2. hardware... - 4-3. moederbord... - 5-4. CPU... - 7-5. bussen... - 12-6. bridges... - 15-7. RAM... - 16-8. hardware architectuur... - 19-9. wat heb je geleerd... - 28 - Dit werk is gelicenseerd onder een Creative Commons Naamsvermelding NietCommercieel GelijkDelen 3.0 Unported licentie Deze module is deels overgenomen uit Hoofdstuk 3 van de informatica methode van Remie Woudt. De afbeelding op het voorblad is verkregen via INFOwrs. Copyright 2010 INFOwrs Serviços em informatica. - 2 -
1. inleiding Informatica gaat net zo min over computers als astronomie gaat over telescopen. (Edsger W. Dijkstra) Om informatica toe te passen en "tot leven te brengen" hebben we computers nodig. Bovendien kunnen we met computers een heleboel leuke dingen doen. We kunnen ze onder andere programmeren en om dat te kunnen moeten we snappen hoe ze werken. Welkom bij de module computerarchitectuur. In deze module behandelen we de essentiële componenten die je in computers vindt en die belangrijk zijn als we een computer willen programmeren. Ook de samenwerking tussen deze componenten is belangrijk. In deze module kom je opgaves tegen die je moet maken om de lesstof te verwerken. De antwoorden kunnen in de les besproken worden. opgave Opgaves in blauw moet je maken. Let op, links in dit document hebben een rode kleur. Veel plezier en succes. - 3 -
2. hardware Hardware gaat over de computer en alles wat je erin kunt stoppen of eraan kunt hangen. Hardware, het woord zegt het al, is iets wat "hard" is, wat aangeraakt kan worden. De tegenhanger is software. Software kun je niet aanraken, kun je niet vastpakken. Hoe zit het dan met een CD met een programma erop? Inderdaad, de CD kun je aanraken. Maar de CD is niet de software, het is alleen maar de drager van de software. Misschien is het duidelijker als je bedenkt dat je software ook kunt downloaden. Dan weet je dat het via jouw internetaansluiting je computer binnengaat, maar dat je het toch niet kunt vastpakken. In plaats van over software hebben we het ook wel over computerprogramma's. Deze term geeft beter weer dat software geprogrammeerd is. Hardware zorgt ervoor dat je software kunt gebruiken. Het verschil is overigens lastig. Want als je een kale computer (zonder besturingssysteem) koopt zitten daar al kleine stukjes software in gebakken. Een computer kan niet eens opstarten zonder software. Dergelijke software wordt dan ook niet via een externe bron ingelezen maar zit permanent in de hardware opgeslagen. Een voorbeeld hiervan zijn de BIOS / UEFI en de POST. De POST is de Power On Self-Test die wordt uitgevoerd om te controleren dat er geen problemen met de hardware van een computer zijn. Welke componenten van de computer gecontroleerd moeten worden leest de POST uit de BIOS (Basic Input and Output System) of UEFI (Unified Extensible Firmware Interface). In de volgende hoofdstukken gaan we de belangrijkste onderdelen in meer detail behandelen. opgave 2.1 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) De BIOS / UEFI en POST zijn essentieel bij het opstarten van een PC. b) Bij het opstarten van de PC roept de BIOS / UEFI de POST aan. c) De POST is een stuk hardware. d) Software is altijd nuttig, ook als je geen hardware hebt. - 4 -
3. moederbord Het moederbord is, als je in het binnenste van een computer kijkt, de grote vlakke plaat waarop alle onderdelen of aansluitingen voor onderdelen zijn gemonteerd. Eigenlijk verbindt het moederbord alle onderdelen (vaak componenten genoemd) met elkaar. Dat doet het moederbord door middel van de Northbridge, de Southbridge en de diverse bussen. De bussen leggen de verbindingen tussen de componenten van de PC. De opbouw van het moederbord en de bussen wordt voor een deel bepaald door het merk en type van de CPU die erop aangesloten kan worden. Figuur 1: de architectuur van een moederbord 1 In hoofdlijnen komt de architectuur (bouwtekening) van een computer neer op de schematische voorstelling zoals in Figuur 1 afgebeeld. Alle componenten en aansluitingen voor componenten (de grijze rechthoeken) in de figuur zitten op het moederbord. De blauwe pijlen tussen de componenten stellen de bussen voor. Via de bussen kunnen de componenten met elkaar communiceren. In Figuur 2 zien we een concreet voorbeeld van een moederbord. Alle componenten en aansluitingen uit Figuur 1 zien we hierop terug. 1 uit de methode van Remie Woudt - 5 -
Figuur 2: een moederbord 2 De belangrijke componenten of aansluitingen daarvoor, die we verderop gaan bespreken, zijn: G: De CPU aansluiting (socket) waar in Figuur 2 al een CPU in geplaatst is. D: De Northbridge. H: De RAM aansluitingen (slots). Hierin kunnen RAM modules gestoken worden. K: De Southbridge. 2 www.build-your-own-computer.net/image-files/motherboard-diagram-01.jpg - 6 -
4. CPU opgave 4.1 Bekijk de volgende YouTube film. De CPU (Central Processing Unit) wordt vaak gezien als het hart of de hersenen van de computer. In het Nederlands zeggen we vaak processor tegen de CPU, ook zie je wel de term centrale verwerkingseenheid. Het is een general-purpose processor; dat wil zeggen dat deze ingezet kan worden voor algemene en verschillende berekeningen en toepassingen. Voor de PC zijn er een aantal CPU fabrikanten. Intel en AMD zijn de grote spelers op deze markt. Een uitgebreide lijst van processoren kun je vinden op Wikipedia. In Figuur 3 zie je een aantal verschillende CPU merken en types. kloksnelheid Figuur 3: verschillende CPU merken en types 3 Een belangrijk begrip bij processoren is de kloksnelheid. Deze werd vroeger in megahertz (MHz) uitgedrukt maar tegenwoordig in gigahertz (GHz). Een kloksnelheid van bijvoorbeeld 3 GHz betekent dat de processor per seconde ongeveer 3*10 9 (3 miljard) acties kan uitvoeren. Een groep samenhangende acties noemen we een instructie. Er zijn instructies die uit één actie bestaan maar de meeste bestaan uit meerdere acties. 3 www.legitreviews.com/images/reviews/1060/intel_lynnfield_cpu.jpg - 7 -
multicore en hyper threading Een ander belangrijk begrip is het aantal kernen in de processorchip. Een chip met één kern heet single core, een chip met meerdere kernen heet multicore. Bij een CPU zie je bijvoorbeeld dual- (2), quad- (4), hexa- (6) en octa- (8) core. Er zijn ook al chips met 10 (deca-core) of meer kernen, maar die zijn nog erg duur. De kernen kunnen software maar ook hardware kernen zijn. Bij software kernen spreken we van hyper threading. Er is dan één fysieke hardware kern aanwezig maar voor de software lijken er meerdere kernen aanwezig te zijn. We spreken dan van concurrency. Bij hardware kernen zitten er fysiek meerdere onafhankelijke kernen op de chip. Deze kernen kunnen daadwerkelijk onafhankelijk van elkaar werken. We spreken dan van parallelle uitvoering, oftewel parallel processing. Als een CPU meerdere kernen heeft is dit gunstig voor de snelheid. Hardware kernen zijn gunstiger voor de snelheid dan software kernen maar ook duurder. De snelheidswinst hangt bovendien af van hoe goed de software gebruik maakt van de aanwezige kernen. Op het moment maakt niet alle software standaard even goed gebruik van multicore processorchips. caches Nog een belangrijk onderdeel van de CPU zijn de caches. CPU caches slaan data (kunnen ook instructies zijn) op in de processorchip zodat deze niet uit het RAM opgehaald hoeven te worden. Dit maakt de CPU significant sneller. Hoe groter de caches zijn hoe beter dit is voor de snelheid. Vroeger had een CPU doorgaans één of twee caches, de L1 en de L2 cache. Met de komst van processorchips met meerdere hardware kernen is er een L3 cache bijgekomen. De L1 cache is het kleinst en het snelst en is altijd gekoppeld aan één hardware kern. De L2 cache is groter en trager en is typisch gekoppeld aan één hardware kern. Bij hyper threading bedient de L2 cache echter meerder software kernen. De L3 cache is nog groter en trager en is een gedeelde cache voor alle hardware kernen. Ondanks dat de L3 cache veel trager is dan de L1 cache is deze oplossing altijd nog vele malen sneller dan data uit het RAM ophalen. Hoe de CPU met zijn caches omgaat is relatief complex. We gaan daarom beginnen met een voorbeeld waarin we maar 1 cache hebben, dus alleen een L1 cache, zie Figuur 4. Figuur 4: CPU met 1 cache. - 8 -
Wanneer de CPU iets wil lezen, maar het staat niet in de cache, dan noemen we dat een cache miss. De CPU moet de data dan uit het RAM ophalen. Daarbij zorgt de CPU ervoor dat de opgehaalde data ook meteen in de cache worden gezet. Vanwege snelheid haalt een CPU nooit een individuele byte op uit het RAM, maar altijd een blok van een vast aantal bytes. In de cache wordt dan ook altijd met blokken gewerkt. Stel de cache is 16 KiB 4 groot, dan kan een blok bijvoorbeeld 512 bytes zijn en bestaat de cache dus uit 32 blokken. De hoeveelheid data die per keer opgehaald wordt uit het RAM is dan dus ook 512 bytes. Wanneer de CPU net begint met werken is de cache nog leeg. In het begin zullen er dus relatief veel cache misses optreden. Na verloop van tijd zal de cache echter helemaal gevuld zijn. Het wordt interessant als er een cache miss optreedt en de cache zit vol. Welk blok in de cache moet dan overschreven worden? Hiervoor zijn veel strategieën denkbaar. Je kunt bijvoorbeeld het blok dat het langst in de cache staat vervangen (FIFO: First In First Out), maar je kunt ook het blok vervangen dat het langst niet gebruikt is (LRU: Least Recently Used). Dit zijn twee voorbeelden van zogenaamde cache replacement algoritmes, voor meer informatie zie Wikipedia. Wanneer we een CPU met twee caches hebben, zie Figuur 5, wordt het al complexer. Als de CPU iets wil lezen, maar het staat niet in de L1 cache, dan gaat de CPU eerst nog in de L2 cache kijken. Pas als het daar niet in staat spreken we van een cache miss. Figuur 5: CPU met 2 caches. De L2 cache is groter dan de L1 cache, bijvoorbeeld 512 KiB, maar wel minder snel. Gezien de grootte van een L2 cache is het niet handig om dezelfde blokgrootte te hebben als in de L1 cache, want dan krijg je teveel blokken. Daarom is de blokgrootte in de L2 cache ook groter dan in de L1 cache. De blokgrootte van de L2 is cache kan bijvoorbeeld 4 KiB zijn en dan heb je 128 blokken. 4 KiB staat voor KibiByte en dat is dus niet 1000 bytes, maar 1024 bytes. - 9 -
Hoe werkt het dan als we een cache miss hebben? In dat geval zal er een blok van 4 KiB uit het RAM opgehaald worden en in de L2 cache gezet worden. Uit het L2 blok wordt vervolgens weer het relevante blok van 512 bytes voor de L1 cache gehaald en in de L1 cache gezet. Het cache replacement algoritme voor de L2 cache kan anders zijn dan voor de L1 cache, maar dat hoeft niet. Dan is er nog een extra geval en dat is dat de data niet in de L1 cache staat, maar wel in de L2 cache. In dat geval wordt, net als bij een cache miss, het relevante blok van 512 bytes uit de L2 gehaald en in de L1 cache gezet. Als we een L3 cache toevoegen is het principe hetzelfde als bij het toevoegen van de L2 cache, alleen heb je meer mogelijkheden. De L3 cache is bedoeld voor een CPU met meerdere hardware kernen. Dit beïnvloedt het cache replacement algoritme. De L3 cache is groter, bijvoorbeeld 8 MiB, en trager dan de L2 cache en zal ook een grotere blokgrootte hebben. In Figuur 6 zie je een voorbeeld van de L1, L2 en L3 caches bij een Intel Core I7 CPU. Figuur 6: een Intel Core I7 CPU cache architectuur 5 opgave 4.2 Beschrijf welke aspecten van de CPU een belangrijke rol spelen voor de snelheid van een PC behalve de kloksnelheid. 5 bron: internet, locatie onbekend - 10 -
opgave 4.3 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) Twee grote spelers op de CPU markt voor de PC zijn AMD en Intel. b) Tegenwoordig wordt de kloksnelheid uitgedrukt in gigahertz. c) Een hardware kern is net zo snel als een software kern. d) Als we rekenen op meerdere hardware kernen noemen we dat hyper threading. e) Caches zitten op de CPU om de hoeveelheid interactie van de CPU met het RAM te verminderen. f) Op een CPU zitten altijd twee caches, de L1 en de L2 cache. g) De L2 cache is groter en sneller dan de L1 cache. h) Als de CPU de data niet vindt in de L1 cache heet dat een cache miss. i) LIFO (Last In First Out) is geen cache replacement algoritme. j) Wanneer een cache miss optreedt, dan wordt de inhoud van alle caches aangepast. - 11 -
5. bussen Zoals gezegd, vormen bussen de verbindingen tussen de componenten en aansluiting voor componenten op het moederbord. Zulke bussen noemen we systeembussen. Zoals je dadelijk zult zien, bestaat een systeem-bus op zijn beurt ook weer uit bussen. Deze deel bussen hebben ieder hun eigen naam. Door een bus gaan alle elektrische signalen (communicatie) tussen de componenten die erop aangesloten zijn. De snelheid van een bus wordt bepaald door twee aspecten: de snelheid en bandbreedte van de bus. Hierover straks meer. Tussen de CPU en Northbridge loopt de snelste bus van het systeem. Dit is nodig omdat de CPU contact kan hebben met bijna alle componenten op het moederbord. Afhankelijk van het type moederbord en het merk CPU dat erop past wordt een andere systeem-bus gebruikt: Bij moederborden die Intel processoren ondersteunen zien we de Front Side Bus (FSB). Bij moederborden die AMD processoren ondersteunen zien we de Hyper Transport Bus (HTB). De bandbreedte van een bus wordt bepaald door de hoeveelheid bits die er tegelijkertijd (parallel) doorheen kunnen, zie Figuur 7. Ieder bit wordt over een aparte buslijn getransporteerd. Dus bij bijvoorbeeld een bandbreedte van 8 bits, heeft de bus dus 8 buslijnen. De bandbreedte wordt uitgedrukt in bits. Hoe hoger de bandbreedte, hoe sneller de bus. Figuur 7: een drietal bussen met verschillende bandbreedtes 6 De snelheid van een bus wordt bepaald door de hoeveelheid bits, die er per buslijn per tijdseenheid achter elkaar doorheen kunnen. Dit noemen we de kloksnelheid van de bus en de eenheid is Hertz. Hoe hoger de kloksnelheid, hoe sneller de bus. Meestal wordt de kloksnelheid van een bus uitgedrukt in Megahertz. 6 www.alf.sd83.bc.ca/courses/it12/using_it/processor_speed.htm - 12 -
In Figuur 8 zie je drie belangrijke delen van een systeem-bus. Zoals gezegd worden deze delen ook bussen genoemd; dus in een systeem-bus zitten weer bussen. De 3 bussen die in elke systeem-bus zitten zijn van boven naar onder: De adres bus; deze wordt gebruikt om geheugenadressen (locaties in het RAM, waarover later meer) waar data in staat uit te wisselen. De data bus; deze wordt gebruikt om data en instructies (die feitelijk ook data zijn) uit te wisselen. De control bus; deze wordt onder andere gebruikt om aan te geven of er gelezen of geschreven moet worden. Daarnaast wordt deze gebruikt om de data en adres bussen te synchroniseren. De Side Band Signals (de vierde bus) zijn specifiek voor de FSB en niet iedere systeem-bus heeft deze. Figuur 8: De architectuur van de FSB 7 In Hoofdstuk 8 zien we een aantal van de bussen weer terug en gaan we je uitleggen hoe de CPU ze gebruikt om te lezen uit en schrijven naar het RAM. 7 bron: internet, locatie onbekend - 13 -
opgave 5.1 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) Aan elke CPU zit een belangrijke bus vast, deze heet de FSB. b) De bandbreedte van een bus wordt bepaald door de hoeveelheid bits, die er per buslijn per tijdseenheid achter elkaar doorheen kunnen. c) De control bus wordt alleen gebruikt om aan te geven of er gelezen of geschreven moet worden. - 14 -
6. bridges De Northbridge en de Southbridge worden samen de chipset van het moederbord genoemd. De chipset wordt meestal speciaal voor een bepaald type CPU ontworpen. De Northbridge (aanduiding D in Figuur 2) is bedoeld voor de snelle communicatie met het RAM (interne geheugen of werkgeheugen) en het video gedeelte. Verder verzorgt de Northbridge ook de communicatie met de rest van de pc via de tragere Southbridge. De Northbridge kan naast de hiervoor beschreven taak ook andere taken hebben. Zo kan er een geïntegreerd video gedeelte in zitten. Vaak zit er ook een netwerk interface in. De Southbridge (aanduiding K in Figuur 2) regelt de communicatie met de tragere componenten van de PC zoals bijvoorbeeld de harde schijven, het toetsenbord, de muis enzovoorts. Soms zit er ook een netwerk interface in, zodat die niet in de snellere (en dus duurdere) Northbridge hoeft te zitten. opgave 6.1 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) De Southbridge is de snelle chip van de moederbord chipset. b) De Northbridge zit aangesloten op het RAM. c) De Southbridge zit tussen de CPU en de Northbridge in. - 15 -
7. RAM RAM staat voor Random Access Memory en wordt vaak het werkgeheugen van de computer genoemd. Wanneer de computer lang genoeg uitstaat, meestal maximaal 30 seconden, dan loopt het RAM leeg; oftewel de data die erin stond gaat verloren. Dat is dan ook de reden, dat we harde schijven in een computer stoppen zodat we ook lange termijn opslag hebben. RAM bevindt zich op zogenaamde RAM chips die op hun beurt weer op RAM modules zitten, zie Figuur 9. Op het moederbord bevinden zich de aansluitingen (slots) om de RAM modules in te steken (aanduiding H in Figuur 2). RAM moet makkelijk vervangen en uitgebreid kunnen worden en is daarom niet op het moederbord geintegreerd. Figuur 9: diverse soorten RAM modules 8 De CPU heeft RAM nodig om snel te kunnen werken. Direct werken met een harde schijf is veel te traag. opgave 7.1 Bekijk de volgende YouTube film. Het RAM bestaat uit geheugenlocaties waar instructies en data in opgeslagen kunnen worden. Deze locaties kun je benaderen via geheugenadressen. Deze adressen zijn belangrijk bij het programmeren zoals je in het filmpje hebt kunnen zien. 8 upload.wikimedia.org/wikipedia/commons/d/d3/ram_n.jpg - 16 -
Geheugenlocaties hebben een grootte die we de woordgrootte (uitgedrukt in bits) noemen. Ook geheugenadressen hebben een grootte die we de adresgrootte (uitgedrukt in bits) noemen. De woordgrootte en adresgrootte kunnen even groot zijn, maar dat hoeft niet en is ook vaak niet zo. De adresgrootte moet wel kleiner dan of gelijk aan de woordgrootte zijn. De groottes moeten wel overeenkomen met de interne eigenschappen van de CPU en de bandbreedte van de bussen in het computersysteem. Veel computersystemen gebruiken op het moment met 64 bits architectuur. Dat wil zeggen, dat er een 64 bits CPU op een moederbord met een 64 bits bus bandbreedte zit en de adresgrootte van het RAM 64 bits is. Bekijk het volgende stuk geheugen met een adresgrootte van 8 bits en woordgrootte van 8 bits. We nemen even 8 bits, omdat we dit nog redelijk overzichtelijk kunnen laten zien. In de linker kolom staat het adres, dat we altijd als hexadecimaal getal schrijven. In de andere kolommen staan bits die de data op het adres voorstellen. Dit is dus de inhoud van de geheugenlocatie. Zo vinden we op adres 0x05 het getal decimale getal 236. adres bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 0x00 0 1 0 0 1 1 1 1 0x01 1 0 0 1 0 0 0 1 0x02 0 0 0 0 0 0 0 0 0x03 0 1 1 1 0 1 0 1 0x04 0 1 1 1 0 1 0 0 0x05 1 1 1 0 1 1 0 0 0x06 1 0 1 0 1 0 0 0 0x07 0 0 0 0 1 0 1 1 0x08 1 1 1 1 1 1 1 1 0x09 1 0 0 0 1 0 1 1 0x10 0 0 0 0 1 0 1 0 0x11 0 0 0 0 0 0 0 0 0x12 0 1 0 0 1 1 1 0 0x13 1 1 1 1 1 1 1 1 opgave 7.2 Welke getallen staan op adressen 0x01, 0x02, 0x08, 0x11 en 0x13? Je ziet dus dat er best dezelfde waarde in verschillende geheugenlocaties mogen staan. Er is geen directe relatie tussen de locaties. - 17 -
Vroeger moesten programmeurs direct met de geheugenadressen van het RAM werken als ze computerprogramma's schreven. Tegenwoordig hebben we hogere programmeertalen en scripts, zoals C, C++, C#, Java en JavaScript, die ons variabelen laten gebruiken om naar geheugenlocaties te verwijzen. De code die we schrijven wordt voor ons vertaald naar code die direct werkt met geheugenadressen, zodat we dat niet zelf hoeven te doen. Het vertalen van de code gebeurt door zogenaamde compilers (voor programmeertalen) en interpreters (voor scripts). Als we een stuk JavaScript code hebben voor een 16 bits computersysteem met RAM woordgrootte 8, dan kan dat er als volgt uitzien: var getal = 20; De betekenis van deze code is dat de decimale waarde 20 in de variabele getal wordt gezet. Dan wordt de variabele getal vertaald naar een geheugenlocatie, bijvoorbeeld 0x0004 en wordt op dat adres de inhoud van de geheugenlocatie verandert in binair 00010100, want dat stelt het decimale getal 20 voor. opgave 7.3 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) RAM bestaat uit geheugenlocaties die te benaderen zijn via geheugenadressen. b) Een geheugenlocatie en een geheugenadres zijn verschillende termen waarmee hetzelfde bedoeld wordt. c) Woordgrootte en adresgrootte van het RAM moeten altijd gelijk zijn. d) De adresgrootte van het RAM moet kloppen bij de bandbreedte van de bussen op het moederbord. e) De woordgrootte van het RAM moet kloppen bij de architectuur van de CPU. f) Een compiler wordt gebruikt om hogere programmeertalen te vertalen naar iets dat de CPU begrijpt. g) Een interpreter is hetzelfde als een compiler. h) Een hogere programmeertaal is een taal die relatief goed te begrijpen is door mensen. - 18 -
8. hardware architectuur In de vorige hoofdstukken hebben we een overzicht gezien van de componenten in een computer die belangrijk zijn als we gaan programmeren. We hebben ook gekeken naar de samenhang tussen de componenten toen we het over het moederbord hadden. In dit hoofdstuk gaan we dieper in op de architectuur van de CPU en de samenhang met onder andere het RAM. In Figuur 1 heb je al een voorbeeld gezien van een architectuurtekening. In dat geval van het moederbord. Onder architectuur van een systeem, bijvoorbeeld een computer, verstaan we de hoog niveau (dus abstracte of modelmatige) bouwtekeningen van dat systeem tezamen met de uitleg ervan. de werking van de CPU In Figuur 10 zie je schematisch afgebeeld welke invoer een CPU nodig heeft om een bewerking te doen en de uitvoer die het resultaat is van die bewerking. De pijlen in deze afbeelding zijn datastromen. De CPU krijgt als invoer instructies met bijbehorende data. De bijbehorende data is een getal (of een geheugenadres, maar dat is feitelijk ook een getal). Ook de uitvoer is een getal (of een geheugenadres). Figuur 10: data- en instructieverwerking door de CPU Ten behoeve van iedere instructie voert de CPU een cyclus van acties uit; de Von Neumann cyclus. Deze cyclus zie je in Figuur 11. Eerst moet een instructie opgehaald worden (fetch), daarna moet gekeken worden welke instructie het is (decode) en daarna kan de instructie uitgevoerd worden (execute). Figuur 11: de Von Neumann cyclus 9 9 www.teach-ict.com/gcse_computing/ocr/212_computing_hardware/cpu/miniweb/pg3.htm - 19 -
Je weet intussen dat alle componenten in een computer via bussen verbonden zijn, dus ook de CPU en het RAM. Om instructies en data uit het RAM te halen, moet je weten waar die staan; oftewel, je moet weten op welk geheugenadres de instructie of data staat. Voor het schrijven van data naar het RAM geldt hetzelfde. Als de CPU bijvoorbeeld de bewerking 3 + 6 moet uitvoeren, waarbij het getal 3 op geheugenadres 40 staat, het getal 6 op adres 72 en het resultaat op adres 56 geschreven moet worden, dan gaat dat heel abstract zoals afgebeeld in Figuur 12. Figuur 12: abstracte weergave van een optelling in een CPU Het programmeren van een CPU op het laagste niveau gebeurt in machinetaal. Zoals je al geleerd hebt zorgen compilers en interpreters ervoor dat programma's geschreven in hogere programmeer- en scripttalen omgezet worden in machinetaal. Alle instructies, getallen en adressen worden in machinetaal uitgedrukt in nullen en enen. Het is daarom niet de meest handige manier om in te programmeren. Bovendien is de machinetaal van iedere CPU type anders; ieder type CPU heeft dus zijn eigen verzameling instructies. Je ziet in Figuur 12 veel stappen. Als je het voorbeeld echt zou moeten programmeren heb je typisch minder stappen nodig om de code zo kort mogelijk te houden. Omdat ieder type CPU anders werkt kan het aantal stappen dat je nodig hebt dus ook verschillen per type CPU! - 20 -
Het is erg lastig om effectief en foutloos te programmeren in machinetaal. Toch wil je soms, zelfs tegenwoordig nog, code schrijven die direct door de CPU uitgevoerd wordt. Dat is met name nodig wanneer de code die je schrijft voorspelbaar snel moet zijn. Een compiler, en zeker een interpreter, kunnen dat niet garanderen. Daarom stellen de makers van een CPU meestal een taal ter beschikking die net iets boven het niveau van de machinetaal ligt: de assembleertaal (assembly language). Hiermee ga je in de assembleertaal module aan de slag. Ook de termen assembler en assembly zie je vaak gebruikt worden voor deze taal. Deze termen dekken feitelijk niet helemaal de lading, maar liggen wel lekker in het gehoor. Zorg dat je goed snapt hoe de CPU die we hier uitleggen werkt, want die kennis heb je nodig als je met de assembleertaal aan de slag gaat. opgave 8.1 Werk zelf een voorbeeld uit waarin een CPU de getallen 16 en 9 moeten vermenigvuldigen. Hierbij staat het getal 16 op adres 200, het getal 9 op adres 201 en het resultaat moet teruggeschreven worden op adres 300. de Zeer Eenvoudige Processor (ZEP) Zoals je in Figuur 12 ziet, moet de CPU een gelezen getal soms tijdelijk opslaan tot alle getallen die nodig zijn voor de bewerking bekend is. Hiervoor gebruikt de CPU registers. Registers zijn kleine stukjes opslagruimte in de CPU. In Figuur 13 zie je een aantal van deze registers afgebeeld zoals R1, R2, PC en IR. In de R1 en R2 registers kan data opgeslagen worden. In het IR (Instruction Register) wordt de huidige instructie opgeslagen. In de PC (Program Counter) staat het geheugenadres waaruit de volgende instructie van het programma gelezen moet worden. - 21 -
Figuur 13: architectuur van de Zeer Eenvoudige Processor (ZEP) 10 In Figuur 12 komen de instructies uit de lucht vallen en dat is natuurlijk in werkelijkheid niet zo. Figuur 12 laat alleen de opeenvolgende EXECUTE stappen van de Von Neumann cyclus zien. Instructies moeten eerst opgehaald (FETCH) worden. Dit gaat feitelijk hetzelfde als het ophalen van data. Instructies staan namelijk ook gewoon in het RAM en hebben dus een geheugenadres. Zoals je al gelezen hebt, staat het adres van de volgende instructie in een speciaal register in de CPU, de PC (Program Counter). Door te lezen wat er op het geheugenadres uit de PC staat, krijgt de CPU de instructie binnen en zet deze in het IR (Instruction Register). De PC wordt daarna meteen opgehoogd zodat die weer naar de volgende instructie wijst. Vervolgens kan de CPU die instructie uit het IR decoderen. 10 www.voti.nl/hvu/v1cp1/ - 22 -
Maar hoe gaat dat lezen en schrijven via de bussen nu precies? Om dat te weten moet je snappen hoe de bussen tussen de CPU en het RAM 11 in elkaar zitten en hoe instructies van een CPU eruit zien. In Hoofdstuk 5 heb je de drie belangrijke onderdelen van de systeem-bussen al gezien. Zoals al eerder gezegd, heeft iedere CPU type zijn eigen verzameling instructies. De instructies die je nu gaat zien horen bij de Zeer Eenvoudige Processor (ZEP) uit Figuur 13. Dit type CPU wordt tegenwoordig niet meer gebruikt. We gebruiken hem echter, omdat het een makkelijk instap is in de materie. Een voorbeeld van een leesinstructie van de ZEP is: LOAD R1, 0x20. Het eerste deel, LOAD, geeft aan wat de instructie moet doen; in dit geval laden, oftewel lezen. Het tweede deel, R1, geeft aan waar de gelezen data moet worden opgeslagen; in dit geval het register genaamd R1. Het laatste deel, 0x20, geeft aan waar de data gelezen moet worden; in dit geval geheugenadres 0x20. Een voorbeeld van een schrijfinstructie van de ZEP is: STORE R1, 0x32. Alle delen uit een instructie staan, zoals gezegd, in het RAM en moeten daarom ook gelezen worden. Om de instructie te bemachtigen leest de CPU dus het adres uit de PC en hoogt de waarde ervan op zodat de PC naar de volgende instructie wijst. Nu je dit allemaal weet, kunnen we laten zien hoe het lezen van data uit een geheugenadres gaat. Bij LOAD R1, 0x20 gebeurt het volgende: 1. FETCH: a. De CPU zet het adres uit de PC op de adres bus. b. De CPU geeft, via de control bus, aan dat de inhoud van het adres gelezen moet worden en wacht op bevestiging via de control bus. c. De CPU haalt de hele instructie op via de data bus. In de instructie zitten het register en geheugenadres versleuteld (deze heten de operanden). d. De CPU zet de opgehaalde instructie in het IR. e. De CPU verhoogt de PC. 2. DECODE: De CPU decodeert de instructie en bijbehorende operanden. 3. EXECUTE: a. De CPU zet het adres van de geheugen operand op de adres bus, in ons geval 0x20. b. De CPU geeft, via de control bus, aan dat de inhoud van het adres gelezen moet worden en wacht op bevestiging via de control bus. c. De CPU haalt de data op via de data bus en zet die in de register operand van de instructie, in ons geval R1. 11 We laten CPU caches buiten beschouwing, omdat die voor het principe niet belangrijk zijn. Feitelijk is een CPU cache ook een stuk geheugen met geheugenadressen. - 23 -
opgave 8.2 Beredeneer zelf hoe de STORE instructie werkt en werk de Von Neumann cyclus ervoor uit. opgave 8.3 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) De Von Neumann cyclus bestaat achtereenvolgens uit DECODE, FETCH en EXECUTE. b) Een geheugenadres is het adres van een geheugenlocatie. c) Registers zijn kleine stukjes opslagruimte in het RAM. d) Voorbeelden van registers zijn de PC en het IR. e) In de PC staat de instructie opgeslagen die de CPU moet uitvoeren. - 24 -
architectuurmodellen De eerste computers werkten met fysiek gedeelde opslag voor instructies en data. Dat wil zeggen dat er of een instructie of een stuk data uit het geheugen gelezen kan worden, niet beide tegelijkertijd. Zulke computers zijn gebouwd op basis van de zogenaamde Von Neumann architectuur, zie Figuur 14. Na verloop van tijd kwam men erachter dat het parallel kunnen lezen van instructies en data een grote snelheidswinst op kan leveren. Het feit dat dit bij de Von Neumann architectuur niet kan heet de Von Neumann bottleneck. Figuur 14: een mogelijke Von Neumann architectuur 12 Een oplossing voor de Von Neumann bottleneck is computers bouwen met fysiek gescheiden geheugen voor instructies en data. Zulke computers zijn gebouwd op basis van de zogenaamde Harvard Architectuur, zie Figuur 15. Dit levert snelheidswinst op, maar heeft als nadeel dat je minder effectief en flexibel met het geheugen om kunt gaan. Stel je hebt meer data dan datageheugen en je hebt nog wel instructiegeheugen vrij. Je kunt dan, in het geval van de Harvard architectuur, de overtollige data niet in het instructiegeheugen bewaren. Figuur 15: een mogelijke Harvard architectuur 13 12 www.electronics.dit.ie/staff/tscarff/architecture/neumann_harvard.gif - 25 -
Zowel de Von Neumann als de Harvard architectuur hebben dus een significant nadeel. Daarom heeft men een architectuur bedacht die die nadelen niet heeft. Deze heet de Modified Harvard architectuur. De Modified Harvard architectuur maakt dus gebruik van zowel fysiek gedeelde opslag als van fysiek gescheiden opslag. De Modified Harvard architectuur kan op diverse manieren gerealiseerd worden. Eén van de mogelijkheden zie je in Figuur 16. Bij deze oplossing wordt een extra bus tussen de CPU en het datageheugen geplaatst. Het instructiegeheugen wordt klein gehouden en het datageheugen is groot. Hierdoor moeten in geval van nood instructies in het datageheugen worden gezet maar zelfs in dat geval kan er nog altijd een instructie en een stuk data tegelijkertijd gelezen worden. Een bijkomend voordeel van deze oplossing is dat er een instructie en twee stukken data tegelijkertijd gelezen kunnen worden als de instructie in het instructiegeheugen staat. Het hebben van een extra bus is wel duurder. Daarom wordt deze oplossing nauwelijks gebruikt. Figuur 16: een mogelijke Modified Harvard architectuur 14 Een andere, veel gebruikte, manier om de Modified Harvard architectuur te realiseren zie je in Figuur 17. Eerder heb je hiervan, in Figuur 6, ook al een voorbeeld gezien, toen we het onderwerp caches behandelden. Wat een moderne CPU typisch doet is de L1 cache dubbel uitvoeren, het Harvard principe. Het ene deel wordt gebruikt voor instructies (Code Cache) en het andere voor data (Data Cache). De andere caches en het RAM werken dan volgens de Von Neumann architectuur en bevatten zowel data als instructies. Bij deze oplossing kan de CPU altijd een instructie en een stuk data tegelijkertijd uit de L1 cache lezen en kunnen de andere caches en het RAM toch beide bevatten. Aangezien caches toch nodig zijn op de CPU brengt deze oplossing nauwelijks extra kosten met zich mee. 13 www.electronics.dit.ie/staff/tscarff/architecture/neumann_harvard.gif 14 embeddedsystemdesignhub.blogspot.nl/2009/11/introduction-to-dspic-dsc.html - 26 -
Figuur 17: Modified Harvard architectuur met behulp van caches 15 opgave 8.4 Leg in je eigen woorden duidelijk en volledig uit waarom de Modified Harvard architectuur is bedacht en hoe je hem kunt implementeren. opgave 8.5 Zijn de volgende beweringen waar of niet waar? Als je een bewering niet waar vindt moet je uitleggen waarom je dat vindt. a) De oplossing voor het nadeel van de Harvard architectuur is de Von Neumann architectuur. b) Caches worden in moderne computers gebruikt om de Modified Harvard architectuur te implementeren. 15 bron: internet, locatie onbekend - 27 -
9. wat heb je geleerd Je hebt in deze module de belangrijkste componenten van een computer gezien en geleerd waarom je ze nodig hebt en hoe ze werken. Daarnaast heb je geleerd hoe een eenvoudige CPU in elkaar zit en werkt. Ook heb je geleerd hoe de CPU en het RAM (met daartussen de caches) samenwerken via de deel bussen van een systeem-bus. Tot slot heb je een drietal klassieke computerarchitectuur modellen gezien. - 28 -