2012-11-19 158 views
0

我有一个正在运行的进程创建了多个用户模式线程。如果内核将进程的状态更改为TASK_UNINTERRUPTIBLE(或TASK_INTERRUPTIBLE),那么进程创建的线程是否会自动挂起?TASK_UNINTERRUPTIBLE和在Linux内核开发中使用C处理线程

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

回答

3

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

在Linux的线程和进程之间的唯一功能差异是,所有线程(任务)除了

  • 调度参数共享所有处理资源(包括TASK_UNINTERRUPTIBLETASK_INTERRUPTIBLE
  • 任务ID
  • main()线程标识进程

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

因为这样的信号量非常适合用于同步线程。在这种情况下,如果一个线程阻塞信号量,那么这是一个线程的理由。

+0

现在它是有道理的。我猜在本书的实现中,它们的链接进程列表可能是task_struct的链接列表,它将对进程和线程进行说明。我希望他们能够做得更清楚。谢谢。 –