Prozesszustände (1a)

Werbung
Prozesszustände (1a)
NOT
EXISTING
DELETED
CREATED
– Meta-Zustand (Theoretische Bedeutung)
Prozesszustände – Multiuser Umfeld (1c)
• Hintergrund-Prozess
- der Prozess startet im Hintergrund - my-command.bin &
- der Prozess läuft dann im Vordergrund. Er wird im Betrieb mit
CTRL-Z gestoppt und kann danach in der Shell mit bg (background) in
den Hintergrund geschickt werden. (fg - foreground)
• nice, renice – setzt Prozess-Prioritäten
nice - - 20 important_job.bin (Priorität erhöhen)
nice - + 19 my_fancy_screensaver.bin (Priorität senken)
my-command.bin
while kill –STOP %%; do sleep 4; kill –CONT %%; sleep 1;done
Prozessverwaltung (2a)
• Programm: der Programmtext als installiertes Binary
• Prozess: Ressource des Betriebssystems in der eine Instanz eines Programms
läuft. Ein einmalig vorliegendes Programm kann mehrfach, d.h. in mehreren
Prozessen ausgeführt werden.
• Task/Job: Begriff um einen Prozess zu beschreiben, der von einer bestimmten
Shell aus gestartet wurde und von BS eindeutig identifizierbar ist. Task ist mit
jeweils einem Prozess assoziiert. Job kann mehrere Prozesse bezeichnen, die
im demselben Kontext laufen, z.B. eine Anwendung.
• Kernel-Level-Thread: Ressource des Betriebssystems, d.h. der Kern kümmert
sich um die Ressourcen-Vergabe und das präemptive Scheduling.
• User-Level-Thread: ein per Programmbibliothek eingebundener Scheduler
ermöglicht einem Prozess selber mehrere Threads zu verwalten. Das Programm
muss zur Unterbrechung der Threads und zum Wechsel der Kontrolle geeignete
Maßnahmen ergreifen und ein kooperatives Scheduling selbst durchführen.
• Mischformen: LWPs unter Solaris bilden ohne den Overhead vollwertiger und
damit schwergewichtiger Prozesse User-Level-Threads auf einen Pool von
Kernel-Level-Threads ab. Dies vereint das einfache Management der User-LevelThreads mit den, einem Betriebssystem vorbehaltenen, präemptiven
Fähigkeiten.
Prozessverwaltung
Kernel/User Mode (2b):
• Stabilität
• Datenschutz
• Abstraction/Management
Kernel-Prozesse / Benutzer-Prozesse – Schutz (2c):
Prozessor / MMU – Unterstützung
• Trennung von Segmente/Pages in unterschiedlichen Bereichen
• Privilegierung Flags – 4 Stufen – 3 Normal; (0-2) Superuser
• Assembler Sonderbefehle
Prozesswechsel (2d):
• Interrupts
• Prozessorunterstützung
!!! Parameteraustausch zw. Kernel und User Speicher – nur durch Kopien
Wechsel zum Kernel-Mode – Call-Gates (2d)
0
2:
3: CallGate auf Seg 2, Offset Funk 24
Segment-Deskriptor-Tabelle
4:
Korrekte
Einsprungspunkte
Segment 2, PL0, Kernel
Longjump über CallGate
LONG JMP 3:
Segment 4, PL3, User
MAX
Beliebiges Longjump FALSCH
Speicherverwaltung (3a)
Logischer Speicher
(Benutzer Sicht)
Physikalischer Speicher
Segment
Page
Logischer Speicher
=
1 Segment
.
.
.
Flat Segmentation
.
.
.
Speicherverwaltung (3b)
Logischer Speicher
(Benutzer Sicht)
Physikalischer Speicher
Proz. A
Proz. B
.
.
.
.
.
.
Segment
Page
Koordinierung – konkurrierender Zugriff (4a)
public class Count extends Thread {
static int value=0; //gezählte Wert
boolean reader=false; //Unterscheidung zw. Leser und Schreiber
static Object barrier = new Object(); //Semaphor-Rolle
Count(boolean reader) { this.reader=reader; }
public void run() {
while(true) {
synchronized(barrier) { //warten an der Barriere, synchronized = kritischen Bereich
if (reader) { //Ist das der Leser Thread?
System.out.println("value is "+value);
value=0;
}
else value++;//Wenn das der Schreiber ist
} //Der Leser schläft, um den Schreiber Zeit zum schreiben zu geben
if (reader) try {sleep(1000);} catch(InterruptedException e) { e.printStackTrace(); }
}
}
public final static void main(String[] args) throws Exception {
new Count(true).start(); //Leser Thread
new Count(false).start(); //Schreiber Thread
synchronized(barrier) {barrier.wait();} //Objekt mit Semaphor-Rolle
}
}
Java Semaphor 1 (4c)
public class Semaphore {
boolean s; //Semaphor Variable
public Semaphore { // Semaphor Variable wird über „Semaphore“-Objekt
gesteuert
s = true;
}
// Semaphor Eingang
synchronized public void P() {
while (s == false){
try {
wait();
} catch (InterruptedException e) { }
}
s = false;
}
// Semaphor Ausgang
synchronized public void V() {
s = true;
notify(); //weckt alle wartenden Prozesse
}
}
Java Semaphor 2 (4c)
public class Semaphore {
int s;
public Semaphore {
s = 1;
}
synchronized public void P()
{
while (s <= 0){
try {
wait();
} catch (InterruptedException e) { }
}
s = s - 1;
}
synchronized public void V() {
s = s + 1;
notify();//weckt einen, der wartenden Prozesse
}
}
Java PV-Semaphor (4c)
public class ChunkSemaphore {
int s; //Semaphor Variable
public ChunkSemaphore(int initial) {
s = initial;
}
// Semaphor Eingang
synchronized public void P(int k) throws InterruptedException {
while (s - k <= 0) wait(); // Semaphor ist komplett besetzt - warten
s = s - k; // Semaphor dekrementieren
}
// Semaphor Ausgang
synchronized public void V(int k) {
s = s + k; // Semaphor inkrementieren
notifyAll();// weckt alle wartenden Prozesse
}
}
Herunterladen