Skip to content

进程管理模型概述

Kangxu Liu edited this page Jun 27, 2016 · 2 revisions

在我们移植的来源 MIPS 版 JOS 中,进程管理与调度的实现简洁易懂,在此,我们将简要描述我们移植后的进程管理模型,有关细节,请参考本节 Wiki 中的其他文章。

在我们的 RPS 中,进程的核心是 Env 结构体,其位于 lib/include/env.h 中的定义如下:

struct Env
{
    struct Trapframe env_tf;            // Saved registers
    LIST_ENTRY(Env)  env_link;          // Free list
    u_int            env_id;            // Unique environment identifier
    u_int            env_parent_id;     // env_id of this env's parent
    u_int            env_status;        // Status of the environment
    Pte              *env_ttbr0;        // Address of page dir
    
    // belows are for ipc
    u_int            env_ipc_value;     // data value sent to us
    u_int *          env_ipc_value_adr; //
    u_int            env_ipc_from;      // envid of the sender
    u_long *         env_ipc_from_adr;  // 
    u_int            env_ipc_recving;   // env is blocked receiving
    u_long           env_ipc_dstva;	    // va at which to map received page
    u_int            env_ipc_perm;	    // perm of page mapping received
    u_int *          env_ipc_perm_adr;  //
};

其中,env_tf 用于保存进程的运行时上下文(通用寄存器、ELR、SP等),env_id 用于保存当前进程 ID,env_parent_id 用于保存当前进程父进程 ID(若父进程不存在则为 0),env_status 用于保存当前进程状态(FREE、RUNNABLE、NOT_RUNNABLE),env_ttbr0 用于保存当前进程页表基地址的物理地址。

系统启动时,调用 lib/env.c 中的 env_init 函数来初始化空闲 Env 列表 env_free_list。随后,可调用 lib/env.c 中的 env_create 来将 ELF 文件加载至内存,并作为进程进行调度执行。

每个时间片结束时,时钟中断处理程序设置下一次中断,并调用位于 lib/sched.c 中的 sched_yield(void) 函数来选择并运行下一个处于 RUNNABLE 状态的进程,以此实现进程的时间片轮转调度。

Clone this wiki locally