-
Notifications
You must be signed in to change notification settings - Fork 19
进程管理模型概述
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 状态的进程,以此实现进程的时间片轮转调度。