熬之滴水成石:最想深入了解的内容--windows内核机制(6)
58 進程和線程(3)
說完進程再說說線程,線程相比于進程其實有更多可說的內容。首先實現線程調用的數據結構是個棧,該棧記錄了調用方法的信息這里面也包括了函數調用及返回的地址。線程肯定是屬于某個進程,其控制流可以訪問這個進程的資源,對于線程而言內存等數據都是共享的。一個進程可以有多個線程的,所以線程之間的通信還是比較方便,因為線程是共享資源的,所以多線程通訊的機制比起IPC機制更為方便。在OS的環境中,我們可以把線程分成用戶線程和內核線程。用戶線程的理解當放在OS的整體環境中還是比較好理解,你認為它就是OS提供的某個進程機制下的線程就可以了,因為用戶線程往往是受到了OS進程下的控制的為用戶開放的線程功能。用戶級線程的優勢就是因為它是為用戶級開放的,所以它的切換效率高。相比于用戶級的線程,內核級線程就顯得更為條條框框和規規矩矩了。由于OS對指令有完全的控制能力,所以內核線程是應用各種算法來處理分配處理器的時間。前一章,我們說到線程有優先級的概念,優先級高的肯定可以先執行,內核線程的好處就是在于它根本就不需要考慮在什么時候把控制權交給其他線程,從不擔心自己的處理時間片是否長了導致其它線程無法執行的問題。所以這一部分對于用戶是封閉的,內核會很好處理好線程之間與處理器的資源分配問題。還有一點須注意的是,線程是可以從內核模式轉向用戶模式,用戶模式也可以轉向內核模式的。但是這種模式的轉換是需要開銷的,這部分開銷也是可以完全接受的。
之前說了進程的調度算法,其實就是輪換,一個進程運行一段時間后歇菜換另一個進程執行。然而線程的調度算法又是怎樣了。在之前我們從課本上學過線程調度算法,從一個純理論的角度還是有一個大概的認識。基本上可以分為三種,一種為時間片輪詢調度算法:這個算法很好理解。就是cpu的處理時間被分成許多塊,然后采取輪詢的方法分配給每個線程,當線程獲取到時間片運行后就按照自己的過程方法執行下去,直到時間段完全用完,或者主動放棄執行。OS會在獲得時間片控制權后會控制下一個正在等待的線程。這種線程調度的機制是我們理解多線程并發最常見的思維方式,也是最為實用最為公平的調度處理資源的方式。隨著硬件越來越強,線程調度和切換的開銷也越來越小。另一種算法為優先級調度,原理也比較簡單就是賦予每個線程一個優先級的編號,高優先級的總是優先考慮被處理器執行,在處理這個優先級時OS會形成一個優先級的對列表,用來存儲滿足條件的線程,當一個線程用完了時間片或者主動放棄處理器執行權時,系統會選擇優先級高的線程作為下一個要運行的線程。優先級的調度方法實際上只是在輪詢的機制上加上了一個優先級編號的。最后一種方法就是先到先服務的算法,這個算法用到了隊列的數據結構先進先出的思想。所有的線程組成了一個隊列,最先進入隊列的線程最先獲得處理器的執行,如果執行完則放出隊列,如果沒有執行完自己又選擇暫停則又被放回隊列等待執行的。這種算法看似簡單,但是對于線程執行任務的時間長短并未作限制。相比之前集中算法,它還是凸顯出一些硬傷。windows的調度算法是前面集中方法的組合。可以說它是一個搶占式的,支持多處理器的調度算法。用鏈表的方式存儲每個處理器要處理的線程,不同優先級的線程分別屬于不同的鏈表。當一個線程滿足執行條件時,它首先被掛到當前處理器的一個待分配的鏈表中,然后在適當的時候將其放到某個處理器對應的優先級的鏈表中。當處理器在選擇線程執行時就會根據線程的優先級選擇線程。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (未完待續.............)
轉載于:https://www.cnblogs.com/suncoolcat/p/3424166.html
總結
以上是生活随笔為你收集整理的熬之滴水成石:最想深入了解的内容--windows内核机制(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb----集合而定多种查询方
- 下一篇: sharepoint 2007页面显示真