Linux用户线程在内核中的表现

Linux用户线程在内核中的表现

原创:SoHo

本文试图解释Linux中用户线程创建和运行的原理,这里不涉及内核线程。

内核管理线程的结构

task_struct
线程所有相关信息,庞大

thread_info
线程少量相关信息,可以放进一个cache line

内核栈
线程在内核态运行时的栈,一般为2页,8KB

thread_info结构存放在内核栈顶,栈底地址为(thread_info+THREAD_SIZE-40),这里假设栈从底往顶升

第一个线程
第二只鸡由第一只鸡复制得来,第三只鸡由第二只鸡复制得来,依此类推,但是问题是:第一只鸡从哪里来?

在Linux系统中,第一个线程的task_struct为init_task,thread_info为init_thread_info,内核栈为init_stack,都是直接预留空间、直接初始化

子孙线程
系统中所有线程都是init_task的子孙,他们通过申请内存得到task_struct、thread_info和内核栈,且用其父进程的相应信息初始化,但是更改少量其特有的变量,如PID

fork与exec
fork用于创建子进程的task_struct、thread_info和内核栈,但是执行的代码和父进程一样

如果子进程希望执行其他代码,则需要调用exec
a      
我现在是只要可能就多看看多学学了