1

我有一个正在运行的进程,它创建了多个用户模式线程。如果内核将进程的状态更改为TASK_UNINTERRUPTIBLE(或TASK_INTERRUPTIBLE)进程创建的线程是否会自动挂起?

这不是一个家庭作业问题。我正在阅读一本描述如何实现信号量的操作系统书籍。在他们的实现中,信号量结构维护当前等待信号量的进程的链表。从我目前了解到的情况来看,这样的信号量只能用于同步进程,而不是线程。正确的?链表中的线程进入一种TASK_INTERRUPTIBLE状态,直到信号量可用,此时通过将其状态设置为 来唤醒一个进程TASK_RUNNING

4

1 回答 1

4

task在 Linux 中,每个线程都是在进程范围内单独运行的。见/proc/self/task/。它们甚至是使用与新进程相同的内核函数创建的。Linux 中的线程起源于“轻量级进程”。每个任务都有一个唯一的任务 id ( tid),类似于进程 id ( pid),实际上主线程(执行 main() 的线程)与tid进程相同pid

Linux 中线程和进程之间唯一的功能区别是所有线程(任务)共享所有进程资源,除了

  • 调度参数(包括TASK_UNINTERRUPTIBLE, TASK_INTERRUPTIBLE
  • 任务编号
  • 线程main()标识进程

因此TASK_INTERRUPTIBLE可以单独应用于每个线程。

因此,信号量非常适合用于同步线程。在这种情况下,如果一个线程阻塞在一个信号量上,那就是那个线程。

于 2012-11-19T19:19:59.827 回答