Sie sind auf Seite 1von 9

KMS - Ubung 1

Ubungsgruppe 7

Lukas Liebig 6414122

Julian Meschede 6618887

Alexander Rohlng 6550390

Abgabe: 04.05.2012

Aufgabe 1: Assembler
a) Der gegebene Quellcode beschreibt einen Sortieralgorithmus in C. Dieser benutzt einen Parameter n vom Typ int (Integer ) und einen Parameter ar vom Typ int* (IntegerPointer ). Der Parameter ar zeigt dabei auf eine Addresse, die die Startadresse eines Arrays darstellt. Von dieser an soll eine bestimmte Anzahl von Integer-Werten aufsteigend sortiert werden. Diese Anzahl ist duch n gegeben. Es ist dabei egal welche Werte in der angegeben Adresse im Speicher stehen, sie werden trotzdem als Integer-Werte interpretiert. Anfangs wird eine Variable i vom Typ int mit 1 initialisiert. Diese dient im nachfolgenden Programm als Index. Danach wird im Schleifenkopf geprft, ob i < n, also ob u der Index kleiner als die Gre des Arrays ist. Falls dies nicht der Fall ist, bricht der o Algorithmus ab. Bei jedem Durchlauf der Schleife wird geprft ob eine oder beide der folgenden Bedinu gungen vorliegt: i==0, das bedeutet der Index hat den Wert der Startposition des Arrays. ar[i-1]<=ar[i], das bedeutet der Wert an der Position i-1 ist kleiner gleich dem Wert an Position i. Liegt eine oder beide der Bedingungen vor wird der Index inkrementiert und ein neuer Schleifendurchlauf startet. Ist dies nicht der Fall werden die Werte des Arrays an den

KMS-Heimubung 1

UG 7

L. Liebig, J. Meschede, A. Rohlng

Positionen ar[i-1] und ar[i] ausgetauscht, dazu wird eine Hilsfvariable swap deniert. Der Index wird danach dekrementiert.

Der Algorithmus uberprft also zunchst ob schon der Anfang des Arrays erreicht u a ist und ob die im Array benachbarten Werte an den Positionen ar[i-1] und ar[i] schon richtig sortiert sind.Ist dies der Fall kann der Index erhht werden und mit dem o nchsten Wertepaar in der gleichen Weise verfahren werden. a Falls nicht wird durch Vertauschund der Wert an die richtige Stelle im Array sortiert. Dies wird so lange durchgefhrt bis der Algorithmus auch den letzten Wert (ar[n]) in u das Array einsortiert ist.

KMS-Heimubung 1 b) 1 SET 2 SET 3 SET 4 SET 5 SET 6 C P M 7 JZERO 8 A D D 9 JZERO 10 JZERO 11 SET 12 A D D 13 A D D 14 LOAD 15 SET 16 A D D 17 A D D 18 LOAD 19 C P M 20 JZERO 21 A D D 22 JZERO 23 STORE 24 STORE 25 A D D 26 J 27 A D D 28 J R0 R1 R2 R3 R4 R5 R5 R5 R5 R0 R5 R5 R5 R5 R7 R7 R7 R7 R9 R9 R9 R9 R8 R6 R0 6 R0 6 R1 1 1 1000 1 100 R0 29 R3 29 27 1 R0 R2 R6 0 R0 R2 R8 R6 27 R1 27 R5 R7 R3 R8 R4

UG 7

L. Liebig, J. Meschede, A. Rohlng

#Index i #Konstante 1 #Offset #Konstante 1 #n=100

#i f i=n goto 2 9( Ende )

#i f i >n got o 29 ( Ende ) #i f i =0 goto 27 ( i f T e i l )

#R5=i 1+Offset #R6=a r [ R5 ]

#R7=i+Offset #R8=a r [ R7 ]

#i f R6=R8 goto 2 7( i f T e i l )

#i f R6>R8 goto 27 ( i f T e i l ) #elseT e i l

#i f T e i l

29 #H i e r endet das Programm

KMS-Heimubung 1

UG 7

L. Liebig, J. Meschede, A. Rohlng

Aufgabe 2:
a), b), e) d), f) 1 / 2 3 4 5 6 kms ha1 aug2 . c / Created on : Apr 25 , 2012 Author : Lukas L i e b i g , J u l i a n Meschede , Alex R o h l f i n g

7 #include <s t d i o . h> 8 #include < s t d l i b . h> 9 #include <s i g n a l . h> 10 11 / 12 13 / c o u n t e r f o r number o f appearance o f s i g n a l s

14 unsigned cnt SGN =0; 15 16 / 17 18 / c o u n t e r f o r number o f c h i l d s

19 unsigned c h i l d =0; 20 21 / 22 23 / PID o f c h i l d p r o c e s s

24 int childPID =0; 25 26 / 27 28 / p r i n t s out counter f o r s i g n a l s

29 void s i g f u n c ( int s i g ){ 30 31 i f ( s i g == SIGUSR1){ p r i n t f ( \nnumber o f s i g n a l s : %d , cnt SGN ) ;

KMS-Heimubung 1

UG 7

L. Liebig, J. Meschede, A. Rohlng

32 33 34 35 } 36 37 / 38 39 /

return ; } cnt SGN++;

c r e a t e s c h i l d o f t h i s p r o c e s s i f no one e x i s t s

40 void s i g f o r k ( ) { 41 42 43 44 45 46 47 } 48 49 / 50 51 / I n i t i a l i z e s signalhandler } i f ( c h i l d <1){ c h i l d ++; childPID=f o r k ( ) ; i f ( childPID <1) p r i n t f ( \nPID : %d , g e t p i d ( ) ) ;

52 void s i g i n i t ( ) { 53 54 55 56 57 58 59 60 61 62 63 64 / I n i t i a l i z e s i g n a l h a n d l e r f o r SIGTSTP / s i g n a l (SIGTSTP , s i g f u n c ) ; / I n i t i a l i z e s i g n a l h a n d l e r f o r SIGINT / s i g n a l ( SIGINT , s i g f u n c ) ; / I n i t i a l i z e s i g n a l h a n d l e r f o r SIGUSR1 / s i g n a l (SIGUSR1 , s i g f u n c ) ;

KMS-Heimubung 1 65 } 66 67 void s i g k i l l ( ) { 68 69 70 } 71 72 int main ( void ){ 73 74 75 76 77 78 79 80 81 82 83 84 85 86 } while ( 1 ) ; / i f ( c h i l d >0)

UG 7

L. Liebig, J. Meschede, A. Rohlng

k i l l ( childPID , SIGKILL ) ;

I n i t i a l i z e s i g n a l h a n d l e r f o r SIGTERM / s i g n a l (SIGTERM, s i g f o r k ) ; / I n i t i a l i z e s i g n a l h a n d l e r f o r SIGUSR2 / s i g n a l (SIGUSR2 , s i g k i l l ) ; siginit ();

p r i n t f ( \nnumber o f s i g n a l s : %d , cnt SGN ) ; return EXIT SUCCESS ;

c) Die Funktion fork liefert bei erfolgreicher Ausfhrung die PID (Process ID) des Childu Prozesses an den Parent-Prozess und 0 an den Child-Prozess. Falls die Ausfhrung u nicht erfolgreich war, liefert fork() -1 an den Parent-Prozess es wird kein Child-Prozess erstellt und ein entsprechender Fehlerwert wird von einer Funktion aus der Headerdatei <errno.h> gesetzt. Die Berechnung des Child-Prozesses beginnt bei erfolgreicher Erstellung in der gleichen Zeile in der auch der Parent-Prozess unterbrochen wurde und fork() aufgerufen hat.

KMS-Heimubung 1 e)

UG 7

L. Liebig, J. Meschede, A. Rohlng

Die Einstellungen der Signalhandler des Parent-Prozesses werden vom Child-Prozess nicht ubernommen. Die Initialisierungen der Signalhandler, die dem Child- und Parent Prozess gemeinsam sind, sind deshalb im obigen Programm in eine weitere Funktion ausgelagert worden (siginit()). Der Parent-Prozess initialisiert einen weiteren Signalhandler fr die Behandlung des Signals SIGTERM und ruft danach die Funktion u siginit() auf, die dann die ubrigen Signalhandler einrichtet. Empfngt der Parenta Prozess das Signal SIGTERM so wird nach der Erstellung des Child-Prozesses von diesem ebenfalls die Funktion siginit() aufgerufen, die wiederum die Signalhandler initialisiert. Da aber der Child-Prozess an der Stelle, an der der Parent-Prozess unterbrochen wurde, mit seiner Ausfhrung beginnt wird kein Signalhandler fr das Signal SIGTERM u u eingerichtet. Somit ist gewhrleistet, dass der Child-Prozess auch bei Empfang des Sia gnals SIGTERM nur die Default-Routine fr dieses ausfhrt und kein neuer Child-Prozess u u erstellt wird. g) Ein Zombie-Prozess ist ein Prozess, dessen Ausfhrung beendet ist, jedoch trotzdem u noch einen Eintrag in der Prozesstabelle des Betriebssystem hat. Dieser Eintrag wird noch bentigt, um dem Parent-Prozess das Auslesen des Exit-Status des Child-Prozess o zu ermglichen. Im Gegensatz zu anderen Prozessen hat das kill-Kommando keine o Eekt auf einen Zombie-Prozess. i) Ein Thread ist die kleinste Einheit einer Berechnung die vom Betriebssystem-Scheduler verwaltet werden kann. Ein Thread kann somit als leichtgewichtiger Prozess beschrieben werden. Es knnen darber hinaus mehrere Threads innerhalb eines Prozesses exio u stieren, die auf die gleichen Ressourcen (Code, Speicher, Variablen) zugreifen knnen. o Im Gegensatz dazu teilen sich verschiedene Prozesse diese Ressourcen nicht. Threads unterscheiden sich von Prozessen in den folgenden Punkten: Prozesse sind typischerweise unabhngig, Threads existieren als Untermenge von a einem Prozess Prozesse tragen mehr Statusinformationen, wobei mehrere Threads in einem Pro-

KMS-Heimubung 1

UG 7

L. Liebig, J. Meschede, A. Rohlng

zess sich die Statusinformationen des Prozesses und Ressourcen teilen Prozesse haben einen jeweils eigenen Adressraum, Threads innheralb eines Prozesses teilen sich den Adressraum Prozesse knnen nur uber die vom Betriebssystem verfgbaren Inter-Prozesso u Kommunikationsmethoden kommunizieren Das Wechseln zwischen verschiedenen Threads innherhalb eines Prozesses geschieht in der Regel schneller als das Wechseln zwischen Prozessen Neben dem PCB (Process Control Block ) existiert in Multithreading-Umgebungen ein Stack und ein Control Block fr jeden Thread. In dem letztgenannten Control Block u werden Informationen uber die Werte der Register, die ein Thread benutzt und andere Informationen uber den Status eines Threads gehalten. j)

Aufgabe 3:
a) Der Zustandsbergang von Bereit nach Suspendiert ist nicht sinnvoll, da es keinen u Grund dafr gibt startbereite Prozesse auszulagern. u b) Der Zustandsbergang von Laufend nach Suspendiert ist nicht sinnvoll, da laufende u Prozesse nicht einfach so unterbrochen werden sollten. Prozesse, die die gesamte Rechenleistung der CPU verbrauchen, sollten zunchst in den Zustand Blockiert gehen, a jedoch nicht direkt ausgelagert werden. c) Der Zustandsbergang von Blockiert nach Suspendiert ist sinnvoll, da blockierte Prou zesse sich gerade nicht in der Ausfhrung benden und auch nicht zur Ausfhrung u u bereit wren. Sie knnen somit ausgelagert werden, da sie anderen Prozessen nur den a o Speicherplatz des Arbeitsspeichers wegnehmen.

KMS-Heimubung 1 d)

UG 7

L. Liebig, J. Meschede, A. Rohlng

Der Zustandsbergang von Systemstart nach Suspendiert ist sinnvoll, wenn durch Prou zessanalyse klar ist, dass der Prozess gleich zur Anfang uber Bereit, Laufend und Blockiert in den Zustand Suspendiert wechseln wrde und somit sowieso nicht zur u AUsfrhung kme. Dies stellt in diesem Fall eine Art Abkrzung dar. u a u e)