Allgemeiner Hinweis:

Im Verzeichnis /home/pdv/info4/info4/ gibt es 9 Ordner aufgabe[1a,1c,2,3,4a,4b,5,6,7], in denen je nach Aufgabe Vorgaben und Dokumentationen enthalten sind. Es ist immer ratsam, zunächst alle Dateien, die zur Verfügung gestellt werden, genau anzuschauen. Auch das Lesen der Dokumentation hat immer wieder geholfen, die Aufgaben noch leichter bearbeiten zu können.






Aufgabe 1

Aufgabe 2

Aufgabe 3

Aufgabe 4

Aufgabe 5

Aufgabe 6

Aufgabe 7



Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann

Aufgabe 1: Assembler


1a: LED-Anzeige

Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Die Computer im Terminalraum sind mit zwei LED-Anzeigen ausgestattet, die direkt nebeneinander an der Vorderseite des kleinen silbernen Kastens neben dem Computer zu finden sind. Jede LED-Anzeige besteht aus 8 Segmenten (inklusive dem Punkt) und wird über je einen 8 bit breiten parallelen Port angesprochen. Die beiden Parallelports haben die Namen cTTLPort1 (für die linke LED-Anzeige) und cTTLPort2 (für die rechte LED-Anzeige) und sind an einer bestimmten Adresse im Hauptspeicher eingeblendet (siehe Datei LED.h).

Beim Schreiben eines Bytes an die Adresse eines Parallelports im Hauptspeicher, wird der Wert automatisch über den Parallelport zur zugehörigen LED-Anzeige geschickt. Dabei ist jedes der 8 Segmente der LED-Anzeige genau einem Bit zugeordnet, sodass alle Segmente gelöscht werden, wenn man 0x00 überträgt und alle Segmente eingeschaltet werden, wenn man 0xFF überträgt. Die genaue Zuordnung der Bits zu den einzelnen Segmenten ist ebenfalls in der Header-Datei LED.h beschrieben.

Ihr sollt eine kleine Assemblerfunktion schreiben, die alle Segmente beider LED-Anzeigen hintereinander ein- und wieder ausschaltet, sodass eine visuell schöne Figur entsteht (z.B. eine laufende 8). Dabei sollen möglichst viele Segmente benutzt werden und zwischen dem Einschalten eines Segments und dem Einschalten eines anderen Segments soll eine kleine Pause gemacht werden, damit die dargestellten Figuren gut zu erkennen sind. Die Pause kann z.B. durch aktives Warten mit einer Zählschleife programmiert werden.

Eure Assemblerfunktion hat die Syntax:

void AnimiereLED( );

und ist rudimentär in der Datei LED.s vorgegeben.

Alle Dateien, die Ihr benötigt, findet Ihr unter /home/pdv/info4/info4/aufgabe1a. Kopieren müsst Ihr Euch nur LED.S (zum Ergänzen) und die Datei Makefile, die den Übersetzungsvorgang steuert (siehe auch die Dokumentation zur "Assembler-Entwicklungsumgebung").



1b: Berechnung (theoretisch)

Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Die Lösung dieser Aufgabe ist spätestens zu Beginn der Tutorien in der 5. Vorlesungswoche bei der Tutorin / dem Tutor abzugeben.

Die Collatz-Funktion sei wie folgt definiert:




In der Collatz-Folge wird die Collatz-Funktion so lange auf einen gegebenen Eingabewert angewandt, bis das Ergebnis 1 herauskommt.

Beispiel:




Die Länge dieser Collatz-Folge ist 8.

Schreiben Sie ein Programm in MC68000-Assembler, das zu einer Zahl die Länge ihrer Collatz-Folge berechnet. Das Programm wird wie folgt aufgerufen:

int collatz(int *n)

Achtung: Programme ohne aussagekräftige Kommentare werden nicht gewertet!

Zeichnen Sie den Kellerspeicher auf, wie er nach Aufruf des Unterprogramms und nach Rettung der Register aussieht. Zeichnen Sie ferner ein, wo der Kellerzeiger (stack pointer) dann steht.



1c: Berechnung (praktisch)

Hinweis: Diese Aufgabe ist freiwillig, sollte aber zur Übung im Hinblick auf die Klausur programmiert werden.

Programme in Assembler sind heutzutage sehr selten und auch nur in wenigen Ausnahmesituationen sinnvoll. Eine Anwendung könnte eine rechenintensive Berechnung sein, die ohne die üblichen Sicherheitsabfragen, die eventuell der Compiler hinzufügt, schneller laufen könnte. Allerdings fehlen diese Sicherheitsabfragen auch bei der Entwicklung von neuen Programmen.

Ihr sollt eine Funktion implementieren, die die folgende Summe berechnet:




Von C aus soll die Funktion als

void Calculate(unsigned short n, unsigned int *AdresseDesErgebnisses)

aufgerufen werden.

In eurer Funktion müßt ihr zuerst die Aufrufparameter vom Stack lesen, dann die Berechnung durchführen und zum Schluß das Ergebnis an der übergebenen Speicherstelle ablegen.

Bitte beachtet, daß der verwendete Prozessor MC68000 bei der Multiplikation nur zwei Wort-Werte miteinander verrechnen soll (und kann) und als Ergebnis einen Long-Wert liefert.

Zusatzaufgabe: Überlegt euch, wie groß n maximal sein darf, damit die Berechnung ohne Fehler abläuft.

Alle Dateien, die Ihr benötigt, findet Ihr unter /home/pdv/info4/info4/aufgabe1c. Kopieren müsst Ihr Euch nur Aufgabe1.S (zum Ergänzen) und die Datei Makefile, die den Übersetzungsvorgang steuert (siehe auch die Dokumentation zur "Assembler-Entwicklungsumgebung").





Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann

Aufgabe 2: Prozeßabzweigungen


Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Aufgabenstellung

Der folgende Präzedenzgraph soll in ein Programm mit nebenläufigen Prozessen umgewandelt werden.





Hinweise:





Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann


Aufgabe 3: Semaphoren


1a: Flughafen (praktisch)

Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

An einem neuen Flughafen soll der Zugang der Passagiere zur Zugangsbrücke eines Flugzeugs mit Semaphoren geregelt werden. Es gibt Passagiere, die Erste Klasse fliegen, normale Passagiere und Personen, die Hilfe beim Zugang zum Flugzeug benötigen, z. B. Rollstuhlfahrer oder Kinder. Wir nennen die Personen ab sofort ErsteKlasse, Normalos und Hilfsbedürftige.

Die ErsteKlasse und Normalos bewegen sich frei im Flughafen, die Hilfsbedürftigen werden in einem Nebenraum betreut. Sobald die Fahrgäste zum Einsteigen aufgefordert werden, muß das Progamm sicherstellen, daß folgende Regeln eingehalten werden:

Implementiert diese Regelung mit den gegebenen Vorgaben. Dabei sollen ErsteKlasse, Normalos und Hilfsbedürftige als nebenläufige Prozesse (Java Threads) realisiert und mit Hilfe von Semaphoren synchronisiert werden.

Hinweise:



3b: Bushaltestelle (theoretisch)

Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Passagiere kommen an eine Bushaltestelle. Sobald der Bus ankommt, steigen alle wartenden Passagiere in den Bus, allerdings dürfen während des Einsteigens keine weiteren Passagiere hinzukommen. Das heißt, Passagiere die während des Einsteigens an die Bushaltestelle kommen, müssen auf den nächsten Bus warten.

Der Bus kommt immer leer an die Haltestelle und hat 50 Sitzplätze. Falls mehr Passagiere warten als Sitzplätze vorhanden sind, müssen einige Passagiere auf den nächsten Bus warten.

Sobald alle Passagiere den Bus bestiegen haben, soll der Bus abfahren. Falls keine Passagiere an der Haltestelle warten, soll der Bus unverzüglich abfahren.

Der Ablauf soll durch ein nebenläufiges Programm in der aus der Vorlesung bekannten Notation beschrieben werden. Die Synchronisation soll über Semaphore erfolgen. Es soll zwei Prozeßtypen für Passagiere und Busse geben:

type Passagier = process

type Bus = process

Schreiben Sie ein Programm mit obigen Prozessen und Regeln.

Achtung: Programme ohne aussagekräftige Kommentare werden nicht gewertet!

-- Globale Deklarationen:




type Bus = process

-- Euer Programm



End process;

type Passagiere = process

-- Euer Programm



End process;







Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann


Aufgabe 4: Monitore


4a: Klausureinsicht

Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Bei der Einsichtnahme in die Informatik-B Klausur im FR2051 dürfen maximal 5 Studenten gleichzeitig ihre Klausur einsehen. Zwischendurch soll dieser Raum gereinigt werden. Das Reinigungspersonal darf den Raum aber erst dann betreten, wenn keine Studierenden mehr im Raum sind. Umgekehrt gilt, daß der Raum während der Reinigungsarbeit nicht benutzt werden darf. Das Reinigungspersonal soll bevorrechtigt sein.

Lösen Sie das folgende Synchronisationsproblem mit Hilfe eines Monitors in Java. Hierbei ist die Java-Anweisung synchronized zu verwenden!

Der Monitor soll die folgenden Prozeduren zur Verfügung stellen:

Hinweise:



4b: Elfmeterschießen

Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Im Endspiel der Fußballweltmeisterschaft steht es sowohl nach Ende der regulären Spielzeit, als auch nach der Verlängerung unentschieden. Es kommt zum Elfmeterschießen.

Implementieren Sie das Elfmeterschießen in Java mit Monitoren unter Berücksichtigung folgender Vorgaben:

Vervollständigen Sie die run-Methoden der Klasse Spieler und der Klasse Torwart. Eine Synchronisation kann über das Objekt dran erfolgen.

Lösen Sie das Synchronisationsproblem mit Hilfe eines Monitors in Java. Hierbei ist die Java-Anweisung synchronized zu verwenden!

Hinweise:





Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann


Aufgabe 5: Nachrichten


Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Aufgabenstellung

Ein produzierender und ein konsumierender Prozeß sollen über ein Netzwerk kommunizieren. Dazu sollen Java-Sockets verwendet werden.
Der produzierende Prozeß (Auftraggeber) liest eine Zeile von der Standardeingabe (Tastatur) ein und sendet diese über eine Socketschnittstelle zu einem konsumierenden Prozeß (Auftragnehmer). Dieser nimmt die Zeile entgegen und wandelt die einzelnen Zeichen in Großbuchstaben um. Anschließend wartet der Auftragnehmer 10 Sekunden und schickt die umgewandelte Zeile wieder zurück zum Auftraggeber, wo die empfangenen Zeichen dann am Bildschirm ausgegeben werden sollen.

Folgende Anforderungen sollen dabei erfüllt werden:

  1. Der Auftragnehmer soll Anfragen von mehreren Auftraggebern nebenläufig bearbeiten können. Dazu soll für jede Socket-Verbindung ein neuer Prozess (Java Thread) gestartet werden.

  2. Ein Auftraggeber darf eine Zeile erst dann zum Auftragnehmer schicken, wenn diese vollständig eingegeben ist. Anschließend soll auf die Antwort vom Auftragnehmer gewartet und dann die empfangene Zeile ausgegeben werden. Erst im Anschluß daran soll der Auftraggeber wieder auf die Eingabe einer Zeile warten.

  3. Durch Eingabe von "Ende" soll sich der Auftraggeber beim Auftragnehmer abmelden. Dazu muß diesem eine entsprechende Nachricht geschickt werden. Der Auftragnehmer soll terminieren, wenn er von allen Auftraggebern die "Ende"-Nachricht erhalten hat.

Es sollen die Programme für den Auftraggeber und den Auftragnehmer geschrieben werden.

Hinweise:





Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann


Aufgabe 6: RMI


Hinweis: Diese Aufgabe muß zur Erlangung eines Scheins bearbeitet werden.

Aufgabenstellung

Es soll ein Schiffe-Versenken-Spiel für den Netzwerkbetrieb implementiert werden. Die beiden Kontrahenten verwenden je ein eigenes Java-Programm. Die Kommunikation zwischen den beiden Programmen erfolgt mittels RMI (Remote Method Invocation).

Jeder Kontrahent implementiert das GameInterface mit folgenden beiden entfernt aufrufbaren Methoden:

int shoot(int row, int column) throws RemoteException;

void begin() throws RemoteException;

Ein Kontrahent ruft shoot() auf, um einen Schuß auf dem gegnerischen Spielfeld zu plazieren. Die Rückgabewerte sind:

Damit ein Schiffe-Versenken-Programm die Verbindung zu einem Kontrahenten herstellen kann, läuft auf dem Rechner pepita ein Server-Programm, die Schiffe-Versenken-Registry. Diese implementiert das DistributionInterface mit

GameInterface getOpponent(GameInterface game);

als einziger Methode. Der Parameter ist eine Referenz auf das GameInterface des aufrufenden Kontrahenten, der Rückgabewert eine Referenz auf das entfernte GameInterface des zugeordneten Gegners. Jeder Kontrahent ruft die getOpponent()-Methode auf. Diese kehrt erst dann zurück, wenn ein Gegner zugewiesen wurde. Nachdem beide Aufrufe zurückgekehrt sind, wird von der Schiffe-Versenken-Registry bei dem Kontrahenten, der den ersten Zug machen soll, die parameterlose Methode begin() aufgerufen.

Um das DistributionInterface der Schiffe-Versenken-Registry zu erhalten, bedienen sich die Kontrahenten der Standard-RMI-Registry auf pepita. Der Name dieser Registry muß beim lookup()-Aufruf folgendermaßen angegeben werden: "//pepita.cs.tu-berlin.de/SV-Registry".

Die folgende Abbildung illustriert die Verteilung der Komponenten und die erforderlichen Methodenaufrufe:



Spielregeln:



Eure Aufgabe:

Hinweis: Die Dokumentation zur Testumgebung findet ihr hier!





Informatik 4


TU Berlin
Institut für Technische Informatik und Mikroelektronik
Fachgebiet PDV und Robotik
Prof. Dr.-Ing. habil. Armin Zimmermann

Aufgabe 7: Speicherverwaltung


Hinweis: Diese Aufgabe ist freiwillig, sollte aber zur Übung im Hinblick auf die Klausur programmiert werden.

Aufgabenstellung

Für ein seitenverwaltetes System sollen die Ersetzungsstrategien FIFO, SC (Second Chance) und LRU implementiert werden.

Eine Testumgebung existiert hierfür bereits in der Hauptklasse Main in der auch eine Benutzungsschnittstelle enthalten ist. Von dieser Klasse aus werden die zu implementierenden Ersetzungsstrategien in den Klassen FIFO, SC und LRU als auch zum Vergleich die korrekten Lösungen aus den Klassen Muster_xxx aufgerufen. Außerdem stehen einige Konstanten (public final static) zur Verfügung, die von allen Klassen benutzt werden können. Diese Konstanten dürfen NICHT geändert werden und definieren einerseits die Anzahl der zufälligen Anforderungen (MAXREQUESTS) und die Anzahl der Kacheln, die verfügbar sind (MAXKACHELN). Alle Klassen, in denen die Ersetzungsstrategien implementiert sind, erben von der Klasse Strategie, in der die abstrakten Methoden getName() und requestPage() und die Rückgabewerte von requestPage() als Konstanten deklariert sind. Die Methode requestPage() wird bei jeder Seitenanforderung aufgerufen und muß demzufolge in den Dateien FIFO.java, SC.java und LRU.java geändert werden. Es können zusätzliche Methoden und Variablen in die Klassen FIFO, SC und LRU eingefügt werden. Außerdem kann es sinnvoll sein, einen Konstruktor für diese Klassen zu definieren, der bestimmte globale Variablen und Strukturen initialisiert. Andere vorgegebene Klassendateien werden NICHT angefaßt!

Beim ersten Aufruf Eurer Prozeduren seien alle Kacheln unbelegt (Inhalt = EMPTY). Um einen Vergleich mit der Musterlösung zu ermöglichen, soll bei mehreren möglichen Kacheln für eine Ersetzung die Kachel mit der kleinsten Kachelnummer gewählt werden. Bei einer Seitenanforderung wird die Methode requestPage() mit folgenden Parametern aufgerufen. Zum einen mit der angeforderten Seite und mit der aktuellen Belegung der Kacheln. In die aktuelle Belegung soll, sofern noch nicht vorhanden, die angeforderte Seite eingetragen werden. Als Rückgabewert soll PAGE_FAULT geliefert werden, falls ein Seitenfehler auftrat und ALREADY_LOADED, falls dies nicht der Fall war.

Hinweise:




Und das war es auch schon. Mehr Aufgaben gibt es nicht!


Letzte Änderung: 21.03.2007

Counter

Impressum