# Computersystemen/Werking computersystemen
## Doelstellingen

Deze pagina bespreekt leerplandoel 15 uit het leerplan 'Informatica- en communicatiewetenschappen' (D/2023/13.758/):
* LPD 15: De leerlingen lichten de opbouw, de werking en de samenwerking toe van de componenten van een computersysteem.
** Processor, intern geheugen, gegevenstransport
** Invoer, uitvoer, opslag
* Wenk. Belangrijk is inzicht te creëren in wat een processor is en wat een processor doet. Hiertoe ga je in op het gegevenstransport tussen de verschillende componenten: processor, bussen, geheugen. Je geeft de belangrijkste componenten van een processor en hun samenhang schematisch weer: stuurorgaan, rekenorgaan, enkele registers, klok, cachegeheugen.
* Wenk. Je kan de belangrijkste stappen bij de verwerking van eenvoudige instructies, nl. halen, interpreteren en uitvoeren, beschrijven en de functie van de klok daarbij toelichten. Het is niet de bedoeling om hier diep op in te gaan maar de leerlingen moeten inzicht krijgen in hoe de processor een instructie verwerkt.
* Wenk. Je kan de soorten intern geheugen van verschillende computersystemen en hun werking toelichten: werkgeheugen, cachegeheugen, programmageheugen, datageheugen.
Er zijn overeenkomsten met leerplandoelen uit Informaticabeheer: bv. Computerbussen, Processor en Geheugen.

## Gegevensverwerking

De meest eenvoudig manier om gegevensverwerking voor te stellen is als invoer (input) ➡️ verwerken (processing) ➡️ uitvoer (output). Dit kan je verder uitbreiden:
* Vaak wil je ook iets kunnen bewaren en is er opslag nodig. Merk de dubbele pijl in de eerste afbeelding op.
* De tweede afbeelding toont aan dat er informatie uit de buitenwereld als invoer gegeven wordt aan een gegevensverwerkend systeem. Idem voor de uitvoer. Merk ook op dat de afbeelding ook weergeeft dat er niet altijd opslag nodig is.
* Bij de derde afbeelding is communicatie hier niet onder invoer of uitvoer geplaatst, maar als een apart item. Je ziet er ook enkele concrete voorbeelden van de onderdelen.
** Invoer: toetsenbord, muis, scanner, OCR lezer, tekentablet, microfoon, webcam, touchscherm
** Opslag: harde schijf, USB stick, optische schijven (Blu-Ray, CD, DVD), SD-kaart
** Verwerking: processor
** Communicatie: modem, Wi-Fi-kaart, Netwerkkaart, Bluetooth
** Uitvoer: printer, beeldscherm, projectie, brailleschermen, luidsprekers, hoofdtelefoon, tv-scherm
I.v.m. invoer:
* Er zijn de "klassieke" voorbeelden zoals toetsenbord, muis, scanner, microfoon, webcam, of aanraakscherm.
* Ook de gsm gebruikt sensoren (die je bv. in de MIT App Inventor kan benaderen):
** Accelerometer: voor detectie beweging en oriëntatie. Bv. oriëntatie telefoon, stappenteller, spelbesturing, valdetectie, afspeellijst shufflen,...
** Gyroscoop: rotatiebeweging en oriëntatie. Bv. kompas, navigatie, aanvulling bij accelerometer.
** Magnetometer: meet magnetische velden. Bv. kompas, kaartoriëntatie.
** Biometric apparaat. Bv. vingerafdruksensor, gezichtsherkenning of hartslag.
** Proximity sensor: nabijheidssensor. Bv. om het scherm te dimmen als je jouw gsm tegen je oor houdt.
** Ambient light sensor. Bv. om het schermlicht aan te passen aan het omgevingslicht.
* Binnen een elektronicaproject kan data door verschillende sensoren vergaard worden, bv. in combinatie met microcontrollers.
* iPhone Proximity Sensor
* Ultrasonic sensor
* Capacitive sensor
* PIR sensor

## Gegevenstransport

Tussen verschillende componenten op een moederbord is communicatie nodig, waarvoor bussen kunnen worden gebruikt. We lichten dit gegevenstransport toe d.m.v. de systeembus: een enkele computerbus die o.a. de processor met het werkgeheugen verbindt. Afhankelijk van de situatie is er een lees- of een schrijfoperatie.
De systeembus bestaat uit drie deelbussen, ingedeeld volgens hun functie:
* databus (of gegevensbus) voor het transport van gegevens;
* adresbus voor het transport van geheugenadressen;
* controlebus (of besturingsbus) voor het signaal van de bewerking (lezen of schrijven), maar ook voor het doorgeven klokpulsen van de klokgenerator naar de processor.

### Lezen

Programma's worden in eerste instantie ingeladen in het geheugen (MEM), maar om het te kunnen uitvoeren moet dit gebeuren in de CPU. Stel dat twee getallen moeten opgeteld worden, dan is "optellen" de instructie. Er zijn echter ook twee getallen nodig, dus ook data komt van het geheugen. Er is dus een leesoperatie nodig van het geheugen naar de processor.
* CPU stuurt het adres van de geheugenplaats langs de adresbus naar het geheugen (MEM).
* CPU zet het leessignaal op de controlebus en de CPU doet ondertussen iets anders (de CPU is namelijk veel sneller dan MEM en hem met zijn vingers laten draaien zou zonde van de tijd zijn).
* Door 1 en 2 weet het geheugen dat hij verwacht wordt om de waarde te zoeken die staat op het aangegeven geheugenadres. Eens gevonden zet hij deze klaar op de databus.
* Geheugen geeft via de controlebus door dat de waarde klaarstaat op de databus.
* CPU neemt de gegevens over vanop de databus.

### Schrijven

Als de CPU een bepaald resultaat berekend heeft moet dit bewaard kunnen worden. Dit resultaat moet dus geschreven worden in/naar het geheugen (MEM).
* CPU stuurt het adres van de geheugenplaats langs de adresbus naar het geheugen.
* CPU zet het schrijfsignaal op de controlebus.
* CPU stuurt de data naar het geheugen. De CPU zijn schrijftaak zit erop en dus kan hij iets anders doen.
* Door 1 en 2 weet het geheugen dat er data zal verstuurd worden over de databus en dat hij verwacht wordt om die data (zie 3) op te slaan in zijn geheugen op het adres zoals aangegeven bij stap 1.

## Processor
### Definitie

De processor, ook bekend als CPU (Engels: central processing unit), is de hardware in een computer die de instructies van een computerprogramma uitvoert. De processor bepaalt voor een groot deel de snelheid van het volledige systeem. Natuurlijk zal bij een snelle processor met een traag opslagmedium, deze laatste de snelheid voor het volledige systeem negatief beïnvloeden.
Er zijn verschillende soorten processoren:
* Bij een desktop, laptop en server gaat het om socketprocessoren. Zo'n processor kan je dan loshalen van de socket op het moederbord (zie verder).
* Bij tablets en smartphone is het vaak SoC (System on a chip): dan heb je bv. CPU, GPU en geheugen op één enkele chip, "vastgesoldeerd" aan een soort van moederbord. Ook bij andere embedded toepassingen wordt dit gebruikt.
* Bij het gebruik van de term microcontroller heeft men het vaak over een minder krachtige SoC, bv. de microcontroller ATmega328P op het board van Arduino UNO. Dit is voor embedded toepassingen die minder geheugen of geen GPU nodig hebben.
* Socket-processor
* Blu-Ray SoC
* Arduino UNO met microcontroller

### Componenten

Als de grootte van de processor vergeleken wordt met wat hij allemaal kan, dan is dit een knap staaltje techniek! Bovendien is de eigenlijke microchip (Engels: die) nog een pak kleiner: er is een omhulling nodig om de microchip hanteerbaar te maken. In de processor vind je onderstaande componenten terug.

#### ALU (rekenorgaan)

De Arithmetic logic unit is het centrale onderdeel van de processor van een computer dat o.a. de rekenkundige (arithmetic: +, -, *, /,...) en logische (logic: AND, NOT, OR, XOR) bewerkingen uitvoert. Met deze eenvoudige basisbewerkingen kunnen andere complexe bewerkingen worden uitgevoerd.

#### Controle unit (stuurorgaan)

De CU of controle unit is het controlecentrum van de CPU. Zo vertelt de CU hoe het RAM-geheugen en andere onderdelen moeten reageren op instructies van een programma.

#### Registers

De processor is niet bekend voor het opslaan van gegevens: daarvoor gebruiken we bv. RAM-geheugen, harde schijven of SSDs. Het probleem is echter dat zelfs het RAM-geheugen veel te traag is voor de processor. Dus heeft men besloten om heel snel geheugen rechtstreeks op de processor te plaatsen: het snelste geheugen is registergeheugen. Omwille van de kostprijs en de beperkte oppervlakte is dit geheugen echter ook klein.
Er zijn verschillende soorten registers:
* Werkregisters: dit zijn registers met een algemeen doel, bv. voor het bewaren van (tussen)resultaten.
* Instructieregister: niet alleen data, maar ook instructies zijn belangrijk, anders kan de processor niets doen. De huidige uit te voeren instructie wordt hierin bewaard.
* Adresregister (program counter): bevat het (RAM-geheugen)adres van de eerst volgende uit te voeren instructie. Deze instructie moet dan nl. worden opgehaald, zodat deze in het instructieregister terecht kan komen. Dit adresregister houdt dus bij hoe ver het programma al gevorderd is.
* Vlagregister: in dit register kunnen verschillende zaken worden bijgehouden, bv.:
** De zero-vlag geeft aan of het resultaat van een aftrekking 0 was of dat twee elementen gelijk waren.
** De sign-vlag wordt gezet bij een negatief getal.

#### Caches

In het hoofdstuk "Basiskennis informatica" lees je dat als er tussen twee samenwerkende onderdelen een snelheidsverschil is, de uiteindelijke snelheid wordt bepaald door de snelheid van de traagste component. Door gebruik te maken van een cache wordt dit snelheidsverschil verkleind: binnen deze snellere opslag worden zaken bewaard in de hoop dat ze (opnieuw) nodig zijn. Deze info hoeft dan niet van het tragere deel opgehaald te worden.
Bij de CPU heeft men al een snelle geheugenvorm op de processor: de registers. Deze bleken echter te klein te zijn om aan alle eisen te kunnen voldoen. Het RAM-geheugen was dan wel groot genoeg, maar de geheugenbus is te traag t.o.v. processorsnelheid. Dus bedacht men een tussenstap: de CPU-caches. De eerste keer haalt de CPU sowieso de data van het RAM-geheugen, maar deze data wordt ook in de caches opgeslagen. Daarna wordt eerst de cache bekeken in de hoop dat er data of instructies te vinden zijn, zodat deze niet meer van het tragere RAM-geheugen gehaald moeten worden.
Grotere caches hebben een hogere hit rate: de kans is groter dat data er al inzit. Helaas zijn grotere caches vaak ook trager. Vandaar bestaat er een multi-level cachehiërarchie: eerst wordt de kleinere maar snelle L1-cache bekeken, daarna de iets grotere, maar tragere L2-cache.
* Generic Multi-Level Cache Organization
* Cache Organisatie bij Intel Nehalem
* Cache hiërarchie
* Cache miss rate
De cache is te klein om alles te bewaren. Dus moet er soms ruimte vrijgemaakt worden. Het groter maken van een cache betekent niet per definitie snelheidswinst: als je iets bewaart in de cache dat in de toekomst toch niet meer nodig is, zal je geen snelheidswinst halen. Vandaar is niet op ieder systeem een L3-cache aanwezig.

#### Hulpprocessor

Een processor is zodanig ontworpen dat hij verschillende soorten van berekeningen en bewerkingen kan uitvoeren. Soms wordt besloten om naast de "gewone" processor ook een "hulpprocessor" te voorzien. Dit kan de volgende voordelen hebben:
* De gewone processor wordt zo ontlast.
* Deze hulpprocessor kan gespecialiseerd zijn in iets, waardoor hij het ook sneller kan uitvoeren dan de gewone processor.
De bekendste hulpprocessor is waarschijnlijk de GPU. Ter info nog enkele andere voorbeelden. Zo heeft men het over IGP (integrated graphics processor) als de GPU op dezelfde chip is uitgevoerd als de CPU. AMD heeft het over de accelerated processing unit (APU), Intel over HD Graphics en Nvidia over Project Denver.

### Werking

Een processor kan niet onmiddellijk iets uitvoeren, want er zijn minstens eerst nog twee andere stappen nodig:
* De processor is geen geheugenopslag: de eigenlijke programma's staan op een opslagmedium. Vervolgens worden deze bij het uitvoeren geladen in het RAM-geheugen en tenslotte moet de processor deze nog ophalen. Dit laatste staat bekend als fetch uit RAM.
* Dan weet de processor nog niet wat hij moet doen: voor het uitvoeren van een optelling moet hij zichzelf anders organiseren, dan bij het uitvoeren van een deling. Hij zal dus eerst nog de instructie moeten decoderen in de CU, om te weten wat hij moet doen.
* Dan pas kan de processor iets uitvoeren. Dit staat bekend als execute in de ALU.
* Tenslotte moet een eventueel resultaat terug opgeslagen worden: store in RAM.
Deze vier stappen (fases) worden steeds herhaald: hoe hoger dus de klok, hoe sneller deze stappen elkaar opvolgen. Zoals je al kon lezen in de basiscursus zijn kloksnelheid en processorsnelheid wel geen synoniemen (cfr. de Megahertz myth)!
Hoe worden instructies dan gecodeerd? Stel dat we een héél eenvoudige processorarchitectuur hebben, die enkel kan optellen en delen. Er moeten natuurlijk ook getallen uit het geheugen gehaald kunnen worden en ze moeten er ook terug in opgeslagen worden. Dan zou de instructietabel er als volgt kunnen uitzien:
Instructietabel :
| 00 | /, nl. delen |
| 01 | +, nl. optellen |
| 10 | get from memory |
| 11 | store to memory |
We weten ook al dat de processor werkt met (werk)registers. Stel dat we vier registers hebben, met onderstaande informatie. In de eerste twee kolommen staat het adres (eens decimaal, eens binair), in de derde kolom de binaire inhoud en in de laatste kolom de overeenkomstige decimale waarde van die inhoud.
Inhoud werkregisters :
| adres | adres (bin) | inhoud (bin) | inhoud (dec) |
| R0 | 00 | 0101100 | 44 |
| R1 | 01 | 1011101 | 93 |
| R2 | 10 | 1110110 | 118 |
| R3 | 11 | 0001010 | 10 |
Stel nu de processor de instructie 010111 heeft opgehaald. Wat wordt er verwacht dat de processor doet? Deze instructie 010111 bestaat uit de instructie zelf (01) en twee operands (01 en 11), wat het geheel 010111 maakt. Om te weten wat hij moet doen, moet de processor in zijn instructietabel (zie hoger) opzoeken wat '01' betekent, en dat blijkt de optelling te zijn. De eerste operand is 01 en is dus het tweede register, terwijl de tweede operand 11 is en dus het derde register. Na uitvoer wordt de inhoud van de registers:
Inhoud werkregisters (na instructie 010111) :
| adres | adres (bin) | inhoud (bin) | inhoud (dec) |
| R0 | 00 | 0101100 | 44 |
| R1 | 01 | 1100111 | 103 |
| R2 | 10 | 1110110 | 118 |
| R3 | 11 | 0001010 | 10 |
Ter info: dit is een sterk vereenvoudigde werking van een processor. In het echt is dit een stuk complexer doordat er meer dan drie stappen zijn en doordat men technieken toepast die het geheel sneller maken (bv. pipelining, dynamic branch prediction of de compiler die instructies in een andere volgorde plaatst).

## Geheugen

Als je een rekenbladprogramma opent, dan staat dit op je opslagmedium (bv. SSD of HDD). Dit bewaart het programma blijvend (permanent): ook als je computer uit staat, staat dat programma op jouw opslagmedium.
Om er ook iets mee te kunnen doen, moet het programma geladen worden, zodat het kan uitgevoerd worden door de processor. Het probleem is dat een opslagmedium véél trager is dan de processor, waardoor de processor vooral zou moeten wachten. Vandaar wordt een programma niet rechtstreeks uitgevoerd vanaf het opslagmedium, maar eerst gekopieerd naar het werkgeheugen. Deze wordt vaak ook aangegeven als intern geheugen of RAM. Het voordeel is dat deze een pak sneller is dan de gewone opslag. Nadelen zijn dat deze duurder is en de inhoud verliezen van zodra de spanning wegvalt.
Dat werkgeheugen is sneller dan de gewone opslag, maar helaas nog steeds trager dan de processor. Vaak wordt tussen het werkgeheugen en de processor nóg sneller geheugen gebruikt: het cachegeheugen. Dit is vaak nog duurder en daardoor vaak relatief klein, maar kan wel een snelheidsvoordeel opleveren. Dit is al besproken als component bij de processor.
Het rekenbladprogramma zelf zal dus geheugen innemen: het programmageheugen. Maar ook het rekenbladbestand wordt geladen vanaf het opslagmedium naar hetzelfde werkgeheugen. Om het verschil duidelijk te maken wordt hier gesproken over het datageheugen. Als je wijzigingen aanbrengt aan het rekenbladbestand, dan wordt dit onmiddellijk aangepast in het werkgeheugen (meer specifiek het datageheugen), maar niet noodzakelijk in het opslagmedium. Als automatisch opslaan uitstaat zal je jouw aanpassingen verliezen bij een crash of bij energieverlies.
Mogelijke verwarring:
* Geheugen (memory) en opslag (storage) worden soms onterecht door elkaar gebruikt. Het eerste bewaart de data echter vaak tijdelijk, terwijl de tweede dat permanent doet. Denk bij het tweede bv. aan een HDD, SSD of SD-kaartje (meer info bij opslagmedia).
* De term intern geheugen wordt vaak gebruikt, maar het is niet altijd duidelijk wat er precies wordt bedoeld. Meestal slaat het op 'intern in de computerbehuizing', waardoor het of werkgeheugen (RAM) of cachegeheugen kan zijn. Meestal bedoelt men echter met intern geheugen het RAM-geheugen.
* In het voorbeeld wordt een geladen rekenbladbestand als voorbeeld van datageheugen. Merk op dat het niet altijd afkomstig moet zijn van een bestand. Bv. een programma dat als invoer de straal van een cirkel aan de eindgebruiker vraagt en als uitvoer de oppervlakte berekent. De effectieve straal en de oppervlakte zijn dan onderdeel van het datageheugen.
* ↑ Zie de MIT App Inventor component reference > Sensor
* ↑ En ze willen de techniek nog verbeteren: Tweakers.net: Klein, kleiner, kleinst: de weg naar 5nm-chips
* ↑ In de filmpjes How a CPU is made, How do they make Silicon Wafers and Computer Chips? of Silicon Wafer Processing Animation kan je mooi enkele processen zien van hoe een CPU is gemaakt.
* ↑ Meer details over de werking van deze caches kan je lezen op extremetech.com: How L1 and L2 CPU caches work, and why they’re an essential part of modern chips.
* ↑ Een uitgebreide review van AMD Kaveri staat op AMD Kaveri Review - Cpu en gpu op gelijke voet
* ↑ Een uitgebreidere uitleg over de werking staat op Processor (computer) > Werking van een processor.
* ↑ Pipelining wordt mooi voorgesteld bij The Megahertz Myth (YouTube), waarin Apple het belang van de architectuur op de snelheid uitlegt. Op Ars Technica kan je bij Pipelining: An Overview een diepgaand artikel lezen.