Der Prozessor

Der Prozessor
Definition Mit Prozessor beschreibt man in der Informatik die Rechen- und Steuereinheit eines Computers, das Bauteil, das die Anweisungen versteht und ausführt. Großrechner und die ersten Minicomputer enthielten Schaltungsplatinen (angefüllt mit integrierten Schaltungen), die die Aufgaben der Zentraleinheit wahrnahmen. Ein – Chip – Zentraleinheiten ermöglichten erst die Entwicklung von Personalcomputern und Workstations. Die CPU (Central Processing Unit) ist in der Lage, Befehle aus dem Speicher zu holen, zu decodieren und auszuführen. Außerdem überträgt sie Informationen von und zu anderen Ressourcen über den Hauptdatenverkehrsweg des Computers, den Bus. Im folgenden sprechen wir über Digitale Prozessoren, also solche Prozessoren, die in der Lage sind, zu erkennen, ob ein Schalter oder ein “Gatter” geöffnet oder geschlossen ist. Ein Computer kann also nur zwei Zustände in seinen mikroskopisch kleinen Schaltungen erkennen: an oder aus, hohe oder niedrige Spannung oder bei Zahlen 0 oder 1. Die Geschwindigkeit, mit der ein Computer diesen einfachen Akt bewältigt, macht ihn jedoch zu einem Wunderwerk der modernen Technologie. Durch digitale Prozessoren finden also die im Unterricht behandelten Themen Anwendung.

Exkurs:

Geschichte Die erste Addiermaschine, ein Vorläufer des Digitalcomputers, wurde 1642 von Blaise Pascal erfunden. Es folgten in den weiteren drei Jahrhunderten einige teils nie gebaute Konstruktionen, die digitale Gesetze mechanisch umsetzten. In der ersten Hälfte des 19. Jahrhunderts entwickelte George Boole die nach ihm benannte Boolesche Algebra. Sie bildet praktisch die mathematische Grundlage für jede digitale Rechen- und Steuerschaltung und wurde ja bereits im Unterricht thematisiert. Der Bau von Analogcomputern begann am Anfang des 20. Jahrhunderts. Frühe Modelle verwendeten für Berechnungen rotierende Stifte und Getriebe. Numerische Näherungen von Gleichungen, die zu komplex für irgendeine andere Art der Berechnung waren, ließen sich mit diesen Maschinen auswerten. Der deutsche Ingenieur Konrad Zuse (1910-1995) baute 1936 die erste mit dem binären Zahlensystem arbeitende programmgesteuerte Rechenanlage (Z1). War der Z1 noch rein mechanisch, so enthielt sein Nachfolgemodell Z2 bereits elektromechanische Teile, der Z3 schließlich war 1941 der erste betriebsfähige programmgesteuerte, mit 2600 Relais ausgestattete Rechenautomat mit logischen Schaltungen (Und, Oder, Nicht). All die hier beschriebenen Rechner der ersten Generation benutzten als Speicherwerk (falls vorhanden) Lochkarten oder Papierstreifen. Unabhängig von Zuse entwickelte eine Gruppe von Wissenschaftlern und Mathematikern während des 2. Weltkrieges ein Gerät, das heute als erster elektronischer Digitalcomputer angesehen wird: Colossus. Dieser und ihm folgende Rechner hatten aber den Nachteil, dass das Programm fest im Prozessor verdrahtet war und per Hand geändert werden oder wie im Fall des 1946‘er ENIAC durch Lochkarten eingegeben werden mußte. Der erste Computer, der neben einem Datenspeicher auch mit einem Programmspeicher ausgestattet war, wurde nach den Konzepten des ungarisch – amerikanischen Mathematikers John von Neumann gebaut. Die Befehle wurden in einem Speicher abgelegt. Dadurch ließen sich die Geschwindigkeitseinschränkungen durch den Papierstreifenleser
während der Programmausführung beseitigen. Außerdem ermöglichte dieser Programmspeicher die Lösung verschiedener Probleme, ohne den Computer neu zu verdrahten. Das konnte er zum einen dadurch, dass der Rechner nun nicht mehr nur einfach Programmteile “abarbeitete”, sondern auch Teile bedingungsgebunden wiederholen oder überspringen konnte, zum anderen durch die Tatsache, das dem Rechner uneigene Fähigkeiten mit dem Programm “geliefert” werden konnten. So konnte als Beispiel ein Programm, das auf einem nur zur Addition fähigen Computer zum Einsatz kam, eine Multiplikationsroutine enthalten. Der Einsatz von Transistoren in Computern zum Ende der fünfziger Jahre ermöglichte den Bau von kleineren, schnelleren und vielseitiger verwendbaren Logikelementen, als es mit Elektronenröhrenrechnern erreichbar gewesen wäre. Weil Transistoren weniger Strom verbrauchen und eine längere Lebensdauer aufweisen, war allein diese Entwicklung verantwortlich für die verbesserten Rechner, die als Computer der zweiten Generation bezeichnet werden. 1958 erschien von Texas Instruments der integrierte Schaltkreis (IC: Integrated Circuit), eine wesentliche Verbesserung, die im Unterricht abgehandelt wurde. Aus ihnen werden moderne Mikroprozessoren konstruiert. Aus den sich nun neu auftuenden Möglichkeiten entstand schnell der Wunsch, die fortschrittlichen Schaltungen zu organisieren und zu standardisieren, wovon man sich Vorteile bei der Programmierbarkeit und Kostenkontrolle erhoffte. Die Verwirklichung dieses Konzeptes gelang als erstes der Firma Intel, die im November 1971 den ersten Mikroprozessor (4004) auf den Markt brachte. Dies war der Anfang einer für die damalige (und vielleicht auch heutige) Zeit unglaublichen Entwicklung, beschleunigt durch die 80×86 Familie, der im weitesten Sinne auch alle heute vom Marktführer Intel verbreiteten Rechner wie der Pentium angehören. Konkurrenten wie Apple oder IBM vermarkteten ihre Gegenmodelle. Obwohl IBM der eigentliche Urvater der PCs ist (IBM bot die ersten Computersysteme an), begann man doch bald damit, Prozessoren bei Intel einzukaufen, anstatt die teure und forschungsintensive Herstellung selbst zu übernehmen.

Aufbau

Zurück zu den “schalterlesenden” Fähigkeiten des modernen Computers: Computer der siebziger Jahre konnten im allgemeinen acht Schalter gleichzeitig überprüfen. Sie waren also in der Lage, acht Bits (= 1 Byte) in jedem Taktzyklus zu bearbeiten. Das führte dazu, dass sich diese Zahl “etablierte” und nachfolgende Rechnergenerationen meist Vielfache von 8 (16, 32, 64 etc.) Bit in einem Zyklus verarbeiten können. Jedes Byte kann eine der 256 möglichen Kombinationen von AN- und AUS – Einstellungen (oder Einsen und Nullen) enthalten. Jedes dieser Muster entspricht einer Anweisung, einem Teil einer Anweisung oder einem bestimmten Datenelement. Das kann z. B. eine Zahl, ein Zeichen oder ein graphischen Symbol sein. Das Muster 11010010 kann beispielsweise Binärdaten darstellen – in diesem Fall die Dezimalzahl 210. Hinter diesem Muster kann sich auch eine Handlungsanweisung für einen Vergleich von Daten verbergen, die in den Computerschaltungen gespeichert sind. Die Entwicklung von Prozessoren, die 16, 32 oder 64 Datenbits gleichzeitig verarbeiten können, erhöhte die Geschwindigkeit der Computer, da nun mehr verschiedene und kompliziertere Befehle in die Systemarchitektur integriert wurden. Sowohl die Anzahl der gleichzeitig verarbeitbaren Bits als auch der Umfang des Befehlssatzes (siehe unten) vergrößerten sich kontinuierlich mit der wachsenden Entwicklung der modernen Digitalcomputer, wie folgendes Schaubild verdeutlicht:
John von Neumann (siehe Geschichte) stellte als erster fest, welche Teile ein Prozessor beinhalten muß, um digitale Informationen verarbeiten zu können. Diese Aufstellung bezeichnet man als von Neumannsche Struktur: Diese Struktur findet auch heute noch Anwendung: Die meisten CPU – Chips und Mikroprozessoren setzen sich daher aus diesen vier funktionalen Teilen zusammen: Das Rechenwerk, eine arithmetisch – logischen Einheit (ALU) verhilft dem Chip zu seinen Rechenfähigkeiten und gestattet arithmetische und logische Operationen. Das Speicherwerk, bestehend aus sogenannten Registern, ist ein kurzzeitiger Speicherbereich, der Daten sowie Anweisungen vorhält und die Adressen im Speicher sowie Ergebnisse dieser Operationen (in Reihe) aufnimmt. Das Steuerwerk besitzt drei prinzipielle Aufgaben. Sie übernimmt die zeitliche Abstimmung und Regulierung des gesamten Computersystems, ihr Anweisungsdekodierer liest die Datenmuster der Register und setzt diese Muster in Aktionen wie beispielsweise Addieren oder Vergleichen um. Schließlich bestimmt die Unterbrechungseinheit (Interrupts) der Steuerung, in welcher Reihenfolge einzelne Arbeitsschritte die CPU in Anspruch nehmen und wieviel CPU – Zeit sie verbrauchen dürfen. Die letzte Komponente des CPU – Chips oder Mikroprozessors ist sein interner Bus. Dieses Netz von Kommunikationsleitungen verbindet die internen Elemente miteinander und führt außerdem zu externen Anschlüssen, die den Prozessor mit den übrigen Komponenten des Computers verbinden. Die drei Arten von CPU – Bussen sind: (1) ein Steuerbus aus zwei Leitungen, von denen eine Eingabesignale empfängt und die andere Steuersignale aus dem Inneren der CPU herausleitet, (2) der Adreßbus, eine unidirektionale Leitung vom Prozessor, die die Orte verwaltet, an denen sich Daten im Speicher befinden, und (3) der Datenbus, bidirektionale Übertragungsleitungen, die sowohl Daten aus dem Speicher lesen als auch neue Daten in den Speicher schreiben. Im folgenden wird das Ein- Ausgabewerk nicht weiter behandelt, dieses ist bei modernen Computern nämlich durch der Bus, zu dem ein gesondertes Referat folgt. Ebenfalls ausgeklammert wird zudem der schon anderweitig behandelte Taktgenerator. Interessant ist hingegen die Funktionsweise von Steuer-, Speicher- und Rechenwerk, der eigentlichen CPU.

Funktionsweise

Merkmale der Funktionsweise nach der von Neumannschen Struktur: Der Rechner ist in seiner Struktur unabhängig vom zu bearbeitenden Problem. Jedes Problem wird durch eine spezielle Bearbeitungsvorschrift, nämlich das Programm gelöst. Sowohl das Programm bzw. die Programme, als auch die Daten werden im Speicher abgelegt. Jede Information erhält eine Adresse, um die eindeutige Erreichbarkeit zu gewährleisten (Bezug auf Motherboard – Teil). Befehle eines Programms werden aus aufeinanderfolgenden Speicherplätzen geholt und abgearbeitet (mit Ausnahme von Sprung- und Verzweigungsbefehlen). Jeder Befehl besteht aus zwei Teilen, dem Operations- und dem Operandenteil. Der Operator bestimmt, was zu tun ist, z.B. welche Operation auszuführen ist, während der Operand Informationen darüber enthält, wo (Adresse) sich das zu Verarbeitende befindet. Für die nachfolgenden Ausführungen sei angemerkt, dass der Rechner in seiner Struktur zwar unabhängig vom zu bearbeitenden Problem sein soll, das Programm aber nicht unabhängig vom Rechner geschrieben werden kann. Die folgenden Angaben beziehen sich hauptsächlich auf 8 Bit – Rechner, die Prinzipien finden so jedoch auch bei anderen Rechnern Verwendung. Um den oben genannten Ansprüchen zu genügen, benötigt die CPU (1) eine Einheit, die Befehle interpretiert und ihre Abfolge bestimmt, nämlich das Steuerwerk und (2) eine Einheit, die Befehle ausführt, die ALU. Die ALU benötigt zur Ausführung der Befehle wiederum ein Speicherwerk für Adressen und Zwischenergebnisse (sogenannte Flagregister) sowie Zustände, d.h. der Rechner muß sich z.B. bei Rechnungen kurzzeitig Überträge und Vorzeichen merken können (in sogenannten Zustandsregistern). Unter dem Befehlssatz versteht man die vollständige Liste der erkennbaren Schaltmuster – also die Liste aller Operationen, die ein Computer beherrscht. Traditionelle Befehle sind: – Transferbefehle: Sie dienen dem Transfer von Daten zwischen Registern, zwischen Speichern und Registern und zur Eingabe von Konstanten und Adressen. – Arithmetische Befehle: Sie dienen zur Ausführung einfacher Rechenoperationen wie Addition und Subtraktion. – Logische Befehle: Sie veranlassen einfache logische Entscheidungen wie Und oder Oder. – Sprungbefehle: Diese Befehle werden zur Realisierung von Programmsprüngen verwendet und sind deshalb für bedingte Operationen, also Befehlsketten, die nicht unbedingt ausgeführt werden und Wiederholungen von Programmteilen wichtig. – Ein- und Ausgabebefehle: Diese Befehle werden für Kommunikation und Datenaustausch mit externen Komponenten (auch Peripherie) benötigt. Diesem traditionellen Befehlssatz können je nach Einsatzgebiet des zu entwerfenden Prozessors noch weitere Befehle hinzugefügt werden. Weitverbreitete mathematische Co – Prozessoren besitzen z.B. neben den arithmetischen Standardbefehlen noch Befehlssätze für Multiplikation, Division und Fließkomma – Operationen, was sonst nur durch Software erreicht werden kann. Neuere Entwicklungen gehen dahin, dass man den Befehlssatz im Multimediabereich erweitert (Stichwort MMX). Ein Befehl ist also streng genommen in einem Byte enthalten. Dieses erste Byte ist der Operationscode. Durch diesen Operator ist eindeutig festgelegt, was der Befehl zu leisten hat und wie viele der nachfolgenden Bytes dem OPCODE als Operanden folgen. Beispielsweise sagt ein Sprungbefehl: “Springe an die Adresse, die jetzt folgt.” Nur das nächste Byte ist also der Operand. Befehle werden normalerweise nacheinander ihrer Lage im Speicher gemäß abgearbeitet, ein Befehlszähler “merkt” sich, wie weit das Programm fortgeschritten ist. Ausnahmen stellen hier Sprungbefehle dar. Damit ein Befehl bearbeitet werden kann, muß er zuerst interpretiert werden. Diese Interpretation wird durch das Steuerwerk geleistet, das über einen Eingang in Wort – Länge verfügt, also in unserem Fall 8 Bit. Diese acht Eingange werden über den OPCODE mit acht Informationen gespeist. Deren Durchschaltung führt mittels des Befehlsregisters zu einer eindeutigen Interpretation von Befehl und Adressierung (siehe unten) Das Befehlsregister enthält zu allen möglichen Befehlen Ausgangswerte, welche dadurch umgesetzt werden, dass das Steuerwerk Steuertore (binäre Eingänge) öffnet oder schließt und so das Rechenwerk auf die “richtige Bahn lenkt”. Diesen Teilbereich des Steuerwerks bezeichnet man als Befehlentschlüssler. Wichtig wird in diesem Zusammenhang auch die Adressierung innerhalb des Befehls. Damit bezeichnet man die Art, wie die dem OPCODE folgenden Bytes zu interpretieren sind, ich möchte hier auf die verschiedenen Arten der Adressierung zu sprechen kommen: – Innere Adressierung: Befehle dieser Adressierungsart enthalten keinen Operandenteil und daher keine Adresse bzw. die Adresse ist im Operationsteil enthalten. Beispiele hierfür sind Befehle, die ein bestimmtes Register auf 0 setzen. – Unmittelbare Adressierung: Hier folgt der Operand in dem nächsten (oder in den nächsten) Byte (Bytes). Dabei hat der Operand die Bedeutung einer Zahl, die unmittelbar verknüpft oder transferiert werden soll. – Direkte Adressierung: Bei der direkten Adressierung folgt auf den Operationscode eine Adresse, unter der die zu verarbeitenden Informationen zu finden sind. Der Vorteil zur unmittelbaren Adressierung liegt darin begründet, das andere Inhalte ohne Änderung des Befehls abgearbeitet werden können. – Indirekte Adressierung: Auch hier wird eine Speicheradresse benutzt, diese liegt aber in einem Prozessor – internen Register, das mit dem Operator benannt wird. Vorteilhaft ist hier, dass leicht Bezüge zu verrichteten Teilaufgaben hergestellt werden können. – Indizierte Adressierung: Bei der indizierten Adressierung wird ein im Operanden angegebener Wert zu einer vorher im Indizierungsregister initialisierten Konstanten addiert, was die Speicheradresse ergibt. Wenn beispielsweise ein Programmteil mit in einem anderen Speichersegment abgelegten Daten wiederholt werden soll, so ändert man den Inhalt des Indizierungsregisters und wiederholt den Programmteil. – Relative Adressierung: Diese Adressierungsart findet nur bei Sprüngen und Verzweigungen Anwendung. Mit ihr kann man eine wählbare Anzahl von Schritten im Speicher vor oder zurück gehen. Da hier keine absoluten Adressen genannt werden, ist das Programm ortsunabhängig (relokativ). Anmerkung: Die hier aufgeführten Adressierungsarten sind theoretischer Natur. Nicht alle finden bei allen Prozessoren Anwendung oder sind zwingend erforderlich.

Beispiel

Für einen Computer, der mit dem Abarbeiten eines Programms beschäftigt ist, könnte folgende Rechnung zu bearbeiten sein: Addiere zu dem Wert aus Speicherbereich X den Inhalt des Speicherbereiches Y hinzu und speichere das Ergebnis im Speicherbereich Z. Für den Computer müssen nun je nach Befehlssatz unterschiedlich lange Befehlsfolgen formuliert werden: Verfügt der Computer über einen großen Befehlssatz, reicht vielleicht ein Befehl., bei einem stark eingeschränkten Befehlssatz muß vielleicht jede noch so kleine Operation einzeln angeführt werden. Bei mittlerem (und gängigem) Befehlssatz kommen wir mit folgenden drei Befehlen aus: Kopiere den Wert aus Speicherbereich X in das Hauptregister, den Akkumulator. Kopiere den Wert aus Speicherbereich Y in das Temporäre Register, den Hilfsakkumulator, verknüpfe diesen mittels der Addition mit dem Akkumulator und speichere das Ergebnis im Akkumulator. Kopiere den Wert aus dem Akkumulator in den Speicherbereich Z. Von den hier beschriebenen Operationen, die der Rechner abzuarbeiten hat, greifen wir den Befehl Nummer 2 exemplarisch heraus: Dieser Befehl liege unter den fiktiven Adressen L und M. L enthält den Operator, also den Befehl, der sagt: Die mir nachfolgende Adresse gehört noch zu mir, sie enthält den Speicherplatz eines Wertes, der zu Akku addiert werden soll. Die nachfolgende Adresse L enthält also die Adresse Y, unter der erst der zu addierende Wert liegt. Der Prozessor hat nun gerade den Befehl, der unter der Adresse K abgelegt war (Kopiere Y nach Akku) abgearbeitet, legt nun die Adresse L auf den Adreßbus und greift lesend auf den Programmspeicher zu. Damit wird das erste Befehlsbyte über den Daten – Adreßpuffer und den internen Datenbus in das Steuerwerk gebracht, wo der Prozessor erkennt, was der Befehl bewirken soll und das noch ein weiteres Byte erforderlich ist. Er gibt also die Adresse M auf den Adreßbus und liest aus dem Programmspeicher das zweite Befehlsbyte, den Operanden und transportiert diesen über den internen Datenbus ins temporäre Register. Damit verfügt die ALU über die erforderlichen Eingangsinformationen, so dass die Steuerlogik die Verknüpfung veranlassen kann. Anschließend wird das Ergebnis vom Ausgang der ALU über den internen Datenbus in den Akkumulator gebracht und der dort stehende erste Operand (Inhalt von Adresse X) überschrieben. Der Befehl ist abgearbeitet, der Prozessor fährt mit weiteren Befehlen fort (Kopiere Akku nach Adresse Z).

Ähnliche Referate

Hinterlasse eine Antwort