任务管理
本章介绍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
向内核线程发送请求