Processos en Linux

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda
Relacionat: Gestió de processos, Linux, Gestió de memòria, Gestió de E/S

En tot sistema operatiu un procés està representat per una estructura de dades on es guarda tota la informació rellevant d'aquest, el PCB (Process Control Block), bloc de control del procés o descriptor del procés.

En Linux, el PCB és l'estructura struct task_struct. En aquesta estructura apareix tota mena d'informació sobre un proceso.Cada procés del sistema té una estructura del tipus struct task_struct associada. Aquesta estructura forma part d'una estructura del tipus union task_union que conté el PCB (struct task_struct) i la pila del nucli d'aquest procés (per quan el procés s'executa en mode nucli). Aquesta estructura, en la qual la pila i el PCB comparteixen la memòria ocupa 8KB.

Amb aquesta estructura, el nucli és capaç de determinar el punter al PCB d'un procés a partir del seu punter de la pila de nucli (es fa amb la macro current que executa tres instruccions d'assemblador).

   union task_union struct task_struct task;
   unsignedlong stack [INIT_TASK_SIZE / sizeof (long)];

El conjunt de processos en el sistema Linux està representat com una col·lecció d'estructures struct task_struct, les quals estan enllaçades de dues formes principalment: Com una taula hash, ordenats pel pid i com una llista circular doblement enllaçada usant els punters p-next_task i p-prev_task.

  • La taula hash és usada per trobar ràpidament una tasca pel seu pid fent servir find_task_pid ().
  • La llista circular doblement enllaçada que utilitza p-next_task / prev_task és mantinguda per poder anar fàcilment a través de totes les tasques del sistema.

Descriptor del procés

El principal tipus de dada que s'utilitza per gestionar els processos en el nucli és task_struct, el descriptor de procés. Una instància d'aquest tipus de dada pot ocupar normalment fins a prop de 1000 bytes. Està molt ben aprofitada: totes les estructures i taules que treballen amb processos estan implementades de manera que una mateixa d'aquestes task_struct pot formar part de moltes taules o llistes alhora.

Moltes parts del S.O. fan ús d'aquesta estructura de dades, pel que és necessari conèixer els camps més importants de task_struct.

Alguns d'aquests camps són:

  • volatile long state: conté l'estat del procés.
       volatile long state ;/ * -1 no executable, 0 executable, 0 parat * /
       volatile long state; / * -1 no executable, 0 executable, 0 parat * /
       # Define TASK_RUNNING 0 / * Llest, execució * /
       # Define TASK_INTERRUPTIBLE 1 / * Dormit (bloquejat). Admet senyals * /
       # Define TASK_UNINTERRUPTIBLE 2 / * Bloquejat però només respon al senyal o interrupció que espera. * /
       # Define TASK_ZOMBIE 4 / * Esperant un wait () * /
       # Define TASK_STOPPED 8 / * SIGSTOP, SIGTSMP, SIGTTIN, SIGTTOU. Depuració * /
       # Define TASK_EXCLUSIVE 32
  • int sigpending: un valor diferent de zero (típicament 1) indica si el procés té senyals pendents. Es reacciona a aquests senyals en tornar d'una trucada al sistema, o d'un bloqueig o suspensió.
  • mm_segment_taddr_limit: indica la mida màxima de l'espai d'adreces del procés. El valor típic és de 3GB per processos d'usuari i 4GB per als fils d'execució del nucli.
  • volatile long need_resched: amb el seu valor a 1 indica que aquest procés, possiblement, ha d'abandonar la CPU i per tant s'haurà invocar el planificador en el moment adequat (en comptes de cridar a schedule () directament).

Altres camps que contenen informació general del procés són:

  • int exit_code, exit_signal: conté el valor de terminació d'un procés, en el cas que hagi finalitzat mitjançant la crida al sistema exit (2). Si acaba per un senyal, contindrà el nombre de senyal que el va matar.
  • struct task_struct * p_opptr, * p_pptr, * p_cptr, * p_ysptr, * p_osptr: Punters per accedir a tota la família de processos: op (Original Parent), p (Parent), c (Youngest Child), is (Younger sibling, el teu germà immediatament més jove), us (Older sibling, germà directament més vell).
  • long start_time: Indica l'instant de creació d'aquest procés.
  • uid_tuid, euid, suid, fsuid; Usuari propietari d'aquest procés, tant real (uid), com efectiu (euid), i atributs més específics.
  • gid_tgid, egid, sgid, fsgid: Grup propietari d'aquest procés, tant real (gid), com efectiu (egid), i atributs més específics.
  • unsigned long blocked: Conté un mapa de bits amb els senyals que estan temporalment bloquejades.
  • struct sigpending pending: Conté la informació sobre els senyals que aquest procés té pendents.