android 活页夹驱动实现
android binder driver implementation
我正在学习活页夹驱动程序。它有一个结构 binder_thread
用于保存线程信息。我发现它使用分配了 current->pid
的 binder_thread.pid
来区分彼此。例如binder_get_thread
方法中,该字段用于判断当前线程是否已经添加到树中。
static struct binder_thread *binder_get_thread(struct binder_proc *proc)
{
struct binder_thread *thread = NULL;
struct rb_node *parent = NULL;
struct rb_node **p = &proc->threads.rb_node;
while (*p) {
parent = *p;
thread = rb_entry(parent, struct binder_thread, rb_node);
if (current->pid < thread->pid)
p = &(*p)->rb_left;
else if (current->pid > thread->pid)
p = &(*p)->rb_right;
else
break;
}
.....
}
但是据我所知,current->pid
是当前进程的id,怎么能用来区分线程呢?
这是一个有点令人困惑的术语,但在内核级别,每个线程都被分配了自己的 pid
值,该值唯一地标识了它。当一个进程启动时,它的第一个线程被赋予一个唯一的 pid
并且线程组 ID 被设置为相同的 pid
。当创建新线程时,它们会被赋予唯一的 pid
值但具有相同的线程组 ID,因此它们可以链接回其父线程。因此,您正在查看的这个 rb 树搜索代码将起作用,因为 current->pid
是当前正在执行的线程 ID,它正在与树中线程条目的 thread->pid
值进行比较。
paxdiablo 在这个 SO 问题中的回答更详细地解释了线程/进程 ID,如果您有兴趣:
If threads share the same PID, how can they be identified?
我正在学习活页夹驱动程序。它有一个结构 binder_thread
用于保存线程信息。我发现它使用分配了 current->pid
的 binder_thread.pid
来区分彼此。例如binder_get_thread
方法中,该字段用于判断当前线程是否已经添加到树中。
static struct binder_thread *binder_get_thread(struct binder_proc *proc)
{
struct binder_thread *thread = NULL;
struct rb_node *parent = NULL;
struct rb_node **p = &proc->threads.rb_node;
while (*p) {
parent = *p;
thread = rb_entry(parent, struct binder_thread, rb_node);
if (current->pid < thread->pid)
p = &(*p)->rb_left;
else if (current->pid > thread->pid)
p = &(*p)->rb_right;
else
break;
}
.....
}
但是据我所知,current->pid
是当前进程的id,怎么能用来区分线程呢?
这是一个有点令人困惑的术语,但在内核级别,每个线程都被分配了自己的 pid
值,该值唯一地标识了它。当一个进程启动时,它的第一个线程被赋予一个唯一的 pid
并且线程组 ID 被设置为相同的 pid
。当创建新线程时,它们会被赋予唯一的 pid
值但具有相同的线程组 ID,因此它们可以链接回其父线程。因此,您正在查看的这个 rb 树搜索代码将起作用,因为 current->pid
是当前正在执行的线程 ID,它正在与树中线程条目的 thread->pid
值进行比较。
paxdiablo 在这个 SO 问题中的回答更详细地解释了线程/进程 ID,如果您有兴趣: If threads share the same PID, how can they be identified?