1. 程式人生 > >三、處理機管理(四)--windows / linux 的程序及其排程

三、處理機管理(四)--windows / linux 的程序及其排程

  • windows的程序和執行緒

  1. 程序具有以下兩個基本特徵:(1)程序是系統進行資源分配的基本單位;(2)程序是系統進行處理機排程分派的單位。

  2. Windows Server 2008把這兩個特徵分開處理:程序擁有“資源擁有者”的特徵;執行緒擁有“排程和執行”的特徵。

  3. 執行緒是程序的一個實體,是程序中實施排程和處理機分派的基本單位。

  4. Windows Server 2008程序控制塊(EPROCESS)的基本內容:程序的ID、安全描述符、基本優先順序、記憶體管理資訊、執行時間、程序環境塊(PEB)、連結指標。

  5. Windows Server 2008執行緒控制塊的基本內容:執行緒的ID、動態優先順序、執行緒環境塊(TEB)、指向執行緒所屬程序的EPROCESS的指標、執行緒類別、執行時間、I/O資訊。

  6. 在Windows Server 2008中,程序有 就緒、執行、等待(阻塞)三種基本狀態; 執行緒有 就緒(Ready)、備用(Standby)、執行(Running)、等待(Waiting)、轉換(Transition)和終止(Terminated)六種可能的狀態。

  7. 使用系統呼叫 Create_Thread() 建立一個執行緒時,該執行緒處於“初始化”階段。

  8. 程序和執行緒的區別:(1)地址空間。不同程序的地址空間是相互獨立的,同一程序的各個執行緒共享同一個地址空間。因此,程序中的執行緒不可能被另一個程序所看見。(2)通訊關係。不同程序間的通訊,必須使用作業系統提供的程序通訊機制。同一程序的各個執行緒間的通訊,可以直接通過訪問共享的程序地址空間來實現。(3)排程切換。不同程序間的排程切換,系統要花費很大的開銷。同一程序的執行緒間的切換,無須轉換地址空間,顯然會減少很多的系統開銷。

  9. 在系統執行的過程中,以下四種情況會引起對執行緒的排程:(1)一個執行緒進入就緒狀態;(2)一個執行緒執行的時間片用完;(3)一個執行緒的優先順序被改變;(4)一個執行執行緒改變他對親和處理機的要求。

  10. 在Windows Server 2008裡,程序有四種優先順序:實時(Real-Time   預設取值24)、高(High  13)、普通(Normal  7或9)、空閒(Idle   4)。

  11. 在Windows Server 2008裡,一旦執行緒被建立,就取所屬程序的優先順序。執行緒的優先順序可以取0~31的值。(1)16個實時執行緒優先順序(16~31);(2)15個可變執行緒優先順序(1~15);(3)1個系統執行緒優先順序(0,零頁執行緒)

  12. 執行緒時間的配額,就是所謂的時間片,它不是一個時間的長度值,而是一個配額單位的整數。   執行緒執行時的時間配額,是由使用者在註冊時指定的。每個註冊項為6個二進位制位,分成3個欄位:(1)“時間配額長度”。取值為1 = 長時間配額;2 = 短時間配額;0或3 = 預設設定  (2)“前後臺變化”。1 = 要改變前臺執行緒的時間配額; 2 = 前後臺執行緒的時間配額相同; 0或3 = 預設設定(3)“前臺執行緒時間配額的提升”。 該欄位只能取值0/1/2。

  13. 執行緒排程的管理:(1)執行緒排程器就緒對列表。執行緒排在哪個就緒佇列裡,與它屬於哪個程序沒有關係。(2)就緒點陣圖;(3)空閒點陣圖。
  14. Windows Server 2008在下面5種情況下,會提升一個執行緒的當前優先順序。(1)某I/O操作完成之後;(2)所等待的事件或訊號量到來後;(3)前臺執行緒在等待結束後;(4)圖形使用者介面執行緒被喚醒後;(5)提高處理機飢餓執行緒的優先順序。
  15. 執行緒優先順序的提升,是以其基本優先順序為基點的。
  • Linux的程序及其排程

  1. 在linux裡,程序執行使用者程式時,其處於“使用者模式”;程序執行時出現系統呼叫或中斷事件,轉而去執行作業系統核心的程式時,處於“核心模式”。
  2. CPU執行使用者的程式,linux裡處理機處於“使用者態”;CPU執行作業系統的程式,處理機處於:核心態。
  3. 程序,通過系統呼叫 fork 命令建立, 通過系統呼叫 exec 命令執行一個新的程式, 通過系統呼叫 exit 命令終止執行。
  4. linux程序實體的組成:(1)程序控制塊(程序描述符):程序標識,程序狀態,程序排程資訊,接收的訊號,程序家族關係,程序佇列指標,CPU的現場保護區,與檔案系統有關的資訊;(2)程序專用的系統堆疊空間、(3)供程序執行的程式段(正文段)、(4)程序專用的資料段和使用者堆疊空間。
  5. linux的程序狀態:可執行狀態(TASK_RUNNING)、可中斷狀態(TASK_INTERRUPTIBLE)、不可中斷狀態(TASK_UNINTERRUPTIBLE)、暫停狀態(TASK_STOPPED)、僵死狀態(TASK_ZOMBIE)
  6. 在linux中,除了初始化程序外,其他程序都是用系統呼叫 fork() 和clone() 建立的。區別: fork() 建立的子程序把父程序的所有資源都繼承下來。 clone() 子程序只是有選擇的繼承父程序的資源。
  7. 建立的子程序要執行自己的程式時,通過系統呼叫 exec() 來完成。
  8. linux的程序排程。實時程序排程和非實時程序排程。
  9. linux程序描述符中與排程有關的欄位:(1)policy。程序排程欄位。可以取三個值:SCHED_FIFO實時程序的先進先出排程策略,搶佔式;SCHED_RR實時程序的輪轉排程,搶佔式;SCHED_OTHER非實時程序的輪轉排程;    (2)priority程序的優先順序    (3)rt_priority   實時程序的優先順序 (4)counter   時間片計數器
  10. linux的等待佇列,要弄到 wait_queue 結構。(1)next,指向下一個 wait_queue 節點。因此,linux裡面的每一個等待佇列都是由next連結而成的單鏈表;(2)task,指向程序 task_struct 結構的指標。

參考自《作業系統實用教程》