(莱昂氏unix源代码分析导读-10)系统初启(3)

接下来我们将开始了解操作系统中最重要的概念——进程。正如书中所言,为进程给出一个确切的定义是十分困难的。

我们会不断的通过代码去了解进程,直到对其有一个较清晰的认识。

 

首先,要解决生存还是毁灭的大问题。即进程存在的标志是什么——我们怎末确定一个进程是否存在?

很简单,正如莱昂在书中强调的那样,每个进程都有其“私有的空间”——即PPDA所在的kernel pagekernel page #6)。

当分配了一个新的Kernel page #6PPDA),则就诞生一个新进程。

 

除了PPDA外,系统还为每个进程准备了一个表格,即“进程描述表”,每个进程都将

占据其中一个表项。同PPDA不同,进程描述表是静态在数据结构,它常驻内存,不会被

swap出去。进程描述表在结构如下所示:

0358 struct proc

0359 {

0360        char p_stat;

0361        char p_flag;

0362        char p_pri; /* priority, negative is high */

0363        char p_sig; /* signal number sent to this process */

                ……

0371       char p_addr;                           /记录该进程“私有page”的开始block

0376 } proc[NPROC];

 

在这里我们先了解其中的小部分:

(1)         p_addr ——进程私有空间的起始block号;

(2)         p_stat ——进程的状态,共有以下几种:

                     0382: #define SSLEEP 1 /* sleeping on high priority */

                    0383: #define SWAIT 2 /* sleeping on low priority */

                    0384: #define SRUN 3 /* running *

                   0385: #define SIDL 4 /* intermediate state in process creation */

                   0386: #define SZOMB 5 /* intermediate state in process termination */

                   0387: #define SSTOP 6 /* process being traced */            

 

                 我们目前只需了解:

                  (1)         SRUN状态:进程正在执行;

                  (2)         SSLEEPsleep on high priority

                   (3)         SWAITsleep on low priority

                                23的区别在于对signal是否要进行处理,目前,先有个概念就好。

 

(3)         p_flag——进程的flag,有如下几种:

                  0391: #define SLOAD 01 /* in core */

                  0392: #define SSYS 02 /* scheduling process */

                  0393: #define SLOCK 04 /* process cannot be swapped */

                  0394: #define SSWAP 010 /* process is being swapped out */

                  0395: #define STRC 020 /* process is being traced */

                  0396: #define SWTED 040 /* another tracing flag */

                 目前,只知道SLOADSSYS就好。     

 

(4)         p_sig——进程优先级。值越小优先级越高,可以为负值。

                  当优先级<0时,往往可以无视signal的存在。

 

(5)         p_pid——进程id

(6)         p_ppid——进程的父进程的进程id

 

启动进程接下来就会占用表项#0(因此可称之为#0号进程),并进行设置。

 

1585 /*

1586 * set up system process

1587 */

1588

1589 proc[0].p_addr = *ka6;                     /建立proc[]ppda间的双向链接

1593 u.u_procp = &proc[0];                      /……

1590 proc[0].p_size = USIZE;                   /#0进程的“私有空间”长度(单位:block,即64bytes

1591 proc[0].p_stat = SRUN;                   /进程状态:SRUN(正在运行)

1592 proc[0].p_flag =| SLOAD|SSYS;       /进程FlagLoad

1594

1610 * set up ’known’ i-nodes  

1611 */

1612  

1613 cinit();                                                /字符缓冲区初始化

1614 binit();                                                /block缓冲区初始化

1615 iinit();                                                / root文件系统初始化等 

         以上三个初始化过程,会在相关的章节内详细介绍。

 

1616 rootdir = iget(rootdev, ROOTINO);       /root目录设置

1617 rootdir->i_flag =& ~ILOCK;           

1618 u.u_cdir = iget(rootdev, ROOTINO);     /current目录设置

1619 u.u_cdir->i_flag =& ~ILOCK;

1620

1621 /*

 

博客地址:http://blog.csdn.net/cszhao1980

博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html

你可能感兴趣的:((莱昂氏unix源代码分析导读-10)系统初启(3))