操作系统如何计算出调用GetCurrentThreadId()的线程的身份?

时间:2018-03-22 12:07:45

标签: multithreading operating-system kernel threadcontext

我试图了解操作系统如何确定哪个线程是当前线程(例如,当线程调用gettid()GetCurrentThreadId()时)。由于进程地址空间在所有线程之间共享,因此保留线程ID不是一个选项。它必须是每个线程独有的东西(即存储在其上下文中)。如果我是一名操作系统开发人员,我会将其存储在只能在内核模式下可读的内部CPU寄存器中。我google了很多,但没有找到任何类似的问题(好像它是非常明显的)。

那么如何在Linux或Windows等实际操作系统中实现呢?

3 个答案:

答案 0 :(得分:0)

我相信在这个问题中已经很好地解释了这一点:how kernel distinguishes between thread and process

如果您想了解更多信息,您还可以谷歌查看kernel task structure并查看有关用户空间中运行的每种流程类型的信息

答案 1 :(得分:0)

您正在寻找线程控制块(TCB)。

这是一个保存有关线程信息的数据结构。

这里可以找到关于这个主题的轻读材料: https://www.cs.duke.edu/courses/fall09/cps110/slides/threads2.3.ppt

但如果您对操作系统感兴趣,我建议您获取Andrew S. Tanenbaum的现代操作系统副本。

第2章第2.2节主题:

在用户空间中实现线程 - “在用户空间中管理线程时,每个进程都需要自己的私有 线程表来跟踪该进程中的线程。“

在内核中实现线程 - “内核有一个跟踪的线程表 系统中的所有线程。“

只是编辑,您可能还想阅读“调度”。一般来说,你可以说内核决定哪个线程/进程应该使用CPU。那么内核知道哪个线程/进程进行了系统调用。我不会详细说明,因为它取决于我们正在谈论的操作系统。

答案 2 :(得分:0)

您的问题的答案完全取决于系统。但是,大多数处理器对线程一无所知。他们只支持流程。线程通常由创建的共享相同地址空间的独立进程实现。

当您进行系统服务调用以获取线程ID时,它将以与系统服务相同的一般方式实现,以获取进程ID。想象一下获取进程ID函数如何在不支持线程的系统中工作。为了简单起见,让我们假设一个处理器。

您将拥有某种数据结构来表示当前进程,并且内核将具有一些识别当前进程的方法(例如,内核地址空间中指向该进程的指针)。在某些处理器上有一个当前任务寄存器,它指向由处理器规范定义的结构。操作系统通常可以将自己的数据添加到此结构的末尾。

所以现在我想升级这个操作系统来支持线程。为此,我必须有一个描述该线程的数据结构。在那个结构中,我有一个指向定义过程的结构的指针。

然后获取线程ID的工作方式与获取进程ID之前的工作方式相同。但是现在Get Process ID还有一个额外的步骤,我必须将线程转换为进程以获取其id(甚至可能包含在线程块中)。