4 執行緒到底是如何排程和切換的?

2021-07-07 01:20:53 字數 1127 閱讀 7656

4.執行緒到底是如何排程和切換的?

本節內容將作為本篇文章最重要的部分來講述,源**才是我們的王道,在wrk-v1.2\base\ntos\ke\yield.c檔案裡,我們終於看到**了,需要說明的是這個部分並非是完整的排程,我們是從這個入手來看整個的過程,沒有源**的原理就是空中樓閣。

ntstatus  ntyieldexecution (void)

kirql oldirql;

pkthread newthread;

prkprcb prcb;

ntstatus status;

pkthread thread;

if (kigetcurrentreadysummary() ==0) else    //如果沒有執行緒準備好執行的話就向前找下乙個可以執行的執行緒

if ((newthread =prcb->nextthread) != null) else else else {

thread->state = deferredready;

thread->deferredprocessor = prcb->number;

//釋放鎖,放到準備好就緒佇列

kireleaseprcblock(prcb);

kideferredreadythread(thread);

#endif

return;

寫到這裡,你已經差不多能理解書上和資料上那些原理了,因為我已經把最核心的東西都解發布來了,而 kiswapcontext(thread, newthread);我們在很早以前就解釋,上下文切換,還記得嗎?關於執行緒排程到這裡我就差不多要結束了,最後我從巨集觀角度來講一下執行緒排程的問題。

1.windows核心嚴格按照優先順序排程。

2.同一優先順序按照順序執行。

3.每個正在執行的執行緒都有乙個時間片quantum,沒有被剝奪的情況下,就是自己一直執行下去直到時間用光,如果不是實時的執行緒的話,該執行緒的優先順序會逐步的降低,但是不會低於其基本優先順序。

4.如果執行緒在執行過程中被搶占了的話,將其掛到相應優先順序就緒佇列的頭部,否則掛到尾部。

5.執行緒執行中被搶占了的話,這種情況下,執行緒切換不會馬上切換,而要等待核心的級別降到dispatch_level級以下,這時候才能進行執行緒切換。

Handler到底是如何完成執行緒切換的?

handler到底是如何完成執行緒切換的?這個問題要從handler最初的用法和原理講起。首先我們列出正常情況下乙個handler使用的步驟然後講解分析如何實現,這裡不對一些基礎的概念做解釋,具體的請查閱原始碼。handler的使用步驟 1.呼叫looper.prepare 2.建立handler物...

Azure SQL的DTU和eDTU到底是個什麼鬼

可以從上表上對應於本地資料庫的效能採集的指標,可以估算出應該使用什麼樣級別的azure sql。當然服務層選擇後仍然可以進行更改。對於自己應用應該用多大規模的dtu,可以進行詳細的評估,可以使用下面工具 azure sql database dtu calculator 關於如何評估,且聽下回分解。...

黑帽技術到底是如何實踐的

黑帽seo技術之權重轉移 相信大家也看過乙個新站權重5的站,在此之前,筆者一直疑惑,其實這就是黑帽中的權重轉移,權重轉移是通過hack手法拿到權重高,比如 站長網 通過拿到站長網的許可權,在首頁加一段黑帽301權重轉移 從而把權重轉移到新站。大家都知道301是永久重定向,黑帽seo中的權重轉移就是利...