Linux 是如何調(diào)度進(jìn)程的?


點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。
點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。
調(diào)度的發(fā)展歷史

O(1) 調(diào)度器:


在 active bitarray 里,尋找 left-most bit 的位置 x。 在 active priority array(APA)中,找到對(duì)應(yīng)隊(duì)列 APA[x]。 從 APA[x] 中 dequeue 一個(gè) process,dequeue 后,如果 APA[x] 的 queue 為空,那么將 active bitarray 里第 x bit置為 0。 對(duì)于當(dāng)前執(zhí)行完的 process,重新計(jì)算其 priority,然后 enqueue 到 expired priority array(EPA)相應(yīng)的隊(duì)里 EPA[priority]。 如果 priority 在 expired bitarray 里對(duì)應(yīng)的 bit 為 0,將其置 1。 如果 active bitarray 全為零,將 active bitarray 和 expired bitarray 交換一下。
CFS 調(diào)度器:
權(quán)重 = 1024 / 1.25nice(次方)
虛擬時(shí)間 = 實(shí)際時(shí)間 * (1024/進(jìn)程權(quán)重) = (調(diào)度周期 * 進(jìn)程權(quán)重 / 所有進(jìn)程總權(quán)重) * (1024 / 進(jìn)程權(quán)重) = 調(diào)度周期 * 1024 / 所有進(jìn)程總權(quán)重
總結(jié):誰(shuí)的vruntime值較小就說(shuō)明它當(dāng)前占用cpu的時(shí)間較短,受到了“不公平”對(duì)待,因此下一個(gè)運(yùn)行進(jìn)程就是它。這樣既能公平選擇進(jìn)程,又能保證高優(yōu)先級(jí)進(jìn)程獲得較多的運(yùn)行時(shí)間。這就是CFS的主要思想了。
CFS維護(hù)了一個(gè)按照虛擬時(shí)間排序的紅黑樹(shù):

任務(wù)存儲(chǔ)在以時(shí)間為順序的紅黑樹(shù)中(由 sched_entity 對(duì)象表示),對(duì)處理器需求最多的任務(wù) (最低虛擬運(yùn)行時(shí))存儲(chǔ)在樹(shù)的左側(cè),處理器需求最少的任務(wù)(最高虛擬運(yùn)行時(shí))存儲(chǔ)在樹(shù)的右側(cè)。為了公平,調(diào)度器然后選取紅黑樹(shù)最左端的節(jié)點(diǎn)調(diào)度為下一個(gè)以便保持公平性。任務(wù)通過(guò)將其運(yùn)行時(shí)間添加到虛擬運(yùn)行時(shí), 說(shuō)明其占用 CPU 的時(shí)間,然后如果可運(yùn)行,再插回到樹(shù)中。這樣,樹(shù)左側(cè)的任務(wù)就被給予時(shí)間運(yùn)行了,樹(shù)的內(nèi)容從右側(cè)遷移到左側(cè)以保持公平。因此,每個(gè)可運(yùn)行的任務(wù)都會(huì)追趕其他任務(wù)以維持整個(gè)可運(yùn)行任務(wù)集合的執(zhí)行平衡。
推薦閱讀:
好玩、有趣的 Linux 命令學(xué)習(xí)神器 kmdr!
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取!!
