国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

進程調度:我太難了!

系統 Linux
本文講述的進程調度模型其實就是Linux中O(1)調度算法和CFS(完全公平調度算法)調度算法的雛形,為了便于理解,文中進行了一定程度的簡化。

1. 任務切換

現在有一塊CPU,但是有兩個程序都想來執行,我們需要開發一個任務調度程序。

只有兩個程序,so easy啦!讓它們交替執行就行了。

為了實現切換,我們提供一個API,這兩個程序執行一會兒就主動調用一下這個API,然后在這個API內部實現任務的切換。

所謂的切換,其實就是把當前進程的上下文(也就是CPU一堆的寄存器值)保存到進程的TCB(進程控制塊,每個進程對應的內存數據結構)里。然后把另一個進程TCB里的上下文寄存器的值裝載起來,開始運行。

這是一種主動配合式的調度。

2. 搶占

然而,理想很美好,現實很骨感。

這些個程序可能不是那么聽話,可能很久都不調用我們的API交出CPU,甚至可能搞了個死循環,另一個程序永遠也沒機會執行。

看來:不能依賴程序主動交出執行權,調度程序需要有搶占CPU的能力!

怎么搶占呢?

我們可以利用時鐘中斷!

因為一旦有中斷事件到來,CPU就得去執行中斷處理程序。只要在時鐘中斷的處理函數里面加入調度入口,就能搶到CPU的執行權。

為了公平起見,我們決定讓每個進程都執行一小段時間,我們把這個叫做時間片,比如100ms,然后輪流執行它們就可以了,差不多是這個樣子:

我們給CPU編程,讓它每1ms發送一次時鐘中斷。在每個時鐘中斷到來時,檢查當前的線程運行時間是否足夠100ms,如果沒有就將當前線程運行的時間+1ms,然后中斷處理結束,讓它繼續運行。

如果檢查發現時間已經到了100ms,就切換另一個進程來運行。

100ms對于人類幾乎感知不到,所以還以為兩個線程是在同時運行。

一個最最最簡單的任務調度程序就完成了。

3. 阻塞

漸漸地,進程多了起來,3個、4個、5個···

我們用一個隊列把它們存起來,先進先出,就叫做就緒隊列吧,意思是準備要排隊執行的隊列。

所有就緒的進程,依次排隊被我們的調度程序翻牌子執行。

沒過多久,我們發現有些進程經常占著茅坑不xx,在sleep或者等待鎖的時候,白白霸占著CPU空轉,搞得隊列里其他進程怨聲載道。

那咱們對調度程序再做一個優化吧:當有進程等待鎖、I/O等待或者sleep的時候,調度程序也需要介入,即使分配給它的時間片還沒用完,也要讓它主動交出CPU,并把它放到另一個等待隊列里去,等到等待的條件滿足的時候,再把它請回到就緒隊列排隊。

現在,我們的調度程序不再允許有占著CPU卻摸魚的現象發生。

4. 優先級

后來,進程進一步多了起來,6個、7個、···、100個。

每一個進程都執行100ms,轉一圈下來就是10000ms=10s。

一個打字程序,按了鍵盤10s鐘之后才反應過來,這系統卡的一匹,簡直沒法用。

我們可以把每個進程執行的時間縮短為10ms,轉一圈下來變成了1000ms=1s,情況好了很多,但還是有點卡。

而且這一招架不住進程越來越多,200個,300個,甚至更多,轉一圈的時間還是在變長。

但又不好繼續壓縮時間,否則就花太多時間在切換上了,真正執行的時間變少。

歸根結底,問題在于進程多了以后,再按照順序輪轉不合時宜了。

得讓一些進程擁有VIP特權,能夠優先執行。

要不這樣吧,給每個進程設定一個優先級,從1到40,總共40個優先級,數字越大,優先級越高。

調度的時候,把隊列遍歷一圈,找出里面優先級最高的進程來執行。

現在,我們只需要給打字程序這樣的交互式進程設定一個高優先級,再次按下鍵盤后,很快就能得到響應了。

5. O(1)復雜度

每次調度的時候都得去遍歷所有的進程,這復雜度是O(N)。

進程少倒還不打緊,多了以后就有些惱火了,這效率太低了。

讓所有進程一起排在一個大的隊列里,不是一個明智的做法。

要不我們按照優先級拆分成不同的隊列吧!每個優先級單獨弄一個就緒隊列,就是40個隊列,分開排隊,找起來效率更高。

調度的時候,按照優先級順序,依次來看每一個隊列是否有可以執行的進程,找到后就從隊列里取出來執行,相同優先級隊列里面的進程,輪流執行。

為了快速知道每一個優先級隊列里面有沒有進程,咱們再弄一個位圖,40個bit,每一位表示一個優先級隊列,如果是1就知道這個優先級的隊列里有進程需要執行,為0就沒有。

關于這個優先級隊列,差不多可以這樣定義:

struct priority_queue {
int nr_active; // 所有隊列的進程總數
unsigned long bitmap[BITMAP_SIZE]; // 位圖
struct list_head queue[MAX_PRIO]; // 隊列數組
};

現在找起來可方便了,進程再多也沒事,都可以在O(1)的時間復雜度里找到要調度的進程。

6. 餓死問題

系統運行了一段時間,發現了一個重要的問題:由于高優先級進程的存在,低優先級的程序很難得到執行機會,容易被“餓死”。

除非高優先級的進程執行結束,或者在睡眠等待,否則只要它一直待在就緒隊列里,其他進程就沒有機會。

這可不行呀,雖然你優先級高,但總得給別人分口吃的吧。

看來進程執行完成之后,不能馬上把它再放回原來的隊列里去,得這一輪大家都執行過后才行。

不放回原隊列,那放哪里去呢?

干脆再弄一個優先級隊列,把它叫做expired隊列,并把原來的優先級隊列叫做active隊列。

調度的時候,從active隊列里提取進程。完成一次調度后就把它放到expired隊列,等原來的隊列里的進程都挨個執行完一圈,active隊列就空了,它們都來到了這個expired隊列,然后交換兩個隊列,從頭再來。

嗯,為了避免內存拷貝。把active和expired定義成指針,到時候直接交換兩個指針,更省事兒!

把原來的隊列封裝一下:

struct runqueue {
struct priority_queue* active;
struct priority_queue* expired;
struct priority_queue array[2];
};

就這樣,所有進程在兩個隊列中兜兜轉轉,現在低優先級的進程也有機會被執行到了,不會被餓死了。

7. 優先級與時間片

到目前為止,雖然進程有優先級之分,但這只影響它們的調度順序,而不影響它們執行的時間,所有的進程時間片依然是100ms。

現在,優先級高的程序提出了抗議:我執行的任務很重要,需要給我更長的CPU時間片!

于是,一個新的需求來了:不同優先級進程,運行的時間片需要有區別。

優先級高的,時間片得長一點;優先級低的,時間片得短一些。

這個需求倒也好辦,我們以中間優先級20為基礎,設定優先級為20的進程時間片是100ms,優先級每增加1級,時間片+5ms,每減少一級,時間片-5ms。

優先級 ---- 時間片
1 5ms
2 10ms
3 15ms
··· ···
18 90ms
19 95ms
20 100ms # base
21 105ms
··· ···
39 195ms
40 200ms

現在,高優先級的進程不僅能夠優先被執行,給它分配的運行時間也更多了。

上面的時間片分配算法還不算是完美,它有一個問題:

如果現在只有兩個優先級為20和21的進程在運行,時間片分別是100ms和105ms,那么兩個進程分別能獲取到的CPU時間占比是100/(100+105)=48.7%和105/(100+105)=51.2%。

優先級增加1,CPU時間占比多了2.5%,看起來沒什么問題。

現在如果換成只有兩個優先級為1和2的進程在運行,時間片分別是5ms和10ms,那么兩個進程分別能獲取到的CPU時間占比是5/(5+10)=33.3%和10/(5+10)=66.7%。

優先級2只比優先級1的進程高了一級,獲取的CPU時間占比就翻了一倍!

同樣是優先級加1,這差距咋就這么大呢?

說好的公平呢?

8. 公平調度:時間分配

現在,我們換個思路,不用絕對時間片,而用相對時間片。

比如設定我們的調度周期為100ms,這100ms讓所有可以運行的進程來瓜分,100ms之后所有就緒的進程都被執行了一圈兒。

那么問題來了,如何讓進程們來瓜分這100ms呢?

當然是按照優先級來分。

我們給不同優先級的進程設置不同的權重,優先級高的,權重值高,就多分一點兒,優先級越低的,權重值低,就少分一點兒。

那這個權重值設定為多少好呢?

別急,有人已經幫我們想好了,就是下面這個數組。

想知道為什么是這些數字而不是別的,是有講究的,不過先不用管。

const int sched_prio_to_weight[40] = { 
88761, 71755, 56483, 46273, 36291,
29154, 23254, 18705, 14949, 11916,
9548, 7620, 6100, 4904, 3906,
3121, 2501, 1991, 1586, 1277,
1024, 820, 655, 526, 423,
335, 272, 215, 172, 137,
110, 87, 70, 56, 45,
36, 29, 23, 18, 15,
};

現在,各個進程按照自己優先級對應的權重,來從這100ms的調度周期里來分配時間。

不知道你發現沒有,如果進程特別多,那可能分下來的時間就會很少。咱們還得設定一個最小值,不然一天天的凈跑去調度切換了,真正執行的時間少了。

這個最小值,就是進程至少得運行這么久才能切換。

9. 公平調度:進程選擇

時間分配的問題解決了,還有一個問題:調度的時候,如何挑選下一個需要執行的進程呢?

前面我們按照權重來給大家分配了時間,但肯定有一些進程,因為I/O、鎖、睡眠等原因沒有把分配的時間用完,這一些進程應該得到補償,一旦它們符合執行條件后,應該優先被執行。

主動放棄了CPU的進程,它們運行的時間肯定比分配的短。要不,按照進程運行的時間來排個序,挑選時間最短的進程來運行?

但是,不同進程優先級不一樣,分配到的時間本來就有長短啊。

要是能夠消除因為權重造成的時間分配長短不一問題就好了,就能用運行時間來排序了。

要不咱們再弄一個虛擬運行時間,把權重帶來的影響再給修復回去?

比如優先級高的進程,分配的時間多,統計它的運行時間的時候,就讓它流逝的慢一些。

而優先級低的進程,分配的時間少,統計它的運行時間的時候,就讓它流逝的快一些。

這樣所有進程在沒有任何睡眠、等待、I/O的情況下,大家都是用完了自己的時間,消除權重后的虛擬時間都應該是一樣一樣的,都是整個調度周期的1/N!

這才叫公平嘛!

現在只需要把所有進程按照虛擬時間來排個序,排在前面的虛擬時間短,調度的時候就選擇它來運行。

好主意,那用什么樣的數據結構來組織管理進程呢?

數組?插入不方便。

鏈表?尋找插入位置的時候時間復雜度是O(N)。

用二叉搜索樹貌似是個不錯的方案。左節點虛擬時間比父節點和右節點的虛擬時間小,只要找到最左邊的節點就是要調用的進程,時間復雜度是O(LogN)。

但二叉搜索樹有個毛病,一個不小心就容易變成一棵“跛腳”的樹,這時間復雜度就又上去了。

紅黑樹沒有這個問題,它自帶平衡性,要不就它吧!

根據虛擬時間來把所有待運行的進程組織成一棵紅黑樹,只要找到整棵樹最左邊的節點,就是要運行的進程。

不過為了更高效,樹調整更新導致最左邊節點發生變化的時候,把它給緩存起來,這樣調度的時候就直接拿到這個緩存節點就好了。

完美!

總結

上面講述的進程調度模型其實就是Linux中O(1)調度算法和CFS(完全公平調度算法)調度算法的雛形,為了便于理解,文中進行了一定程度的簡化。包括但不限于:

  • 在實際的Linux中,進程優先級有140個,分為實時進程和非實時進程。
  • 在實際的Linux中,進程通過一個叫nice值(對其他進程的友好度,nice越大,越友好,越謙讓,優先級越低)的東西映射到優先級,優先級數字越大,優先級反而越低。
  • 在實際的Linux中,進程的優先級分為靜態和動態,是會隨著運行而變化的,不是固定不變。
  • 在多核模式下,為了防止加鎖帶來的性能損失,每一個CPU核都有自己的調度隊列。
  • 在實際的Linux中,參與調度的是線程,而不是進程。但在早期的Linux中,沒有線程的概念,調度就是基于進程來進行,引入線程后,線程又稱為輕量級進程。現在我們平時所說的進程和線程在語義上有所不同,這一點要注意區別。

看完了這篇文章,再去看Linux的調度算法,應該會輕松不少。

責任編輯:趙寧寧 來源: 編程技術宇宙
相關推薦

2022-03-16 07:58:02

OOMdubbo內存

2020-03-26 15:10:34

蘋果iPhone手機

2021-12-08 23:42:37

iPhone 13手機停產

2022-04-15 19:48:49

上海疫情居家辦公

2019-10-14 09:41:08

游戲Google接口

2022-04-05 11:29:40

Linux安裝操作系統

2021-09-18 07:19:54

400G5GIP網絡

2020-08-19 09:03:57

微信微信支付移動應用

2022-09-19 16:31:14

游戲益智游戲機

2021-12-04 23:01:33

程序員開發互聯網

2020-01-07 10:17:59

微軟Windows 10操作系統

2022-02-16 10:07:26

谷歌計算機離職

2021-03-18 09:17:00

LinuxM1 Mac蘋果

2023-09-07 06:44:49

Intel 4Ultra

2020-01-15 09:35:00

Linux瀏覽器Java

2022-02-16 16:36:55

阿里面試面試流程背景

2009-09-16 08:40:53

linux進程調度linuxlinux操作系統

2021-06-11 13:30:28

神經網絡機器學習

2022-08-28 16:20:44

模型數學

2019-12-23 16:57:26

搶票春運車次
點贊
收藏

51CTO技術棧公眾號

欧美另类videosbestsex日本| 成人影院在线看| 老鸭窝毛片一区二区三区| 欧美专区日韩视频| 在这里有精品| 久久综合久久美利坚合众国| 欧美第一视频| 亚洲欧美精品suv| 乱人伦视频在线| 亚洲国产中文字幕久久网| 99精品老司机免费视频| 欧美综合一区二区| 男人天堂资源在线| 一本久久综合亚洲鲁鲁五月天 | 青青草免费在线| 亚洲特色特黄| 国产一区二区三区视频在线观看| 中文有码在线观看| 国产99久久精品一区二区300| 亚洲激情图片一区| 亚洲色图色老头| 九色中文视频| 美女视频第一区二区三区免费观看网站| 亚洲欧美视频在线| 日韩av黄色网址| 国产农村妇女精品一二区| 久久成年人免费电影| 99ri日韩精品视频| 91av在线看| 青草国产精品| 精品福利免费观看| 国产小视频在线播放| 在线亚洲一区二区| 精产国品自在线www| 日韩欧美亚洲国产精品字幕久久久| av大全在线| 亚洲人成毛片在线播放| 99re66热这里只有精品4| 久久av.com| 精品一区在线| 国内视频一区二区| 狠狠色狠狠色综合系列| 国产一区视频免费观看| 一区二区三区中文字幕精品精品| 视频三区在线观看| 欧美色图在线播放| 国产精品第一视频| 欧美视频不卡| 特色特色大片在线| 亚洲国产精品成人综合色在线婷婷| 国产精品视频一区二区图片 | 国产精品亚洲专一区二区三区| 国产主播自拍av| 亚洲欧美日韩电影| 成人video亚洲精品| 日韩视频免费观看| 国产精品国产一区| 久久久久久久免费视频| 亚洲欧洲在线观看av| 免费a级在线播放| 久久精品久久久久久| 91视频一区| 中文字幕av日韩精品| 亚洲人成亚洲人成在线观看图片 | 风间由美一区二区三区| 九九在线精品视频| 可以免费看污视频的网站| 欧美人xxxx| 97超碰成人| 欧美亚州在线观看| 国产欧美日产一区| 快射av在线播放一区| 欧美成人一二三| 亚洲国产免费看| 久久黄色免费看| 日韩欧美久久一区| 日韩欧美三级| 久章草在线视频| 91精品国产综合久久久久久久| 日本视频在线免费观看| 欧洲美女和动交zoz0z| 欧美日韩卡一卡二| 日韩欧美国产大片| 久久久久亚洲精品成人网小说| 中文字幕一区二区三区在线视频| h片在线观看视频免费| 日本午夜一区| 欧美日韩一区二区三区电影| 91免费国产视频网站| 你懂得网站在线| 伦理中文字幕亚洲| 日韩视频一区二区三区在线播放免费观看 | 久久精品99无色码中文字幕 | 亚洲伦理在线| xxxxx成人.com| 久久亚洲不卡| 欧美理论在线观看| 久久久久久久久久久久av| 秋霞影院一区二区| 国产黄在线观看免费观看不卡| 1769国内精品视频在线播放| 国产精品1区二区.| jizzjizz亚洲| 成人av网站观看| 午夜日韩在线观看| 国产毛片精品| 久久精品国产sm调教网站演员| 日韩欧美美女一区二区三区| 欧美成人milf| 18av.com视频| 久久久久久一区二区三区| 国产成人免费视频网站高清观看视频| 国产欧美日韩免费| 81精品国产乱码久久久久久| 最新国产成人在线观看| 欧美r级在线观看| 亚洲老妇激情| 日本成人a视频| 中文字幕在线亚洲| 国内成人精品2018免费看| 毛片av在线| 国产区一区二区三区| 淫片在线观看| 毛片免费在线播放| 免费在线国产精品| 国产乱人伦偷精品视频不卡| 天堂аⅴ在线地址8| 91欧美激情另类亚洲| 亚洲国产精品一区二区久久恐怖片 | 亚洲欧美日韩国产yyy| 夜久久久久久| 国产精品久久占久久| 亚洲美女炮图| 一区二区三区美女| 清纯唯美亚洲经典中文字幕| 免费观看国产精品视频| 亚洲少妇中文在线| 国产精品一区免费视频| 精精国产xxxx视频在线播放| 一区二区三区免费看| 亚洲成人aaa| 国产精品香蕉一区二区三区| 日韩成人亚洲| 亚洲无吗一区二区三区| 91成人福利在线| 精品久久久久久国产91| 五月天综合网站| 91精品国产综合久久久久久豆腐| 国产一区精品视频| 日韩视频免费直播| 韩国一区二区视频| 国产精品欧美一区二区三区不卡| 先锋影音资源综合在线播放av| 国产精品999999| 色综合天天狠狠| 国产视频亚洲| 免费看男女www网站入口在线| 日韩a级在线观看| 91chinesevideo永久地址| 岛国av一区二区| 美腿丝袜在线亚洲一区| vam成人资源在线观看| 亚洲美女主播视频免费观看| 99伊人久久| 亚洲高清福利视频| 久久午夜羞羞影院免费观看| 亚洲精品456| 在线免费看a| 成人区一区二区| 97香蕉超级碰碰久久免费软件| 亚洲福利电影网| 久久av在线| 91综合精品国产丝袜长腿久久| 免费在线看污| 亚洲欧美日韩另类精品一区二区三区| 中文字幕免费精品一区| 一区二区三区欧美日韩| 老司机午夜精品视频| 四虎国产精品免费久久5151| 最近中文字幕mv第三季歌词| 欧美一区二区三区在线播放| 久久这里有精品视频| 色综合色狠狠天天综合色| 岛国精品在线播放| 国产精品99视频| 搜成人激情视频| 欧美12一14sex性hd| 99热一区二区三区| 国产日韩欧美夫妻视频在线观看| 亚洲成年人影院在线| 亚洲综合色视频| 国产91精品在线观看| 亚洲天堂免费| 亚洲我射av| 中文字幕中文字幕在线中高清免费版| 欧美三级午夜理伦三级| 久久伦理网站| 日韩av免费在线播放| 亚洲欧美日韩国产中文| 精品久久中文字幕|