back

Ecco come appariva il PCB nel primo Kernel di Linux (linux-0.01)[1]:

struct task_struct    {
	long state;     /*    Stato del processo, in principio poteva essere: */
	                /*    1 non eseguibile; 0 eseguibile; > 0 fermo       */
	long counter;   /*    Contatore interno al processo                   */
	long priority;  /*    Priorità associata al processo                  */
	long signal;    /*    Campo adibito alla gestione dei segnali         */
	                /*    (comunicazione interprocesso IPC)               */
	fn_ptr sig_restorer;  /*    Campo adibito alla gestione dei segnali   */
	                      /*    (comunicazione interprocesso IPC)         */
	fn_ptr sig_fn[32];    /*    Campo adibito alla gestione dei segnali   */
	                      /*    (comunicazione interprocesso IPC)         */                                     
	int exit_code;  /*    Stato di uscita del processo                    */
	                /*    (0 success, != 0 failure)                       */
	unsigned long end_code, end_data, brk, start_stack;
	                /*    Puntatori agli estremi delle locazioni in       */
	                /*    memoria di codice e dati                        */
	long pid, father, pgrp, session, leader;
	                /*    Fra i vari campi si identificano il pid         */
	                /*    (process id) e il pid del padre                 */
	unsigned short uid, euid, suid;    
	                /*    uid (user id) reale, effettivo e quello         */
	                /*    salvato al momento dell'avvio del processo      */
	unsigned short gid, egid, sgid;    
	                /*    gid (group id) reale, effettivo e quello        */
	                /*    salvato al momento dell'avvio del processo      */
	long alarm;     /*    In questo campo è possibile impostare           */
	                /*    il timer per il segnale SIGALRM                 */
	long utime, stime, cutime, cstime, start_time;    
	                /*    Statistiche temporali del processo              */
	unsigned short used_math;
/* file system info */
	int tty;	/*    Nome del terminale sul quale il processo è in   */
	                /*    esecuzione; - 1 se non appartiene a nessuno     */
	unsigned short umask;         /*    Maschera del processo             */
	struct m_inode * pwd;         /*    Percorso della directory in       */
	                              /*    cui il processo opera             */
	struct m_inode * root;        /*    Percorso della radice del         */
	                              /*    filesystem                        */
	unsigned long close_on_exec;
	struct file * filp[NR_OPEN];  /*    Elenco dei file aperti            */
/* ldt for this task 0 - zero 1 - cs 2 - ds&ss */
	struct desc_struct ldt[3];
/* tss for this task */
	struct tss_struct tss;        /*    Struttura in cui sono memorizzati */
	                              /*   i contenuti dei registri della CPU */
};

Agendo sulle singole variabili interne è possibile modificare radicalmente le proprietà del processo in esecuzione; per esempio intervenendo sul valore del campo "priority", attraverso la system call nice() (vedremo più avanti cosa sono le system call), si cambia la priorità associata al processo, mutando di conseguenza il comportamento dello schedulatore nei confronti dello stesso.

back