• 进程运行状态转变过程

    进程运行状态转变过程

    分析完从进程/线程从创建到退出的整个过程,我们需要在从全局的角度来看看进程/线程在做整个运行过程中的运行状态转变过程。在执行状态转变过程中,ucore在调度过程总,并没有区分线程和进程,所以进程和线程的执行状态转变是一致的,分析的结果适合用户线程和用户进程的执行过程。

    首先为了描述进程/线程的整个状态集合,ucore在kern/process/proc.h中定义了进程/线程的运行状态:

    1. // process's state in his life cycle
    2. enum proc_state {
    3. PROC_UNINIT = 0, // uninitialized
    4. PROC_SLEEPING, // sleeping
    5. PROC_RUNNABLE, // runnable(maybe running)
    6. PROC_ZOMBIE, // almost dead, and wait parent proc to reclaim his resource
    7. };

    这与操作系统原理讲解的五进程执行状态相比,少了一个PROC_RUNNING态(表示正在占用CPU执行),这是由于在ucore中,用current(基于proc_strcut数据结构)进程控制块指针指向了当前正在运行的进程/线程PROC_RUNNING态,所以就没必要再增加一个PROC_RUNNING态了。那么那些事件或内核函数会触发状态的转变呢?通过分析uore源码,我们可以得到如下表示:

    0_5

    当父进程得到子进程的通知,回收完子进程控制块所占内存后,这个进程就彻底消失了。我们也可以用一个类似有限状态自动机来表示状态的变化:(需要用visio重画)

    1. process state changing:
    2. alloc_proc RUNNING
    3. + +--<----<--+
    4. + + proc_run +
    5. V +-->---->--+
    6. PROC_UNINIT -- proc_init/wakeup_proc --> PROC_RUNNABLE -- try_free_pages/do_wait/do_sleep --> PROC_SLEEPING --
    7. A + +
    8. | +--- do_exit --> PROC_ZOMBIE +
    9. + +
    10. -----------------------wakeup_proc----------------------------------