Diferencia entre revisiones de «Processos en Linux»

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda
(Página creada con « Relacionat: Gestió de processos, Linux, Gestió de memòria, Gestió de E/S, Processos en Linux En tot sistema operatiu un procés està representat ...»)
 
Sin resumen de edición
Línea 1: Línea 1:
  Relacionat: [[Gestió de processos]], [[Linux]], [[Gestió de memòria]], [[Gestió de E/S]], [[Processos en Linux]]
  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 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 unió 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.Con 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).
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;
     union task_union struct task_struct task;
     unsignedlong stack [INIT_TASK_SIZE / sizeof (long)];
     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.
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).


    La taula hash és usada per trobar ràpidament una tasca pel seu pid fent servir find_task_pid ().
* long start_time: Indica l'instant de creació d'aquest procés.
    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.


    static inline struct task_struct * find_task_by_pid (int pid)
* uid_tuid, euid, suid, fsuid; Usuari propietari d'aquest procés, tant real (uid), com efectiu (euid), i atributs més específics.
    $ \ Lbrace $


        struct task_struct * p, ** htable = pidhash [pid_hashfn (pid)];
* gid_tgid, egid, sgid, fsgid: Grup propietari d'aquest procés, tant real (gid), com efectiu (egid), i atributs més específics.
        / * Es recorren els elements el
        valor donat per la funció hash és
        el mateix. Són les anomenades col · lisions * /
        for (p = * htable, p p-pid! = pid, p = p-pidhash_next);
        return p;


    $ \ Rbrace $
* unsigned long blocked: Conté un mapa de bits amb els senyals que estan temporalment bloquejades.


En cas de col · lisió a la taula hash, s'usa encadenament. Les tasques a cada llista ordenada (és a dir, ordenades pel mateix valor donat per la funció hash) són enllaçades per p-> pidhash_next / pidhash_pprev el qual és usat per hash_pid () i unhash_pid () per inserir i treure un procés donat en la taula hash. Això és realitzat sota la protecció d'un spinlock 4 read / write ja que un accés no controlat a la taula hash podria portar conseqüències desatrosas.Nótese que l'ús de semàfors no seria suficient per proporcionar protecció en cas de múltiples CPU s.
* struct sigpending pending: Conté la informació sobre els senyals que aquest procés té pendents.

Revisión del 12:35 23 oct 2012

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.