一、Unix系统 进程状态与状态转换
1. 用户态:
2. 核心态:
3. 内存中就绪:进程没有执行,但处于就绪状态,只要核心调度他,就可以执行。
4. 内存中睡眠:进程正在睡眠并且进程存储于内存中,没有被交换到对换设备。
5. 就绪且换出:进程处于就绪状态,但是对换进程(进程0)必须把它换入内存,核心才能再次调度它进行运行。
6. 睡眠且换出:进程正在睡眠,且被兑换进程换出内存。
7. 被抢先:进程从核心状态返回到用户态时,核心抢先与它,做了上下文切换,调度了另一个进程,原先这一个进程就处于被抢先状态。
8. 创建进程:进程刚被创建。该进程存在,但既不是就绪状态,也不是睡眠状态。这个状态是除了进程0以外的所有进程的最初状态。
9. 僵死状态:进程调用exit结束,进程不在存在,但在进程表项中仍有记录,该记录可有父进程收集。
进程状态转换图
注意:上面是进程状态的经典模型。现在的UNIX系统,很多不再是单一的兑换方式累管理存储的,大部分系统是用请求调页的方式管理存储,或者混合使用对换与请求调页两种方式,不过最典型的还是对换和请求调页。
二、进程控制
用户创建一个进程唯一的方法是使用系统调用fork。核心为完成系统调用fork要进行几步操作:
1. 为新进程在进程表中分配一个表项,系统对一个用户可以同时运行的进程数是有限的,对超级用户没有该限制,但也不能超过进程表的最大表项的数目。
2. 给子进程一个唯一的进程标识符PID,该进程标识符号其实就是该表项在进程表中的索引号。
3. 复制一个父进程的进程表项的副本给子进程。核心初始化子进程的进程表项时,是从父进程处拷贝的。所以子进程拥有与父进程一样的uid、euid、gid、用于计算优先权的nice值、当前目录、当前根、用户文件描述符表等。
4. 把与父进程相连的文件和索引节点表的引用数加1.这些文件自动的与该子进程相连。
5. 核心为子进程创建用户级上下文,核心为子进程的u区、区及辅助页表分配内存,并复制父进程的区内容。这样生成的是进程的静态部分;
6. 生成进程的动态部分,核心复制父进程的上下文的第一层,即寄存器上下文和核心栈,核心再为子进程虚设一个上下文层,这是为了子进程能“恢复”它的上下文。这时,该调用会对父进程返回子进程的pid,对子进程返回0.

没有评论:
发表评论