任务管理

本章介绍NUDT-OS的任务管理模块。

一、用户线程、内核线程、进程的关系

NUDT-OS中共有三种任务相关的数据结构:

  • 用户线程:一个用户进程中可能包含多个用户线程,每个用户线程共享进程的地址空间,有自己的独立的栈和线程函数

  • 内核线程:内核中有多个内核线程,包括内核服务线程、内核主线程和协程执行线程

  • 进程:用户态的每个进程拥有独立的地址空间和资源,每个进程加载一个elf文件执行,可以在进程中创建多个用户线程;内核态只有一个root进程,其只包含一个主线程,无限循环回收僵死进程

进程是内核资源分配的最小单位,每个进程拥有独立的地址空间和资源。线程是内核调度的最小单位,内核统一调度用户线程和内核线程(具体策略是有内核服务线程有未完成的服务时,优先执行内核服务线程,无需服务时才调度用户线程)。

二、进程相关系统调用

pub fn sys_fork() -> isize

复制当前线程所在进程,父进程返回子进程的pid,而子进程返回0

pub fn sys_exec(path: *const u8, args: *const *const u8) -> isize

当前线程所在进程入口设置为elf文件入口

pub fn sys_waitpid(pid: isize, exit_code_p: *mut u32) -> isize

回收子进程

三、用户线程相关的系统调用

pub fn sys_exit(exit_code: i32) -> !

当前线程主动退出

pub fn sys_yield() -> isize

当前线程主动放弃CPU

pub fn sys_getpid() -> isize

获取当前线程所在进程的pid

pub fn sys_waitpid(pid: isize, exit_code_p: *mut u32) -> isize

等待一个线程结束(同一进程中的主线程使用)

pub fn sys_thread_create(entry: usize, arg: usize)

创建一个线程,返回线程tid

四、内核线程相关系统调用

pub fn sys_kthread_req(kthread: Arc<Kthread>, ctrl_ptr: usize, buf_ptr: usize) -> isize

向内核线程发送请求