% De titel van het hoofdstuk
\section{Computerabstracties en -technologie}
% De titel van de sectie / paragraaf uit het boek en de naam van de samenvatter.
% Hanteer dezelfde sectienummers als in het boek!


\subsectionauthor[R.A.J. Wacanno]{Principes Binnen de Computerarchitectuur}
Bij het ontwerpen van computers is men in de loopt de jaren met bepaalde ideeën en principes gekomen welke van groot belang zijn geweest binnen het veld van de computerarchitectuur. Dit zijn veelal principes die bij het bestuderen van de theorie geregeld --- het zij direct, het zij indirect --- langs zullen komen. Hiervan zijn de volgende acht op dit moment het meest relevant.

\subsubsection*{De Wet van Moore}
Deze `wet', ooit geformuleerd door Gordon Moore, stelt dat iedere 18--24 maanden het aantal transistoren per IC (Integrated Circuit) verdubbelt.

\subsubsection*{Het Gebruik van Abstractie}
Wanneer men praat over bepaalde onderdelen van een computer zijn niet alle details even relevant. Hierom wordt in deze context vaak abstractie toegepast.

\subsubsection*{De Versnelling van het Veel Voorkomende}
Hoewel dit misschien voor de hand ligt is het ook bij computerontwerp van belang dat, wanneer een proces uit verschillende delen bestaat, het meeste rendement behaald kan worden op het gebied van prestaties wanneer de delen die met grotere frequentie voorkomen efficiënter worden gemaakt. 

\subsubsection*{Parallelle Processen}
In sommige gevallen kunnen processen die parallel draaien gebruikt worden om prestaties te verbeteren

\subsubsection*{Pijplijnen}
Bij pijplijnen gaat het om een bijzondere vorm van parallelle processen. Wordt een proces zo geoptimaliseerd dat diens individuele onderdelen samen betere prestaties behalen dan wanneer ieder onderdeel op eigen houtje bezig is.

\subsubsection*{Voorspellen}
Voor sommige processen is het, met het oog op prestaties, voordeliger bepaalde aannames te doen wanneer men weet dat deze dermate accuraat is en mits een mogelijke fout niet te zwaar zal wegen.

\subsubsection*{De Geheugenhiërarchie}
Voor iedere computer is het van belang dat deze beschikt over mogelijkheid het een en ander op te slaan. Verschillende soorten opslag kunnen echter enorm uiteen lopen op het gebied van snelheid, capaciteit, maar ook kosten. Het is daarom dat binnen hardware een bepaalde hiërarchie bestaat met aan de bovenkant het snelste, maar tevens ook kleinste en duurste geheugen en onderaan de opslag met de grootste capaciteit en laagste kosten, maar ook de laagste snelheid. 

\subsubsection*{Betrouwbaarheid d.m.v. Redundantie}
Wanneer het van belang is dat een bepaald systeem betrouwbaar is en dus onder vrijwel iedere omstandigheid blijft functioneren kunnen, an bepaalde onderdelen binnen het systeem, meerdere exemplaren worden geïnstalleerd om zo te garanderen dat het systeem bij een mogelijk defect naar behoren blijft werken.

\subsectionauthor[R.A.J. Wacanno]{Onderliggende Software}
Om een programma succesvol op hardware te kunnen laten draaien is bepaalde software essentieel. Deze software vormt een tussenlaag tussen het programma en de hardware en maakt het op deze manier mogelijk dat deze twee correct met elkaar kunnen communiceren. Belangrijke voorbeelden van deze software zijn het besturingssysteem, de compiler en de assembler.

\subsubsection*{Het Besturingssysteem}
Het besturingssysteem is onder andere verantwoordelijk voor: het omgaan met in- en uitvoer; het verdelen van opslag en geheugen onder de verschillende processen en mogelijk maken dat meerderen programma's tegelijkertijd en op gecontroleerde op een systeem draaien.

\subsubsection*{De Compiler}
De compiler is onderdeel van een keten die high-level programmatuur omzet om uiteindelijk door de hardware gebruikt te kunnen worden. Om precies te zijn zet de compiler talen (als bijvoorbeeld C en Java) om in zogenaamde assembleertalen.

\subsubsection*{De Assembler}
De assembler maakt de door de compiler gestarte keten af door de reeds genoemde assembleertalen om te zetten in een reeks bits (nullen en enen). Deze bits kunnen vervolgens voor de hardware worden ingelezen en verwerkt.


\subsectionauthor[R.A.J. Wacanno]{Onderliggende Hardware}
Om het mogelijk te maken de uitvoer hiervoor genoemde software mogelijk te maken zijn bepaalde hardwarecomponenten binnen een systeem vereist. 

\subsubsection*{In- en Uitvoer}
Onder invoer verstaat men hetgeen gegevens in het geheugen schrijft en onder uitvoer hetgeen gegevens uit het geheugen leest.

\subsubsection*{De Processor}
De processor wordt vaak gezien als het hart van een computer; het stelt de computer in staat gegevens van buiten te verwerken om zo nieuwe gegevens aan de gebruiker te presenteren. Deze gegevens haalt de processor uit het geheugen met behulp van \textbf{datapaden}. Deze datapaden stellen de processor tevens in staat gegevens 

\noindent Binnen de processor zit ook een \textbf{aansturingseenheid}. Deze stuurt de het datapad, het geheugen en de in- en uitvoer aan op basis van programma-instructies.

\subsubsection*{Geheugen}
Het geheugen onder het snellere deel van de geheugenhiërarchie en staat dichter bij de processor om deze zo van de voor het programma vereiste data te voorzien. Het geheugen kan nog weer worden opgedeeld in het \textbf{cache-} en het \textbf{werkgeheugen}. Het werkgeheugen bevat de data van het draaiende programma en het cachegeheugen fungeert als een buffer tussen de processor en het werkgeheugen. 

\subsubsection*{Opslag}
Opslag beslaat het onderste en dus langzaamste maar ook goedkoopste deel van de geheugenhiërarchie. Bij opslag kan men denken aan harde schijven maar ook het zogenaamde flash geheugen dat in usb-sticks en SSD's zit. Opslag is ideaal voor langetermijnsopslag en voor het bewaren van data die sporadisch door een programma wordt opgevraagd. 

\subsubsection*{Instructieset Architectuur}
De instructieset architectuur bepaald welke instructies een stuk assembleertaal kan bevatten wanneer het op een bepaalde processor draait. 

\subsectionauthor[R.A.J. Wacanno]{Streven naar Prestaties}
Bij het bouwen van computersystemen wordt altijd getracht om zo goed mogelijke prestaties te realiseren. Om dit te kunnen doen moet men in staat zijn om in te zien wat nou eigenlijk goede prestaties zijn; hoe prestaties gemeten kunnen worden en hoe prestaties daadwerkelijk kunnen worden verbeterd.

\subsubsection*{Prestaties Vaststellen}
Bij een computer zijn er twee parameters die als graadmeter voor diens prestaties kunnen dienen met elk zijn eigen toepassing.

\noindent \textbf{Uitvoeringstijd} is vooral voor de individuele computergebruiker van belang en kan gedefinieerd worden als de hoeveelheid tijd die het kost on een programma in zijn volledigheid te laten draaien. Twee systemen kunnen op deze manier vergeleken worden als men stelt dat:

\[Prestaties_X = \frac{1}{Uitvoeringstijd_X}\]

Dan volgt het volgende:

\[Prestaties_X > Prestaties_Y\]
\[\frac{1}{Uitvoeringstijd_X} > \frac{1}{Uitvoeringstijd_Y}\]
\[Uitvoeringstijd_Y > Uitvoeringstijd_X\]

\noindent \textbf{Bandbreedte} is voor datacentrum administratoren van belang en heeft als betekenis de hoeveelheid die per tijdseenheid verwerkt kan worden. 

\subsubsection*{Prestaties Meten}
Voor het meten van prestaties kan de uitvoeringstijd van de processor worden gemeten; ofwel de tijd die de processor er over doet een bepaalde taak uit te voeren. Deze kan zowel in seconden als cycli van de processor worden uitgedrukt. 

\subsubsection*{Prestaties van de Processor}
De prestaties van een processor kunnen door een tal van factoren worden beïnvloed. Een simpele formule die dit weergeeft is de volgende:
\[Uitvoeringstijd = Processorcycli \cdot Tijd/cyclus\]

Omdat de tijd per cyclus de inverse van de klokfrequentie is kan men ook stellen dat:

\[Uitvoeringstijd = \frac{Processorcycli}{Klokfrequentie}\]

\subsubsection*{Prestaties m.b.t. Instructies}
De prestaties hangen ook nauw samen met de aard van de instructies. Zo is het volgende waar:

\[Klokcycli = Instructies \cdot cycli/instructie\]

De term CPI (Cycles Per Instruction) wordt gedefinieerd als de gemiddelde hoeveelheid cycli die nodig is voor het uitvoeren van een instructie. Met de CPI kan ook de volgende vergelijking worden opgesteld:

\[Uitvoeringstijd = \frac{Instructies \cdot CPI}{Klokfrequentie}\]

Uiteindelijk kan met dit alles een algehele vergelijking worden opgesteld die er als volgt uit ziet:

\[Tijd = Seconden/Programma = \frac{Instructies}{Programma} \cdot \frac{Klokcycli}{Instructie} \cdot \frac{Seconden}{Klokcyclus}\]

\subsubsection*{De Onontkoombare Stroombarrière}
Met het najagen van steeds betere prestaties is men gestuit op onontkoombare eigenschappen van elektriciteit en energie in het algemeen. Wanneer men de klokfrequentie van een processor tracht te verhogen zal deze ook steeds meet stroom verbruiken. Dit heeft tot gevolg dat de processor tijdens gebruik steeds warmer zal worden waardoor beter koeling vereist is. Teven dient, vooral in het geval van bijvoorbeeld draagbare apparaten de toevoer van stroom afdoende te zijn om dergelijke processoren te laten functioneren op hun gewenste snelheid. 

\subsubsection*{De Vermeerdering van Processorkernen}
In de meer recente geschiedenis heeft men voor het verbeteren van de prestaties van een systeem zijn heil gezocht in het gebruiken van meerdere processorkernen binnen een processor. Deze ontwikkeling stamt uit het paralleliseren van processen, daar meerdere processorkernen het mogelijk maken meer gegevens tegelijkertijd te verwerken.

\subsectionauthor[R.A.J. Wacanno]{Problematiek op het Gebied van Prestatieverbetering}


\subsubsection*{De Wet van Amdahl}
Zie \small{\textbf{De Versnelling van het Veel Voorkomende}} in combinatie met de onderstaande vergelijking.
\[Uitvoeringstijd_{na} = \frac{Uitvoeringstijd_{be\ddot invloed}}{Verbeteringshoeveelheid} + Uitvoeringstijd_{onbe\ddot invloed}\]
