2012-11-19 156 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的鏈接列表,它將對進程和線程進行說明。我希望他們能夠做得更清楚。謝謝。 –