创建并执行用户线程

    为了支持用户线程,我们还需对现有的进程管理进行有限扩展,在了解线程基本原理的情况下,设计并实现ucore对用户线程的基本支持。

    概述

    proj12是lab3的最后一个project。它在proj10.1(中间还有proj10.2/10.3/10.4/11)的基础上实现了对用户线程的支持,主要参考了Linux的线程实现思路,把线程作为一个共享内存等资源的轻量级进程看待,扩展设计了进程控制块中支持用户线程的成员变量和与进程管理相关的系统调用,使得在现有进程管理的基础上,做相对较小的改动,就支持线程模型了。

    • kern/syscall.c:增加用于线程创建的sys_clone系统调用;
    • user/libs/*.[chS]:实现用户态创建线程的库调用函数、访问系统调用函数;

    首先确保proj12的kern/proc.c中的user_main函数中的代码为:

    编译并运行proj12的命令如下:

    这其实是ucore首先创建了一个用户进程usermain,然后此用户进程通过调用sys_execv执行的是users/threadtest.c中的代码:

    usermain用户进程调用了thread用户库函数来创建了一个用户线程test,这个用户线程同享了usermain用户进程的地址空间,然后usermain用户进程就调用thread_wait函数等待用户线程结束。用户线程test在结束执行时,会设置退出码为0xbee。用户进程usermain会检查此退出码,看用户线程是否结束。上述执行过程其实包含了对用户线程整个生命周期的管理。下面我们将从原理和实现两个方面对此进行进一步阐述。