2013-03-24 60 views
17

閱讀this經過這麼問我有幾個疑問。請幫助理解。是否linux的調度進程或線程?

調度涉及決定何時運行過程和時間什麼量。

  1. Linux內核調度線程或進程嗎?由於進程和線程在內核中沒有區別,調度程序如何處理它們?

  2. 量子如何爲每個線程的決定? a。如果時間(100us的說),量子決定的過程是得到該過程的所有線程間共享?或 灣每個線程的量子是由調度器決定的?

注意:問題1和問題2是相關的,可能看起來相同,但只是想澄清事情的工作原理。

回答

24

Linux調度(最近的Linux內核,例如3.0至少)是調度調度任務或簡單地任務

甲任務可以是:

  • 單線程處理(例如通過fork創建沒有任何線程庫)
  • 一個多線程進程(包括其主線程)內的任何線程,特別是POSIX線程(並行線程)
  • 核心任務,這是在內核內部開始,並留在內核土地(如kworkernfsiodkjournaldkauditdkswapd等等...)

換句話說,多線程進程內的線程調度像非線程-i.e.單線程進程。

低級clone(2)系統調用創建用戶域調度任務(和可既用於創建fork -ed處理或執行的線程庫,像並行線程)。除非您是低級別線程庫實現者,否則不需要直接使用clone。 AFAIK,對於多線程進程,內核(幾乎)不調度進程,而是每個單獨的線程(包括主線程)。

其實,有在調度線程組的一些概念和affinity,但我不知道他們很好

這些天來,處理器具有一般超過一個核心,每個核心運行任務(在某個給定的瞬間),所以你有幾個任務並行運行。

CPU量子次給予任務,而不是處理

+0

人說Linux的調度過程,同時窗口調度線程。這是什麼意思?根據這個答案,它看起來像Linux調度任務(可以被視爲線程),而Windows也是如此。或者我錯過了什麼? – prasannatsm 2013-03-25 06:03:03

+1

@prasannatsm:我不知道Linux,但Windows肯定只調度線程。在任何時間表操作期間,Windows將從具有處理器關聯性的所有正在運行的線程的列表中選擇一個「下一個線程」,並且會切換到上下文。除了執行CR3切換之外,調度程序不會爲了選擇要在內核上運行的下一個線程而查看進程。 – SecurityMatt 2013-03-26 00:45:45

2

的NPTL實施POSIX螺紋規格看到線程作爲內部內核不同的工藝中,具有獨特task_struct(因此pid太),以便每個線程調度中本身如上所述。因此,每個線程都有自己的時間片,並按照上面提到的過程進行安排。

只需添加,目前的Linux調度程序不僅能夠調度單個任務(一個簡單的進程),還能夠調度一組進程甚至用戶(所有進程,屬於一個用戶)作爲一個整體。這允許實現組調度,其中CPU時間首先在進程組之間分配,然後在這些組內分配到單個線程。

Linux線程不直接在進程或線程上運行,但與可調度實體一起使用。由struct sched_entity代表。 可以公平地說,每個進程/線程都是sched_entity,但相反可能不是真實的。

要知道工序詳細調度,是指here