Vés al contingut

Wait (crida al sistema)

De la Viquipèdia, l'enciclopèdia lliure

En els sistemes operatius d'ordinadors, un procés (o tasca) pot esperar que un altre procés completi la seva execució. En la majoria de sistemes, un procés pare pot crear un procés fill d'execució independent. El procés principal pot emetre una crida al sistema d'espera, que suspèn l'execució del procés principal mentre s'executa el fill. Quan el procés fill finalitza, retorna un estat de sortida al sistema operatiu, que després es retorna al procés principal en espera. Aleshores, el procés pare reprèn l'execució.[1]

Els sistemes operatius moderns també proporcionen crides al sistema que permeten que el fil d'un procés creï altres fils i esperen que finalitzin ("uneix-los") d'una manera similar.[2]

Un sistema operatiu pot proporcionar variacions de la crida d'espera que permeten a un procés esperar a que surti qualsevol dels seus processos fills o esperar que surti un únic procés secundari específic (identificat pel seu ID de procés).[3]

Alguns sistemes operatius emeten un senyal (SIGCHLD) al procés principal quan finalitza un procés fill, notificant-lo i permetent-li recuperar l'estat de sortida del procés fill.

L'estat de sortida retornat per un procés fill normalment indica si el procés va finalitzar amb normalitat o anormalment. Per a la terminació normal, aquest estat també inclou el codi de sortida (normalment un valor enter) que el procés ha retornat al sistema. Durant els primers 20 anys d'UNIX, només els 8 bits baixos del codi de sortida han estat disponibles per als pares en espera. El 1989 amb SVR4, s'ha introduït una nova crida waitid que retorna tots els bits de la crida de sortida en una estructura anomenada siginfo_t al membre de l'estructura si_status. Waitid és una part obligatòria de l'estàndard POSIX des de 2001.[4]

Zombis i orfes[modifica]

Quan un procés fill finalitza, es converteix en un procés zombi i continua existint com a entrada a la taula de processos del sistema encara que ja no sigui un programa que s'executa activament. En un funcionament normal, normalment el seu pare l'esperarà immediatament i després el sistema el recollirà, recuperant el recurs (l'entrada de la taula de processos). Si un fill no és esperat pel seu pare, continua consumint aquest recurs indefinidament i, per tant, és una fuga de recursos. Aquestes situacions es tracten normalment amb un procés especial de "segador" que localitza zombis i recupera el seu estat de sortida, permetent al sistema operatiu desassignar els seus recursos.

Per contra, un procés fill el procés principal del qual finalitza abans que ho faci es converteix en un procés orfe. Aquestes situacions normalment es gestionen amb un procés especial "arrel" (o "inici"), que s'assigna com a nou pare d'un procés quan el seu procés pare surt. Aquest procés especial detecta quan finalitza un procés orfe i després recupera el seu estat de sortida, permetent al sistema desassignar el procés fill finalitzat.

Si un procés fill rep un senyal, un pare en espera continuarà l'execució deixant enrere un procés orfe. Per tant, de vegades cal comprovar l'argument establert per wait, waitpid o waitid i, en el cas que WIFSIGNALED sigui cert, esperar que el procés fill torni a desassignar recursos.

Referències[modifica]

  1. «Wait System Call in C» (en anglès americà). GeeksforGeeks, 03-06-2017. [Consulta: 15 maig 2023].
  2. «Process Lifecycle» (en anglès). [Consulta: 12 desembre 2023].
  3. «Process State» (en anglès). [Consulta: 12 desembre 2023].
  4. «Process State Diagram in Operating System» (en anglès). [Consulta: 12 desembre 2023].