Von Neumann machine (theoretisch computer model) Als we even terug kijken naar de eerste computers, dan hadden die vaste programma’s. Deze waren moeilijk aan te passen. Wilde men die aanpassen, dan kwam dat er op neer dat de computer zelf moest worden aangepast (als dat al mogelijk was voor wat gewenst was). Stel je maar eens voor dat je ineens een spelletje pac-man zou willen spelen op je gewone zakrekenmachine. In een volgende generatie computers (EDVAC, ENIAC en later) ging men werken met computers met een opgeslagen programma. Een theoretisch model hiervoor is het Von Neumann architectuur model. In dit model is de scheiding tussen opslag en de processing unit eigenlijk impliciet. Door het maken van een instructieset architectuur en het voorstellen van een berekening als een serie instructies (een programma), werden deze computers een pak flexibeler. Door: Steven Ophalvens Dit soort computers noemt men daarom ook wel eens computers met een instructieset architectuur. Een instructieset is het deel van de computer architectuur dat verbonden is aan programmeren. Dit houdt ook het volgende in: Registers Datatypen eigen aan de computer Instructies Addresseer modes Geheugen architectuur Interrupt en exception behandeling (wat moet er gebeuren met een fout/uitzondering?) o "0xff" of “0x00” external I/O Een veelgebruikte instructieset is de x86 instructieset. Dit is de instructieset die je in de meeste PC’s zal terugvinden, maar is zeker niet de enige instructieset: Alpha AXP (DEC Alpha) ARM (Acorn RISC Machine) (Advanced RISC Machine now ARM Ltd) IA-64 (Itanium) MIPS Motorola 68k PA-RISC (HP Precision Architecture) IBM 700/7000 series IBM POWER PowerPC SPARC SuperH System/360 Tricore (Infineon) Transputer (STMicroelectronics) UNIVAC 1100/2200 series VAX (Digital Equipment Corporation) x86 (IA-32, Pentium, Athlon) (AMD64, EM64T) EISC (AE32K) Deze list trouwens niet volledig! Oude architectuur kan verlaten worden en nieuwe worden vrij regelmatig uitgevonden. Door: Steven Ophalvens Wel moet een onderscheid gemaakt worden tussen de microarchitectuur en de instructieset architectuur. De microarchitectuur is de set van processor design technieken die gebruikt wordt om de instructieset architectuur de implementeren. Computers met een radicaal verschillende microarchitectuur kunnen toch dezelfde instructieset architectuur delen. De Intel Pentium en de AMD Athlon implementeerden beide bijna identiek dezelfde versie van de x86 instructieset, maar gebruikten daarvoor wel heel verschillende interne ontwerpen voor. Terug over de Von Neumann architectuur: de mogelijkheid om instructies als data te behandelen, maakte programma’s als assemblers, compilers en andere geautomatiseerde programmeer tools mogelijk. Het is mogelijk om “programma’s te schrijven met andere programma’s”. Bij die eerste computers moest je eerst je computer aanpassen. Er zijn wel een aantal nadelen aan het Von Neumann ontwerp : dat programma’s andere programma’s kunnen schrijven of wijzigen, houdt ook in dat die wijzigingen heel schadelijk kunnen zijn. Een programma dat (al dan niet onbedoeld) zichzelf, andere programma’s of zelfs het operating systeem aanpast, kan mogelijk leiden tot een crash. Een buffer overflow is daar een voorbeeld van. Geheugen beveiliging en andere vormen van toegangscontrole kunnen helpen om te beschermen tegen zowel opzettelijke als onbedoelde aanpassing van programma code. Zo zul je bvb in Windows 2000 een pak minder een crash meemaken waardoor heel je systeem vastloopt dan met Windows ME, waar een dergelijke bescherming nog niet voldoende was geïmplementeerd. Door: Steven Ophalvens De Von Neumann flessenhals (bottleneck) De scheiding tussen de CPU en het geheugen is wat ook wel is gekend als de von Neumann bottleneck. Het debiet (data transfer rate) waarmee gegevens tussen de processor en het geheugen wordt verplaatst is vrij klein in vergelijking met de hoeveelheid geheugen. In moderne machines is dat debiet ook heel klein in vergelijking met de snelheid van de processor. In sommige omstandigheden (waar de processor grote hoeveelheden gegevens minimaal moet verwerken), kan dit een grote belemmering zijn van de algemene effectiviteit van de verwerking: de CPU moet dan eigenlijk continue wachten op vitale data die uit het geheugen moet worden overgezet. Om dit probleem wat op te lossen of te verlichten, wordt er een soort cache geïmplementeerd. Deze cache is een kopie van een verzameling van data die elders is opgeslagen, of eerder is berekend door de processor. Dit cache geheugen is veel sneller en staat ook veel dichter bij de processor. Eens data in het cache geheugen zit, dan kan die data gebruikt worden in plaats van data uit het geheugen te halen of zelfs te gaan herbereken. Hierdoor ligt de gemiddelde toegangstijd een stuk lager. Het cache geheugen is wel een tijdelijk geheugen. Het is ook een veel kleiner geheugen dan het veel grotere voornaamste geheugen (RAM). Trouwens, het principe van een cache komen we ook nog op andere plaatsen tegen: ook de harde schijf en bijvoorbeeld je webbrowser maken gebruik van een cache. In het geval van de harde schijf noemen we dit een disk buffer, disk cache of cache buffer. Een ander voorbeeld van een mechanisme om de von Neumann bottleneck aan te pakken, is het gebruik maken van “branch prediction” algoritmen. In computer architectuur is een branch Door: Steven Ophalvens predictor (een ‘tak voorspeller’) een onderdeel van de processor die beslist of een bepaalde conditionele tak in een instructie stroom mogelijk gekozen zal worden of niet. Dit noemen we “branch prediction”. In huidige moderne computers hebben die branch predictors een cruciale rol om hoge performantie te halen. Ze staan processors toe om instructies te halen en uit te voeren, nog voor een bepaalde tak/branch is uitgevoerd. Bijna alle pipelined processors hebben nu branch prediction, omdat ze moeten raden wat het adres is van de volgende instructie die ze moeten halen, nog voor de huidige instructie verwerkt is. Het moderne functionele programmeren en het objectgeoriënteerde programmeren zijn gelukkig wel een pak minder georiënteerd op het heen-en-weer duwen van massieve aantallen getallen of woorden dan vroegere talen zoals Fortran. Maar intern is dat nog altijd waar computers zich het meeste met bezig houden. Door: Steven Ophalvens