Unitat 3 · Sistemes Operatius (SO)
Un procés és una instancia d’un programa en execució (tasca). Això vol dir que si 10 usuaris d’un servidor utilitzen el mateix programa, com vi, hi ha 10 processos vi que s’executen al servidor, tot i que tots comparteixen el mateix codi executable.
ps (I)Imagineu que utilitzem la comanda sleep 120 &. Aquest comanda ens crearà 3 processos sleep en background. La eina ps ens permet veure’ls.
ps -eL’opció -e indica a l’ordre que mostri tots els processos del sistema. Sense aquesta opció, l’ordre només mostra els processos de l’usuari a la sessió actual.
Aquests processos tenen PID 1053, 1054 i 1054. També observeu l’ordre ps al final de la llista. Això es deu al fet que l’ordre en si també és un procés.
ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
6 ? 00:00:00 kworker/0:0H-events_highpri
9 ? 00:00:00 mm_percpu_wq
10 ? 00:00:00 rcu_tasks_rude_
11 ? 00:00:00 rcu_tasks_trace
12 ? 00:00:00 ksoftirqd/0
13 ? 00:00:03 rcu_sched
14 ? 00:00:00 migration/0
15 ? 00:00:00 cpuhp/0
17 ? 00:00:00 kdevtmpfs
18 ? 00:00:00 netns
...
1053 pts/0 00:00:00 sleep
1054 pts/0 00:00:00 sleep
1055 pts/0 00:00:00 sleep
1056 pts/0 00:00:00 psps (II)ps -eps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
6 ? 00:00:00 kworker/0:0H-events_highpri
9 ? 00:00:00 mm_percpu_wq
10 ? 00:00:00 rcu_tasks_rude_
11 ? 00:00:00 rcu_tasks_trace
12 ? 00:00:00 ksoftirqd/0
13 ? 00:00:03 rcu_sched
14 ? 00:00:00 migration/0
15 ? 00:00:00 cpuhp/0
17 ? 00:00:00 kdevtmpfs
18 ? 00:00:00 netns
...
1053 pts/0 00:00:00 sleep
1054 pts/0 00:00:00 sleep
1055 pts/0 00:00:00 sleep
1056 pts/0 00:00:00 psps (III)ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
6 ? 00:00:00 kworker/0:0H-events_highpri
9 ? 00:00:00 mm_percpu_wq
10 ? 00:00:00 rcu_tasks_rude_
11 ? 00:00:00 rcu_tasks_trace
12 ? 00:00:00 ksoftirqd/0
13 ? 00:00:03 rcu_sched
14 ? 00:00:00 migration/0
15 ? 00:00:00 cpuhp/0
17 ? 00:00:00 kdevtmpfs
18 ? 00:00:00 netns
...
1053 pts/0 00:00:00 sleep
1054 pts/0 00:00:00 sleep
1055 pts/0 00:00:00 sleep
1056 pts/0 00:00:00 pstop
Per veure informació dels processos en UNIX tornarem a fer servir la comanda ps. Si fem man ps i busquem PROCESS STATE CODES, veurem el següents estats:
ps (IV)Es pot mostrar més informació sobre la llista de processos mitjançant l’opció -l de l’ordre ps:
La primera columna (F) de la sortida anterior identifica els indicadors de procés (vegeu la pàgina del manual si esteu interessats). La columna (S) indica l’estat d’un procés.
Recordeu que sense l’opció -e, ps només mostra els processos al terminal actual, en aquest cas pts/0.
En l’exemple anterior, podeu veure que el procés bash és el pare dels processos sleep i ps. Si esteu connectats per ssh al servidor, el procés bash és fill del procés sshd. I el procés sshd és fill del procés init (PID = 1).
El procés amb PID = 1 és el primer procés que s’inicia quan el sistema arrenca. Aquest procés es coneix com a init (o systemd en sistemes més moderns) i és el pare de tots els altres processos en execució al sistema.
Un procés inactiu és un procés que esta esperant a que succeeixi un esdeveniment per poder continuar la seva execució.
Aquest esdeveniment pot ser una entrada de l’usuari, la finalització d’una operació d’entrada/sortida, o qualsevol altra condició que el procés necessita per continuar.
La majoria dels processos del sistema són inactius, que esperen algun tipus d’esdeveniment, com ara fer clic amb el ratolí o prémer una tecla. A l’exemple anterior, l’única ordre en execució és ps.
pstreeps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY CMD
4 S 0 1034 1007 0 80 0 - 2095 - pts/0 bash
0 T 0 1059 1034 0 80 0 - 3448 - pts/0 vi
0 T 0 1066 1034 0 80 0 - 3448 - pts/0 vim
0 T 0 1068 1034 0 80 0 - 2358 - pts/0 top
0 T 0 3502 1034 0 80 0 - 30692 - pts/0 emacs
0 T 0 3505 1034 0 80 0 - 30692 - pts/0 emacs
4 R 0 3569 1034 0 80 0 - 2405 - pts/0 pspstree
systemd-|-agetty
|--cron
|--dbus-daemon
|--dhclient---3*[{dhclient}]
|--exim4
|--rsyslogd---3*[{rsyslogd}]
|--sshd-|-sshd---bash-|-2*[emacs---{emacs}]
| | |--pstree
| | |--top
| | |--vi
| | |--vim
| |--sshd---bash---emacs---{emacs}
|--systemd---(sd-pam)
|--systemd-journal
|--systemd-logind
|--systemd-timesyn---{systemd-timesyn}
|--systemd-udevd
|--wpa_supplicantEl temps de vida d’un procés X pot ser dividit en un conjunt d’estats que descriuen el comportament de l’procés.
exit.L’estat expropiat es similar a l’estat preparat en memòria principal per ser executat, però un procés expropiat té garantit que el seu pròxim estat serà execució en mode usuari quan torni a ser planificat per ser executat

Quan un nou procés (A) es crea, mitjançant una crida a sistema fork realitzada per un altre procés (B), el primer estat en què entra A és l’estat creat. Des d’aquí pot passar, depenent de si hi ha prou espai en memòria principal: a) preparat per a execució en memòria principal o b) preparat per a execució en memòria secundària.
read(), per llegir dades d’un fitxer. En aquest moment el procés A passa a l’estat execució en mode nucli on s’executa la crida a sistema.read() necessita realitzar una operació d’E/S amb el disc, llavors el kernel ha d’esperar que es completi l’operació.Quan el procés es completi, invocarà explícitament o implícitament a la crida a sistema exit, en conseqüència passarà a l’estat execució en mode supervisor. Quan es completi aquesta crida a sistema passarà finalment a l’estat zombi.
Un procés té control sobre algunes transicions d’estat. En primer lloc, un procés pot crear un altre procés. No obstant això, és el kernel qui decideix en quin moment es realitzen la transició des de l’estat creat a l’estat preparat per a execució en memòria principal o a l’estat preparat per a execució en memòria secundària.
Un procés pot invocar una crida a sistema, el que provocarà que passi de l’estat execució en mode usuari a l’estat execució en mode kernel. No obstant això, el procés no té control de quan tornarà d’aquest estat, fins i tot alguns esdeveniments poden produir que mai retorni i passi a l’estat zombi.
Un procés pot finalitzar realitzant una invocació explícita de la crida a sistema exit, però d’altra banda esdeveniments externs també poden fer que es produeixi l’acabament de l’procés.
La resta de les transicions d’estat segueixen un model rígid codificat en el nucli. Per tant, el canvi d’estat d’un procés davant l’aparició de certs esdeveniments es realitza d’acord a unes regles predefinides.
sleep 120.bg. Aquesta orde llança el procés pausat en segon pla (similar a executar-lo amb & al final, deixant el terminal lliure).sleep 120 &kill -STOP {PID del procés sleep}kill -CONT {PID del procés sleep}straceEn una terminal executem un procés. Per exemple:
En un altra terminal executem la següent instrucció:
read() el procés està esperant entrada de dades.El PCB és una estructura de dades que permet al sistema operatiu supervisar i control un procés.

El PCB de Linux es defineix a struct task_struct al fitxer sched.h.
exit (2) o, si acaba per un senyal, contindrà el identificador de senyal que el va matar.
El kernel gestiona una estructura de taula (diccionari) semblant a la representada en la imatge següent per poder accedir de forma eficient als diferents PCBs. Aquesta estrcutura de dades es coneix com a Taula PCB.

/procLa gestió de processos a Unix/Linux és crucial per a una utilització eficient del sistema i una correcta assignació de recursos. El directori /proc ofereix accés als PCBs que contenen informació sobre cada procés en execució.


Unitat 3 · Sistemes Operatius (SO) 🏠