先给出图,然后我将根据图来讲解二者的关系:
线程ID
在使用线程前,我们需要链接线程的pthread第三方库,在Linux中,第三方库被加载到PCB进程中的虚拟地址空间中的栈区与堆区之间的共享区。
我们所创建线程的控制块即维护线程的内容都存在pthread第三方库中,当我们创建线程时候大致的流程如下:
1.磁盘将pthread库加载到物理内存中
2.通过页表映射(不是拷贝!!!)到进程地址空间中的共享区,因为是映射,所以每个进程共用一份pthread库。
3.pthread库中存在很多线程的控制块struct pthread,每个块中都保存了维护这个线程内容,比如线程的私有栈(main函数即主进程用的栈不是这里的,而是地址空间中的主进程栈,就是我们平时说的栈区)
4.我们主进程创建了新线程,通过什么来找到我们唯一的线程呢?答:通过线程ID!!而线程ID存在哪里呢?答:存在pthread库中!!
我们用户所看到的线程ID号其实是物理内存中pthread库通过页表映射到地址空间当中的虚拟地址!!
总结,线程ID是一个被映射进当前进程地址空间的,pthread库当中的内部的一个地址数据,用它来充当线程ID。在用户层上这个线程内部包含了线程的私有栈,线程局部各种存储(包括描述线程的各种结构都在这里保存)因此,我们只要拿到了线程ID就可以拿到该线程的所有用户级数据!!
线程ID与内核LWP的关系
总结:在Linux中,每个线程与内核中的LWP是1:1对应关系,每个线程控制块中都存在一个与之相对应的存在于内核中的LWP!
就好比FILE文件中一定存了他的文件描述符