線程的調度,優先級和親緣性

           首先說明下WINDOWS是一個強佔式的操作系統 ,WINDOWS會每隔20MS左右就查看線程內核對象,找出某個優先級高的可調度線程進行執行,並將內核對象中的上下文放置到CPU寄存器中。還有一種操作系統是實時性的,比如LINUX,意思是能夠讓某個線程在特定時間運行,運行多久,但是這種操作系統要求明確的知道它在什麼硬件上運行。而WINDOWS是被設計成能在各種不同的硬件上運行,所以WINDOWS不是實時的。

1.暫停和恢復線程運行

 

  • 暫停線程運行:DWORD SuspendThread(HANDLE  hThread)

 

這個函數要小心使用。因爲會發生死鎖或者線程同步的問題。這裏順便說下暫停進程運行。暫停進程運行不是一件容易的事,因爲暫停進程意味着暫停進程中所有線程,而在暫停進程中某個線程的時候很可能發生有另一個線程創建了一個新的線程,而這個新的線程,你的程序將一無所知,所以你暫停不了它。這樣很可能導致進程的數據破壞

    • 睡眠線程:VOID Sleep(DWORD dwMilliseconds)

調用這個函數可使線程暫停自己的運行,知道dwMilliseconds過去爲止。調用這個函數會發生:

  • 使線程自願放棄擁有的時間片
  • 系統將在大約的指定毫秒數內使線程不可調度。不錯,如果告訴系統,想睡眠100ms,那麼可以睡眠大約這麼長時間,但是也可能睡眠數秒鐘或者數分鐘。記住, Wi n d o w s不是個實時操作系統。雖然線程可能在規定的時間被喚醒,但是它能否做到,取決於系統中還有什麼操作正在進行。
  • 可以調用S l e e p,並且爲d w M i l l i s e c o n d s參數傳遞I N F I N I T E。這將告訴系統永遠不要調度該線程。這不是一件值得去做的事情。最好是讓線程退出,並還原它的堆棧和內核對象。
  • 可以將0傳遞給S l e e p。這將告訴系統,調用線程將釋放剩餘的時間片,並迫使系統調度另一個線程。但是,系統可以對剛剛調用S l e e p的線程重新調度。如果不存在多個擁有相同優先級的可調度線程,就會出現這種情況。
    • 轉換到另一個線程: BOOL SwitchToThread()
    • 計算線程/進程的運行時間可以調用GetThreadTime/GetProcessTime。詳細見MSDN

2.關於環境結構CONTEXT。CONTEXT結構其實是記錄着CPU的寄存器的信息。因爲是和CPU直接接觸,所以說CONTEXT結構其實是特定於CPU的。CONTEXT結構分爲幾個部分。CONTEXT_CONTROL包含C P U的控制寄存器,比如指令指針、堆棧指針、標誌和函數返回地址。C O N T E X T _ I N T E G E R用於標識C P U的整數寄存器。C O N T E X T _ F L O AT I N G _ P O I N T用於標識C P U的浮點寄存器。C O N T E X T _ S E G M E N T S用於標識C P U的段寄存器(僅爲x 8 6處理器)。CONTEXT_DEBUG_ REGISTER用於標識C P U的調試寄存器(僅爲x 8 6處理器)。CONTEXT_EXTENDED_ REGISTERS用於標識C P U的擴展寄存器(僅爲x 8 6處理器)。

BOOL GetThreadContext(HANDLE hThread,PCONTEXT pContext)可以得到當前CPU的狀況

plus:在調用這個函數之前最好SuspandThread。還有就是要初始化Context.ContextFlag成員,告訴函數你想得到哪些Context。這個值可以設置爲CONTEXT_CONTROL,CONTEXT_FULL等。

CPU Type Definition of CONTEXT_FULL
x86 CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS
Alpha CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER

同樣的,通過調用SetThreadContext來設置CPU的寄存器值

3。線程的優先級。

 WINDOWS中每個線程都被賦予予一個從0(最低)到3 1(最高)的優先級號碼。WINDOWS還提出了一個新概念就是優先級類,這個類是和進程聯繫起來的。優先級類有5種:

Priority Class Description
Real-time The threads in this process must respond immediately to events in order to execute time-critical tasks. Threads in this process also preempt operating system components. Use this priority class with extreme caution.
High The threads in this process must respond immediately to events in order to execute time-critical tasks. The Task Manager runs at this class so a user can kill runaway processes.
Above normal The threads in this process run between the normal and high priority classes (new in Windows 2000).
Normal The threads in this process have no special scheduling needs.
Below normal The threads in this process run between the normal and idle priority classes (new in Windows 2000).
Idle The threads in this process run when the system is otherwise idle. This process is typically used by screensavers or background utility and statistic-gathering software.

 還有一個概念就是相對線程優先級。顧名思義就是某個線程相對與進程優先級類的優先級別,也有5種:

Relative Thread Priority Description
Time-critical Thread runs at 31 for the real-time priority class and at 15 for all other priority classes.
Highest Thread runs two levels above normal.
Above normal Thread runs one level above normal.
Normal Thread runs normally for the process's priority class.
Below normal Thread runs one level below normal.
Lowest Thread runs two levels below normal.
Idle Thread runs at 16 for the real-time priority class and at 1 for all other priority classes.

那麼WINDOWS爲什麼不直接讓程序員給他們的線程設置優先級別呢?比如15,20。原因是隨着時代的發展,用戶對應用程序的要求也是要改變的,所以優先級不能一成不變。比如以前對3D類程序就不分配高的優先級,因爲那個時候大家對3D的效果不需要太高,而現在隨着遊戲的發展,3D也成了OS用戶迫切需要的,而且要求OS處理的很好。所以,WINDOWS爲了讓自己的具有更高的維護性,就給用戶程序員提供了抽象的優先級類,以便以後的WINDOWS的維護方便。

設置程序的優先級有以下幾種方法:

  • 設置進程優先級
    • BOOL SetPriorityClass(HANDLE hThread,DWORD fdwPriority)
    • 將CreateProcess的fdwCreate參數傳遞需要的優先級類。這些優先級類的宏這些:
  • 設置線程的相對優先級
    •  BOOL SetThreadPriority(HANDLE hThread,int nPriority)

下面把進程優先級類和線程相對優先級宏列出來:

 

Priority Class

Symbolic Identifiers
Real-time REALTIME_PRIORITY_CLASS
High HIGH_PRIORITY_CLASS
Above normal ABOVE_NORMAL_PRIORITY_CLASS
Normal NORMAL_PRIORITY_CLASS
Below normal BELOW_NORMAL_PRIORITY_CLASS
Idle IDLE_PRIORITY_CLASS

 

Relative Thread Priority

Symbolic Constant
Time-critical THREAD_PRIORITY_TIME_CRITICAL
Highest THREAD_PRIORITY_HIGHEST
Above normal THREAD_PRIORITY_ABOVE_NORMAL
Normal THREAD_PRIORITY_NORMAL
Below normal THREAD_PRIORITY_BELOW_NORMAL
Lowest THREAD_PRIORITY_LOWEST
Idle THREAD_PRIORITY_IDLE
發佈了48 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章