Processos en Linux

De Jose Castillo Aliaga
Revisión del 12:26 23 oct 2012 de Admin (discusión | contribs.) (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 ...»)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda
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 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).

   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.
   static inline struct task_struct * find_task_by_pid (int pid)
   $ \ Lbrace $
       struct task_struct * p, ** htable = pidhash [pid_hashfn (pid)];
       / * 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 $

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.