Linux 内核线程如何被访问?
由于内核线程是具有各种共享部分的独立任务,因此自然而然地会产生一个问题:线程如何与父进程关联,以及如何访问它们? 似乎有两种方法:通过语言或通过内核。
语言访问
有几种语言本身就支持线程,例如:Modula-3、Java、Python 1.4、Smalltalk/X、Objective-C/Gnustep 和 Ada。 每种语言都有语言元素来编程/访问各个线程。 所有这些语言都可供 Linux 社区使用。 然而,它们仅支持用户线程;没有对新的 Linux 内核进行 "clone()" 调用。 然而,似乎有人正在努力修改这些语言以支持更新的内核。
内核访问
每个 PID 都是 32 位的,对于非常旧的软件,会在 30000 处回绕(取模)。 如果没有使用 CLONE_PID,则每个线程都将像任何其他进程一样获得自己的 PID。 但是,如果要共享 PID,则内核会使用高 16 位来分配线程 ID (TID) [请注意,这可能不在 2.0.* 内核版本中;我们肯定会在 2.1.* 中看到它。]
此外,每个进程至少有一个线程(父线程)。 每个线程将被分配一个 TID,从 1(父线程)开始。 TID 为 0(例如 0x0000FFFF 掩码)将寻址进程内的所有线程。 假设一个应用程序有三个线程(父线程和两个任务管理器),并且这些线程共享父进程的 PID。 假设,每个线程的 PID 可能分别是 0x00011234(父线程)、0x00021234(子线程 #1)和 0x00031234(子线程 #2)。 可以单独访问或向每个线程发送信号,或者可以使用 0x00001234 寻址整个任务(请注意,前四位是零,用于屏蔽 TID)。
目的是使长格式能够与现有应用程序一起使用。 并且,发出整个任务信号的旧应用程序仍然可以工作(通过一次访问整个任务)。 然而,已经提出了一种简写形式:PID.TID(例如,46.2 将是 PID 46 的第二个线程)。
|
|
|
|
|
[上一页] | [首页] | [词典] | [邮件作者] | [下一页] |