Prozesse: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(21 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)]]
*Programm, das in den Hauptspeicher geladen wurde
+
*[[Prozesse Eltern und Kinder]]
*Prozessumgebung
+
*[[Rechenzeit und Priorität]]
 
+
*[[Prozesse Signale]]
Unter einem Prozess versteht man ein Programm (binär), das in den Hauptspeicher
+
*[[Programme im Zusammenhang mit Prozessen]]
geladen wurde. Also nicht das Program selbst, das auf der Festplatte liegt ist der
+
*[[Forkbomb]]
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 7. Juni 2024, 11:56 Uhr