接下来我们将开始了解操作系统中最重要的概念——进程。正如书中所言,为进程给出一个确切的定义是十分困难的。
我们会不断的通过代码去了解进程,直到对其有一个较清晰的认识。
首先,要解决生存还是毁灭的大问题。即进程存在的标志是什么——我们怎末确定一个进程是否存在?
很简单,正如莱昂在书中强调的那样,每个进程都有其“私有的空间”——即PPDA所在的kernel page(kernel page #6)。
当分配了一个新的Kernel page #6(PPDA),则就诞生一个新进程。
除了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) SSLEEP:sleep on high priority
(3) SWAIT:sleep on low priority
2和3的区别在于对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 */
目前,只知道SLOAD、SSYS就好。
(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; /进程Flag:Load
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