Prozesse: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(24 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
−
===Was ist ein Prozess?===
+
*[[Was ist ein Prozess?]]
−
Ein Prozess setzt sich aus zwei Teilen zusammen:
+
*[[Prozesstabelle (Anzeige mit ps)]]
−
 
+
*[[Prozesse Eltern und Kinder]]
−
1.Programm, das in den Hauptspeicher geladen wurde
+
*[[Rechenzeit und Priorität]]
−
 
+
*[[Prozesse Signale]]
−
2.Prozessumgebung
+
*[[Programme im Zusammenhang mit Prozessen]]
−
 
+
*[[Jobs]]
−
Unter einem Prozess versteht man ein Programm (binär), das in den Hauptspeicher
+
*[[Forkbomb]]
−
geladen wurde. Also nicht das Program selbst, das auf der Festplatte liegt ist der
 
−
Prozess, sondern es wird erst durch das Laden in den Hauptspeicher dazu.
 
−
Normalerweise liegt ein Programm als ausführbare Datei irgendwo auf der
 
−
Festplatte oder auf Diskette. Ob es sich bei dem Programm um eine binäre Datei
 
−
handelt, kann man mit dem Befehl '' file '' feststellen.
 
−
 
−
root@zero:~# file /bin/mkdir
 
−
/bin/mkdir: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
 
−
 
 
−
 
 
−
Die Datei liegt im Maschinencode vor und kann in den Hauptspeicher geladen
 
−
werden. Sobald dies geschehen ist, kann der Rechner diesen Maschinencode
 
−
abarbeiten (ausführen).
 
−
 
 
−
Da aber ein Programm nicht direkt auf die Hardware zugreifen soll, muss es vom
 
−
Betriebsystem kontrolliert werden. Das Betriebssystem liegt logisch gesehen
 
−
zwischen Hardware und Anwendung. Das Betriebssystem ordnet jedem Prozess
 
−
verschiedene Kenndaten zu, um die Prozesse verwalten zu können. Alle
 
−
Kenndaten, die einem Prozess zugeordnet sind, nennt man die
 
−
Prozessumgebung.Wenn man in der Shell ein Kommando eingibt, wird ein Prozess
 
−
kreiert. Natürlich ist die Shell selbst auch ein Prozess. Ein Prozess kann aber
 
−
genauso gut ein Serverprozess (Dienst) sein, z.B. Apache.
 
−
Ein wesentliches Merkmal eines Prozesses ist die Prozesskommunikation. Über im
 
−
Betriebssystem implementierte Methoden ist es möglich, dass verschiedene
 
−
Prozesse Signale und Daten untereinander austauschen können.
 
−
Dadurch wird auch dem Benutzer ermöglicht, einem Prozeß bestimmte Signale zu
 
−
senden bzw. auf den Status eines Prozesses Einfluss zu nehmen.
 
−
 
 
−
===Prozesstabelle (Anzeige mit ps)===
 
−
Da zu jedem Prozess Kenndaten geführt werden, müssen diese auch irgendwo
 
−
festgehalten werden. Das geschieht in der sogenannten Prozesstabelle.
 
−
 
 
−
Kenndaten der Prozesse (Auswahl):
 
−
* F Flags (z.B. ausgelagert; Systemprozess; Trace,...)
 
−
* UID Nutzer, mit dessen Rechten der Prozess ausgeführt wird
 
−
* PID Prozess - ID. Diese Nummer gibt eine eindeutige Prozess - Nummer
 
−
an. Sie wird vom System automatisch beim Starten des Prozesses
 
−
vergeben und ist für die Laufzeit eindeutig.
 
−
* PPID Prozessnumer der Eltern-Prozesses
 
−
* PRI Priorität eines Prozesses; je niedriger der Wert ist, desto besser
 
−
* NI ist der Nicewert des Prozesses; Nice erniedrigt den Grundwert
 
−
der Priorität des Prozesses und gibt damit Prozessorzeit für andere
 
−
Prozesse frei.
 
−
* SIZE Speichergröße des Prozesses inklusive Stack (eine Art Zwischenspeicher)
 
−
* RSS Verbrauch an physischen Speicher
 
−
* WCHAN ist der Name der Kernerlfunktion, in der der Prozess schläft
 
−
* STAT Status des Prozesses
 
−
R läuft      S schlafend    D nicht störbarer Schlaf
 
−
T angehalten  Z Zombie        W der Prozess belegt keine Seiten
 
−
* TIME Bisland benötigte Prozessorzeit
 
−
* SIZE ist die Größe von Text, Daten und Stack
 
−
* TTY die Nummer des kontrollierenden Teminal; wenn hier ein ? steht,
 
−
handelt es sich um einen Dämon oder Serverprozess.
 
−
* COMMAND Angabe des Prozesses selbst. Dies ist meist der Programmname.
 
−
 
 
−
Weiteres
 
−
* GID Gruppe, unter der der Prozess läuft
 
−
* Verweis auf das aktuellen Arbeitsverzeichnis
 
−
* Um mit relativen Pfadangaben arbeiten zu können braucht man diesen Eintrag
 
−
* Tabelle mit Verweisen auf aktuell geöffnete Dateien
 
−
* 3 sind automatisch geöffnet Standardeingabe, Standardausgabe und
 
−
Standardfehlerkanal
 
−
 
 
−
Beispiel
 
−
root@zero:~# ps -l
 
−
F S  UID  PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
 
−
4 R    0 18639 18631  0  80  0 -  1080 -      pts/0    00:00:00 bash
 
−
0 R    0 25904 18639  0  80  0 -  635 -      pts/0    00:00:00 ps
 
−
 
 
−
===Eltern und Kinder===
 
−
Jeder Prozess kann weitere Prozesse erzeugen. Die erzeugten Prozesse bezeichnet
 
−
man als Kindprozesse. Jeder Kindprozess weiß anhand der PPID, woher er stammt.
 
−
 
 
−
Alle Prozesse sind von einem anderen Prozess gestartet worden, mit Ausnahme
 
−
des Pseudoprozesses (noch im Kernel beim Starten erzeugter Prozess). Dieser hat
 
−
die Prozessnummer 0. Er hat die Aufgabe, den Init Prozess ( /sbin/init die Nummer
 
−
1) zu starten, der in System V alle anderen Prozesse direkt oder über seine Kind-
 
−
prozesse startet. (init wird konfiguriert durch die /etc/inittab)
 
−
 
 
−
Es gibt zwei Arten wie ein Prozess gestartet werden kann:
 
−
 
 
−
# Fork und Exec: Prozessumgebung wird dupliziert, der neue Prozess bekommt eine eigene neue PID
 
−
# Exec: Alter Prozess wird durch neuen Prozess überladen (geht mit dem shell-buildin exec)
 
−
 
 
−
'''Rechte auf Objekte UID GID'''
 
−
Ob ein Prozess auf eine Datei zugreifen kann, entscheidet der Kernel anhand der
 
−
Zugriffssrechte, die auf der Datei gesetzt sind. Er checkt anhand der UID und GID
 
−
des Prozesses, ob es erlaubt ist. Mit dieser Technik wird letztendlich geprüft, was
 
−
ein User darf, und was nicht.
 
−
 
 
−
===Rechenzeit und Priorität===
 
−
Da auch bei Prozessen eine Gerechtigkeit herschen muss, muss eine Instanz
 
−
darüber entscheiden wie lange ein Prozess Rechenzeit verbrauchen darf.
 
−
Folgende Kenndaten werden dazu benötigt
 
−
* clocktick = Zeiteinheit
 
−
* n = Faktor über den Kernel einstellbar
 
−
* slice = n <nowiki>*</nowiki> clocktick
 
−
* agingtime = weitere Zeiteinheit über den Kernel einstellbar
 
−
 
 
−
Es wird davon ausgegangen das der Prozess mit der niedrigsten Priorität gerade
 
−
rechnet. Pro clocktick erhöht sich die Priorität dieses Prozesses um eins.
 
−
 
 
−
Jetzt können 3 Situationen eintreten die alle dazu führen das der Scheduler
 
−
aufgerufen wird.
 
−
 
 
−
# Prozess blockiert wegen einer Ausgabe oder Eingabe.
 
−
# Gibt Rechenzeit freiwillig ab.
 
−
# Der Slice endet.
 
−
 
 
−
Der Aufruf des Schedulers bewirkt das der Prozess mit der niedrigsten Priorität
 
−
gescheduled wird, er also nun rechnen darf. Nach Ablauf der agingtime werden
 
−
nun die Prozesse "gealtert". Das geschieht nach folgender Formel
 
−
 
 
−
Neue Priorität = Alte Priorität / 2 + Nicewert
 
−
 
 
−
Der User hat die Möglichkeit, über den sogenannten Nicewert den Grundwert für
 
−
einen Prozess zu senken. Der Prozess braucht dann länger für seine Abarbeitung.
 
−
Er verhält sich somit netter zu den anderen Prozessen. Normale User können nur
 
−
netter werden, der Systemverwalter kann auch nicht netter (gemeiner) werden. Der
 
−
Bereich liegt zwischen 19 (sehr nett) bis 0 (weniger nett) für die User, und 19 bis
 
−
-20 für root.
 
−
 
 
−
 
 
−
'''Signale'''
 
−
 
 
−
Mit den Kommando kill und killall kann man Prozessen Signale schicken
 
−
 
 
−
kill -Signalnummer PID
 
−
 
 
−
Signalnummer
 
−
{| border=1 cellpadding=2
 
−
!Signalname
 
−
!Wert
 
−
!Aktion
 
−
|-
 
−
|SIGHUP
 
−
|1
 
−
|Neuinitialisierung eines Prozesses
 
−
|-
 
−
|SIGINT
 
−
|2
 
−
|Interrupt-Signal von der Tastatur (STRG+c)
 
−
|-
 
−
|SIGQUIT
 
−
|3
 
−
|Interrupt-Signal von der Tastatur (STRG+c) mit Dump
 
−
|-
 
−
|SIGKILL
 
−
|9
 
−
|unwiderrufliches Beendigungssignal (Töten)
 
−
|-
 
−
|SIGSEGV
 
−
|11
 
−
|Ungültige Speicherreferenz (bedeutet oft auf defekten Speicher)
 
−
|-
 
−
|SIGTERM
 
−
|15
 
−
|Beendigungssignal (geöffnete Dateien werden geschlossen)
 
−
|-
 
−
|SIGCONT
 
−
|18
 
−
|Weiterfahren, wenn gestoppt
 
−
|-
 
−
|SIGSTOP
 
−
|19
 
−
|Prozessstop
 
−
|}
 
−
 
 
−
Beispiel
 
−
root@zero:~# kill -1 7562
 
−
 
 
−
===Programme im Zusammenhang mit Prozessen===
 
−
====ps: Zeigt die Prozesse mit ihrem Status an====
 
−
 
 
−
*[[ps]]
 
−
 
 
−
====pgrep: Zeigt die PID zu einem Prozess an====
 
−
*zeigt alle Prozesse an die auf die das Muster
 
−
root@zero:~# pgrep mc
 
−
13552
 
−
13734
 
−
*zeigt nur die an die einem User gehören
 
−
root@zero:~# pgrep -u thomas mc
 
−
13552
 
−
zeigt denn vollständigen Prozessnamen an
 
−
root@zero:~# pgrep -l apa
 
−
1427 apache2
 
−
1428 apache2
 
−
1429 apache2
 
−
6710 apache2
 
−
zeigt den zuletzt gestarteten Prozess
 
−
root@zero:~# pgrep -n apa
 
−
1429
 
−
zeigt nur Prozesse an die genau auf den Namen passen
 
−
root@zero:~# pgrep -x apache2
 
−
1427
 
−
1428
 
−
1429
 
−
6710
 
−
====pkill: schickt einem Prozess anhand des Namens ein Signal====
 
−
beendet den Prozess
 
−
root@zero:~# pkill -x apache2
 
−
beendet den Prozess der als erstes gestartet wurde
 
−
root@zero:~# pkill -xo mc
 
−
 
 
−
====nice: Lässt ein Programm mit verändertem Grundwert der Priorität laufen====
 
−
root@zero:~# nice
 
−
0
 
−
root@zero:~# nice -n 9 bash
 
−
root@zero:~# nice
 
−
9
 
−
root@zero:~#
 
−
 
 
−
====renice: Ändert den Grundwert der Priorität eines laufenden Prozesses====
 
−
root@zero:~# renice 10 5742
 
−
5742: Alte Priorität: 0, neue Priorität: 10
 
−
 
 
−
====top: Zeigt die Prozesse mit ihrem Status an (Abbrechen mit q)====
 
−
root@zero:~# top
 
−
top - 08:51:08 up 20 min,  1 user,  load average: 0.00, 0.02, 0.06
 
−
Tasks:  93 total,  1 running,  92 sleeping,  0 stopped,  0 zombie
 
−
Cpu(s):  1.6%us,  3.1%sy,  0.1%ni, 84.9%id, 10.2%wa,  0.0%hi,  0.2%si,  0.0%st
 
−
Mem:    509504k total,  273948k used,  235556k free,    11312k buffers
 
−
Swap:  321260k total,        0k used,  321260k free,  118380k cached
 
−
 
−
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                     
 
−
2208 mysql    20  0  125m  21m 5552 S  1.7  4.2  0:02.29 mysqld                                                                       
 
−
3201 root      20  0  2444 1064  828 R  1.7  0.2  0:00.04 top                                                                         
 
−
    1 root      20  0  1908  780  564 S  0.0  0.2  0:02.19 init                                                                         
 
−
    2 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 kthreadd                                                                     
 
−
    3 root      RT  -5    0    0    0 S  0.0  0.0  0:00.00 migration/0                                                                 
 
−
    4 root      15  -5    0    0    0 S  0.0  0.0  0:00.03 ksoftirqd/0                                                                 
 
−
    5 root      RT  -5    0    0    0 S  0.0  0.0  0:00.00 watchdog/0                                                                   
 
−
    6 root      15  -5    0    0    0 S  0.0  0.0  0:00.04 events/0                                                                     
 
−
    7 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 khelper                                                                     
 
−
    8 root      RT  -5    0    0    0 S  0.0  0.0  0:00.00 kstop/0                                                                     
 
−
    9 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 kintegrityd/0                                                               
 
−
  10 root      15  -5    0    0    0 S  0.0  0.0  0:00.03 kblockd/0                                                                   
 
−
  11 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 kacpid                                                                       
 
−
  12 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 kacpi_notify                                                                 
 
−
  13 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 cqueue                                                                       
 
−
  14 root      15  -5    0    0    0 S  0.0  0.0  0:00.53 ata/0                                                                       
 
−
  15 root      15  -5    0    0    0 S  0.0  0.0  0:00.00 ata_aux
 
−
 
 
−
Kommandos
 
−
 
 
−
*h - Hilfe
 
−
*u - User
 
−
*k - Kill
 
−
*r - Renice
 
−
*d - Delay (Default 3s)
 
−
*n - Tasks (Default unbegrenzt)
 
−
*W - Schreibe aktuelle Konfiguration in Datei
 
−
*q - Quit
 
−
 
 
−
====pstree: Zeigt die Prozesse als Baumstruktur====
 
−
Mit -p werden auch die PID's ausgegeben
 
−
root@zero:~# pstree
 
−
init─┬─NetworkManager
 
−
      ├─acpid
 
−
      ├─apache2───5*[apache2]
 
−
      ├─atd
 
−
      ├─bluetoothd
 
−
      ├─console-kit-dae───63*[{console-kit-dae}]
 
−
      ├─cron
 
−
      ├─cupsd
 
−
      ├─dbus-daemon
 
−
      ├─dd
 
−
      ├─gdm───gdm─┬─Xorg
 
−
      │          └─gdmgreeter
 
−
      ├─6*[getty]
 
−
      ├─hald───hald-runner─┬─hald-addon-acpi
 
−
      │                    ├─hald-addon-inpu
 
−
      │                    └─2*[hald-addon-stor]
 
−
      ├─klogd
 
−
      ├─nm-system-setti
 
−
      ├─nmbd
 
−
      ├─nscd───11*[{nscd}]
 
−
      ├─portmap
 
−
      ├─rpc.statd
 
−
      ├─slapd───2*[{slapd}]
 
−
      ├─smbd───smbd
 
−
      ├─sshd───sshd───bash───bash───pstree
 
−
      ├─syslogd
 
−
      ├─system-tools-ba
 
−
      ├─udevd
 
−
      ├─winbindd─┬─winbindd───winbindd
 
−
      │          └─3*[winbindd]
 
−
      └─wpa_supplicant
 
−
 
 
−
===Jobs===
 
−
Unter einem Job versteht man ein Programm, welches man von der Shell gelöst
 
−
hat. D. h. man kann ganz normal weiter arbeiten und der Job verrichtet seinen
 
−
Dienst im Hintergrund. Man kann jederzeit zu diesem Job wieder Kontakt
 
−
aufnehmen.
 
−
 
 
−
Ein Job kann auf 2 Arten gestarten werden:
 
−
 
 
−
# Durch Anhängen des & Zeichens beim Programmstart
 
−
root@zero:~# tail -f /var/log/messages &
 
−
Jun 19 06:59:31 zero -- MARK --
 
−
Jun 19 07:19:31 zero -- MARK --
 
−
Jun 19 07:39:32 zero -- MARK --
 
−
Jun 19 07:44:57 zero syslogd 1.5.0#5ubuntu3: restart.
 
−
Jun 19 07:59:32 zero -- MARK --
 
−
Jun 19 08:19:32 zero -- MARK --
 
−
Jun 19 08:39:32 zero -- MARK --
 
−
Jun 19 08:59:32 zero -- MARK --
 
−
Jun 19 09:19:33 zero -- MARK --
 
−
Jun 19 09:39:33 zero -- MARK --
 
−
[3] 27421
 
−
 
 
−
# Durch Stoppen des Prozesses durch Drücken von Strg-Z und in den Hintergrund schicken mit %n (n ist die Jobnummer)
 
−
root@zero:~# watch cat /proc/cpuinfo
 
−
Strg-Z
 
−
[4]+  Stopped                watch cat /proc/cpuinfo
 
−
root@zero:~# bg %4
 
−
[4]+ watch cat /proc/cpuinfo &
 
−
 
 
−
Anweisungen im Zusammenhang mit Jobs (n ist die Jobnummer)
 
−
* bg %n : Einen Job in den Hintergrund stellen (wie oben)
 
−
* fg %n : Einen Job in den Vordergrund holen
 
−
root@zero:~# fg %4
 
−
watch cat /proc/cpuinfo
 
−
 
 
−
* jobs : Aktive Jobs ausgeben
 
−
 
 
−
root@zero:~# jobs
 
−
[1]  Running                tail -f /var/log/syslog &
 
−
[2]  Running                tail -f /var/log/syslog &
 
−
[3]-  Running                tail -f /var/log/messages &
 
−
[4]+  Stopped                watch cat /proc/cpuinfo
 
−
 
 
−
* Strg-Z : Einen Vordergrund-Job vorübergehend anhalten
 
−
* kill -STOP %n : Unterbricht Job im Hintergrund
 
−
root@zero:~# kill -STOP %1
 
−
root@zero:~# jobs
 
−
[1]+  '''Stopped'''                tail -f /var/log/syslog
 
−
[2]  Running                tail -f /var/log/syslog &
 
−
[3]  Running                tail -f /var/log/messages &
 
−
[4]-  Stopped                watch cat /proc/cpuinfo
 
−
* kill -CONT %n : Setzt den unterbrochenen Job im Hintergrund fort
 
−
root@zero:~# kill -CONT %1
 
−
root@zero:~# jobs
 
−
[1]+  '''Running'''                tail -f /var/log/syslog &
 
−
[2]   Running                tail -f /var/log/syslog &
 
−
[3]  Running                tail -f /var/log/messages &
 
−
[4]-  Stopped                watch cat /proc/cpuinfo
 
−
* kill -KILL %n : Tötet Job im Hintergrund
 
−
root@zero:~# kill -KILL %1
 
−
root@zero:~# jobs
 
−
[1]+  '''Killed'''                  tail -f /var/log/syslog
 
−
[2]  Running                tail -f /var/log/syslog &
 
−
[3]  Running                tail -f /var/log/messages &
 
−
[4]-  Stopped                watch cat /proc/cpuinfo
 
−
root@zero:~# jobs
 
−
[2]   Running                tail -f /var/log/syslog &
 
−
[3]-  Running                tail -f /var/log/messages &
 
−
[4]+  Stopped                watch cat /proc/cpuinfo
 
−
 
 
−
Bedingungen, die zu Jobausführung eingehalten werden sollen:
 
−
* Der Job soll nicht auf den Bildschirm schreiben (Standardausgabe +Standardfehlerkanal).
 
−
* Er soll keine Eingaben vom Benutzer erwarten.
 

Aktuelle Version vom 28. Januar 2026, 05:43 Uhr