第九章执行绪在伫列之间的转换分析.docVIP

  • 1
  • 0
  • 约6.51千字
  • 约 9页
  • 2017-09-14 发布于辽宁
  • 举报

第九章执行绪在伫列之间的转换分析.doc

第九章执行绪在伫列之间的转换分析

第九章 執行緒在佇列之間的轉換分析 第三章列出了Windows CE執行緒在排程時的幾個主要函數,在本章中將藉著分析這些函數的流程,來了解執行緒在排程過程中的行為。本章所節選的程式碼全部來自[CEROOT]\PRIVATE\WINCEOS\COREOS\NK\KERNEL目錄下的 schedule.c檔,由於程式碼在第三章已詳細列出,所以本章除了一些重要的分析之外,其它程式碼均省略。 9.1概述 Windows CE是一個即時的作業系統 (real-time operating system),在這裡我們將會討論即時執行緒搶佔處理器的情況。當一個優先權較高的執行緒處於可執行狀態時,它將搶佔處理器資源;也就是說,正在執行的執行緒將轉到可執行狀態,並且不再佔有處理器資源,而由優先權高的執行緒佔用,直到這個高優先權的執行緒執行一定的時間後,如time slice用完,或者優先權降低,才會重新考慮讓先前讓出處理器資源的執行緒重新執行。實際上,執行緒有以下狀態: RUNSTATE_RUNNING 正在執行 RUNSTATE_RUNNABLE 可以執行 RUNSTATE_BLOCKED 可執行態的停滯態,可能是自願進入停滯態 RUNSTATE_NEEDSRUN 即將進入可執行狀態 WAITSTATE_SIGNALLED 等待某個信號的喚醒 WAITSTATE_PROCESSING 重新處理等待態 WAITSTATE_BLOCKED 等待狀態的停滯態 大致上可以分為,執行態、可執行態、停滯態(睡眠態),上面是再細分的狀態。如果不考慮細分的狀態,我們可以得到執行緒排程的基本切換條件,如圖9.1所示: 圖9.1 執行緒的狀態切換 我們可以用書中介紹的偵錯工具在程式碼中設定中斷點,然後一步一步追蹤在處理程序排程和切換過程中Windows CE程式碼的執行流程,也會得到類似的狀態圖。 上面介紹的是概略的狀態切換圖,那麼在實際切換過程中,例如從一種狀態轉換到另一種狀態時,實際上必須要做哪些事情呢?下面我們將結合程式碼來做具體的說明。 9.2 具體分析 在狀態轉換的過程中,執行緒在不同的佇列之間切換,一個執行緒從一個佇列切換到另外一個佇列,也就是從前一個佇列中刪除掉,而加到另外一個佇列中去,在什麼情況下會導致執行緒從佇列中刪除呢?結合上面的狀態轉換圖,可以看出,如果執行緒被排程,也就是說當執行緒可以取得處理器資源,那麼該執行緒便從執行佇列中刪除。 同樣的,在睡眠佇列中的執行緒一定是等待某一個條件或某個事件發生才能執行的執行緒,如果這個執行緒從睡眠佇列中刪除,說明這個執行緒所等待的條件已被滿足,或者是等待的某個事件已經發生,因此執行緒可以就緒,伺機取得處理器資源了。這個執行緒自佇列中被刪除後,將處於可執行狀態。 9.2.1 MakeRun()函數分析 當一個執行緒被建立後,首先呼叫MakeRun這個函數來判斷是否執行,流程圖如圖9.2所示: 圖9.2 MakeRun 函數流程圖 在這個函數中首先檢查暫停次數,也就是一函数,流程图如下pth-bSuspendCnt這個參數,判斷系統中是否已有等待要執行的執行緒。如果有,表示目前有執行緒正在執行,那麼就停滯這個請求執行的執行緒。如果暫停次數為0,再進一步判斷是否有可執行的執行緒,或者執行緒本身即為系統中具有最高優先權的執行緒。如果執行緒本身就是最高優先權的執行緒,那麼就把請求的執行緒設為可執行,並且放置在可執行佇列的最前面,更新相應的資料。接下來,進一步判斷是否有別的執行緒正在執行,並確認目前的執行緒確實是系統中優先權最高的執行緒。函數中對應程式碼如下: if (!(pth2 = RunList.pRunnable) || (prio GET_CPRIO(pth2))) { //沒有其他可執行的執行緒或本身就是優先權最高的執行緒 //使目前執行緒位於可執行佇列的開頭並更新hash table pth-pPrevSleepRun = 0; if (pth-pNextSleepRun = pth2) { pth2-pPrevSleepRun = pth; } pth-pUpRun = pth-pDownRun = RunList.pHashThread[prio2] = pth; RunList.pRunnable = pth; // 判斷是否需要重新排程 if (!RunList.pth || (prio G

文档评论(0)

1亿VIP精品文档

相关文档