cfs調度演算法
1. 外貿中CFS是什麼
CFS是集裝箱貨運站(CONTAINER FREIGHT STATION)是處理拼箱貨的場所,它辦理拼箱貨的交接,配載積載後,將箱子送往CY(Container Yard, 集裝箱(貨櫃)堆場),並接受CY交來的進口貨箱,進行拆箱,理貨,保管,最後撥給各收貨人。同時也可按承運人的委託進行鉛封和簽發場站收據等業務。
CFS的費用,通常是以一個方多少來算的。因為CFS是拼箱產生的費用,所以在裝運港和目的港都有發生。在FOB條件下,CFS這一項費用單獨列出來向出口商或工廠收取。(因為FOB是運費到付的,所以裝運港的費用不計算在運費內);而在CIF條件下,裝運港的CFS費用已經包含在貨代報給你的海運價之內,所以在裝運港不再單收CFS。但進口商在目的港那邊還是要付他們那邊的CFS費用。
the CFS is issued by your FDA,not CCPIT.However,it must be legalized by CCPIT and then Thai FDA too.Please note that we can not import medical instruments to Thailand without this document(CFS).翻譯:CFS是由FDA簽發的,而不是中國貿促會,但它必須由中國貿促會合法化,然後由泰國FDA批准。請注意,沒有本文件(CFS),我們不能向泰國進口醫療器械。
拓展資料:
CFS完全公平調度程序試圖按照對 CPU 時間的 「最大需求(gravest need)」 運行任務;這有助於確保每個進程可以獲得對 CPU 的公平共享。如果某個任務休眠時間 「非常短」,那麼 CFS 不會將該任務視為休眠任務 — 短暫休眠的進程可能會獲得一些額外時間,但是決不會超過它的未休眠時間。
CFS(Completely Fair Scheler,CFS)完全公平調度程序linux 2.6.23 內核附帶了一個模塊化調度程序內核和一個被實現為調度模塊的完全公平調度程序(Completely Fair Scheler,CFS)。Linux 2.6.23 內核的調度程序為其他調度模塊並行處理內核打好了基礎(這里所說的 「模塊化」 並不意味著將調度程序分解為若干可載入的模塊,而是指代碼本身模塊化)。有關調度程序工作原理的更多細節,請參考 developerWorks 文章 「Inside the Linux scheler」(參見本文末尾 參考資料 小節中的鏈接)。
2. centos採用的是用什麼調度演算法
題目本身有問題,你想問的是io驅動模型還是進程調度演算法?一般來說,說調度演算法都是說進程調度演算法。
還有你問的centos沒有說版本號,沒說版本號也就不知道內核版本號。進程調度演算法是在不斷演進的。2.6版本的內核後就是使用cfs公平調度演算法了。
3. linux內核怎麼調度系統
1.調度器的概述
多任務操作系統分為非搶占式多任務和搶占式多任務。與大多數現代操作系統一樣,Linux採用的是搶占式多任務模式。這表示對CPU的佔用時間由操作系統決定的,具體為操作系統中的調度器。調度器決定了什麼時候停止一個進程以便讓其他進程有機會運行,同時挑選出一個其他的進程開始運行。
2.調度策略
在Linux上調度策略決定了調度器是如何選擇一個新進程的時間。調度策略與進程的類型有關,內核現有的調度策略如下:
#define SCHED_NORMAL 0#define SCHED_FIFO 1#define SCHED_RR 2#define SCHED_BATCH 3/* SCHED_ISO: reserved but not implemented yet */#define SCHED_IDLE 5
0: 默認的調度策略,針對的是普通進程。
1:針對實時進程的先進先出調度。適合對時間性要求比較高但每次運行時間比較短的進程。
2:針對的是實時進程的時間片輪轉調度。適合每次運行時間比較長得進程。
3:針對批處理進程的調度,適合那些非交互性且對cpu使用密集的進程。
SCHED_ISO:是內核的一個預留欄位,目前還沒有使用
5:適用於優先順序較低的後台進程。
註:每個進程的調度策略保存在進程描述符task_struct中的policy欄位
3.調度器中的機制
內核引入調度類(struct sched_class)說明了調度器應該具有哪些功能。內核中每種調度策略都有該調度類的一個實例。(比如:基於公平調度類為:fair_sched_class,基於實時進程的調度類實例為:rt_sched_class),該實例也是針對每種調度策略的具體實現。調度類封裝了不同調度策略的具體實現,屏蔽了各種調度策略的細節實現。
調度器核心函數schele()只需要調用調度類中的介面,完成進程的調度,完全不需要考慮調度策略的具體實現。調度類連接了調度函數和具體的調度策略。
武特師兄關於sche_class和sche_entity的解釋,一語中的。
調度類就是代表的各種調度策略,調度實體就是調度單位,這個實體通常是一個進程,但是自從引入了cgroup後,這個調度實體可能就不是一個進程了,而是一個組
- static inline struct task_struct *pick_next_task(struct rq *rq){ const struct sched_class *class; struct task_struct *p; /*
- * Optimization: we know that if all tasks are in
- * the fair class we can call that function directly:
- *///基於公平調度的普通進程
- if (likely(rq->nr_running == rq->cfs.nr_running)) {
- p = fair_sched_class.pick_next_task(rq); if (likely(p)) return p;
- }//基於實時調度的實時進程
- class = sched_class_highest; for ( ; ; ) {
- p = class->pick_next_task(rq); //實時進程的類
- if (p) return p; /*
- * Will never be NULL as the idle class always
- * returns a non-NULL p:
- */
- class = class->next; //rt->next = fair; fair->next = idle
- }
- }
- struct rt_prio_array {
- DECLARE_BITMAP(bitmap, MAX_RT_PRIO+1); /* include 1 bit for delimiter */
- struct list_head queue[MAX_RT_PRIO];
- };
- define DECLARE_BITMAP(name,bits)
- unsigned long name[BITS_TO_LONGS(bits)]
- #include <sched.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#define DEATH(mess) { perror(mess); exit(errno); }void printpolicy (int policy){ /* SCHED_NORMAL = SCHED_OTHER in user-space */
- if (policy == SCHED_OTHER) printf ("policy = SCHED_OTHER = %d ", policy); if (policy == SCHED_FIFO) printf ("policy = SCHED_FIFO = %d ", policy); if (policy == SCHED_RR) printf ("policy = SCHED_RR = %d ", policy);
- }int main (int argc, char **argv){ int policy; struct sched_param p; /* obtain current scheling policy for this process */
- //獲取進程調度的策略
- policy = sched_getscheler (0);
- printpolicy (policy); /* reset scheling policy */
- printf (" Trying sched_setscheler... ");
- policy = SCHED_FIFO;
- printpolicy (policy);
- p.sched_priority = 50; //設置優先順序為50
- if (sched_setscheler (0, policy, &p))
- DEATH ("sched_setscheler:"); printf ("p.sched_priority = %d ", p.sched_priority); exit (0);
- }
- [root@wang schele]# ./get_schele_policy policy = SCHED_OTHER = 0
- Trying sched_setscheler...
- policy = SCHED_FIFO = 1
- p.sched_priority = 50
4.schele()函數
linux 支持兩種類型的進程調度,實時進程和普通進程。實時進程採用SCHED_FIFO 和SCHED_RR調度策略,普通進程採用SCHED_NORMAL策略。
preempt_disable():禁止內核搶占
cpu_rq():獲取當前cpu對應的就緒隊列。
prev = rq->curr;獲取當前進程的描述符prev
switch_count = &prev->nivcsw;獲取當前進程的切換次數。
update_rq_clock() :更新就緒隊列上的時鍾
clear_tsk_need_resched()清楚當前進程prev的重新調度標志。
deactive_task():將當前進程從就緒隊列中刪除。
put_prev_task() :將當前進程重新放入就緒隊列
pick_next_task():在就緒隊列中挑選下一個將被執行的進程。
context_switch():進行prev和next兩個進程的切換。具體的切換代碼與體系架構有關,在switch_to()中通過一段匯編代碼實現。
post_schele():進行進程切換後的後期處理工作。
5.pick_next_task函數
選擇下一個將要被執行的進程無疑是一個很重要的過程,我們來看一下內核中代碼的實現
對以下這段代碼說明:
1.當rq中的運行隊列的個數(nr_running)和cfs中的nr_runing相等的時候,表示現在所有的都是普通進程,這時候就會調用cfs演算法中的pick_next_task(其實是pick_next_task_fair函數),當不相等的時候,則調用sched_class_highest(這是一個宏,指向的是實時進程),這下面的這個for(;;)循環中,首先是會在實時進程中選取要調度的程序(p = class->pick_next_task(rq);)。如果沒有選取到,會執行class=class->next;在class這個鏈表中有三種類型(fair,idle,rt).也就是說會調用到下一個調度類。
在這段代碼中體現了Linux所支持的兩種類型的進程,實時進程和普通進程。回顧下:實時進程可以採用SCHED_FIFO 和SCHED_RR調度策略,普通進程採用SCHED_NORMAL調度策略。
在這里首先說明一個結構體struct rq,這個結構體是調度器管理可運行狀態進程的最主要的數據結構。每個cpu上都有一個可運行的就緒隊列。剛才在pick_next_task函數中看到了在選擇下一個將要被執行的進程時實際上用的是struct rq上的普通進程的調度或者實時進程的調度,那麼具體是如何調度的呢?在實時調度中,為了實現O(1)的調度演算法,內核為每個優先順序維護一個運行隊列和一個DECLARE_BITMAP,內核根據DECLARE_BITMAP的bit數值找出非空的最高級優先隊列的編號,從而可以從非空的最高級優先隊列中取出進程進行運行。
我們來看下內核的實現
數組queue[i]裡面存放的是優先順序為i的進程隊列的鏈表頭。在結構體rt_prio_array 中有一個重要的數據構DECLARE_BITMAP,它在內核中的第一如下:
5.1對於實時進程的O(1)演算法
這個數據是用來作為進程隊列queue[MAX_PRIO]的索引點陣圖。bitmap中的每一位與queue[i]對應,當queue[i]的進程隊列不為空時,Bitmap的相應位就為1,否則為0,這樣就只需要通過匯編指令從進程優先順序由高到低的方向找到第一個為1的位置,則這個位置就是就緒隊列中最高的優先順序(函數sched_find_first_bit()就是用來實現該目的的)。那麼queue[index]->next就是要找的候選進程。
如果還是不懂,那就來看兩個圖
由結果可以看出當nice的值越小的時候,其睡眠時間越短,則表示其優先順序升高了。
7.關於獲取和設置優先順序的系統調用:sched_getscheler()和sched_setscheler
輸出結果:
可以看出進程的優先順序已經被改變。
4. CFS是什麼意思
CFS釋義:
1、是集裝箱貨運站(CONTAINER FREIGHT STATION),是處理拼箱貨的場所。它辦理拼箱貨的交接,配載積載後,將箱子送往CY(Container Yard, 集裝箱(貨櫃)堆場),並接受CY交來的進口貨箱,進行拆箱,理貨,保管,最後撥給各收貨人。同時也可按承運人的委託進行鉛封和簽發場站收據等業務。
2、慢性疲勞綜合症(chronic fatigue syndromes ,CFS)是一種以慢性或反復發作的極度疲勞持續至少半年以上為特徵的癥候群,同時伴有低熱、淋巴結腫痛、肌肉酸痛、關節疼痛、神經精神症狀、免疫學異常和其它非特異表現的綜合征,1987 年3 月由美國疾病控制中心(CDC) 的holmes 等正式定名並擬定了CFS的診斷標准。
3、cfs是"cubic feet per second"的縮寫,流量單位,表示「立方尺/秒」。
4、CFS(Completely Fair Scheler,CFS),完全公平調度程序。
5. Linux上CFS調度演算法與實時調度演算法的區別
1、實時調度優先於CFS。
2、CFS是按照各進程靜態優先順序的比例進行時間的分配,在一個周期內各進程都有運行機會;實時調度總是調度實時優先順序最高的進程運行,運行時間和機會上都不公平。
6. 深度調度概念深度調度的概念
咨詢記錄 · 回答於2021-07-17
7. CFS的調度程序
CFS(Completely Fair Scheler,CFS)
完全公平調度程序 Linux 2.6.23 內核附帶了一個模塊化調度程序內核和一個被實現為調度模塊的完全公平調度程序(Completely Fair Scheler,CFS)。
Linux 2.6.23 內核的調度程序為其他調度模塊並行處理內核打好了基礎(這里所說的 「模塊化」 並不意味著將調度程序分解為若干可載入的模塊,而是指代碼本身模塊化)。有關調度程序工作原理的更多細節,請參考 developerWorks 文章 「Inside the Linux scheler」(參見本文末尾 參考資料 小節中的鏈接)。 最新版調度程序引入的主要特性包括:
模塊化調度程序完全公平調度程序(Completely Fair Scheler,CFS)CFS 組調度 模塊化調度程序
調度類的引入顯著增強了內核調度程序的可擴展性。這些類(調度程序模塊)封裝了調度策略。這個調度程序將調度策略模塊化,但是與 Pluggable CPU 調度程序框架不同的是,並沒有把調度程序本身模塊化(後者在內核編譯時選擇默認調度程序,而通過在啟動時向內核傳遞參數來使用其他 CPU 調度程序)。
CFS
完全公平調度程序(CFS)試圖按照對 CPU 時間的 「最大需求(gravest need)」 運行任務;這有助於確保每個進程可以獲得對 CPU 的公平共享。如果某個任務休眠時間 「非常短」,那麼 CFS 不會將該任務視為休眠任務 — 短暫休眠的進程可能會獲得一些額外時間,但是決不會超過它的未休眠時間。
CFS 組調度
考慮一個兩用戶示例,用戶 A 和用戶 B 在一台機器上運行作業。用戶 A 只有兩個作業正在運行,而用戶 B 正在運行 48 個作業。組調度使 CFS 能夠對用戶 A 和用戶 B 進行公平調度,而不是對系統中運行的 50 個作業進行公平調度。每個用戶各擁有 50% 的 CPU 使用。用戶 B 使用自己 50% 的 CPU 分配運行他的 48 個作業,而不會佔用屬於用戶 A 的另外 50% 的 CPU 分配。
CFS 調度模塊(在 kernel/sched_fair.c 中實現)用於以下調度策略:SCHED_NORMAL、SCHED_BATCH 和 SCHED_IDLE。對於 SCHED_RR 和 SCHED_FIFO 策略,將使用實時調度模塊(該模塊在 kernel/sched_rt.c 中實現)。
鑒於以下原因,需要對策略作出一些更改:
更好地支持伺服器和台式機調度。 提供用戶要求的新特性。改進啟發式(heuristic)處理。vanilla 調度程序使用啟發式處理可以更輕易地實現調度。同樣,如果啟發式處理錯誤估測了場景,將導致意料之外的行為。
8. 如何修改CFS調度演算法為隨機調度演算法
在2.6以前,採用的是內核非搶占調度演算法。在2.6之後,調度演算法可以簡單的歸為兩大類:CFS(公平調度類)和實時調度類,而實時調度類支持內核和用戶態搶占。
9. 內核bfs和cfs的區別
CFS是針對小型設備優化的內核種類,沒有得到linux官方的認證.而BFS內核則是官方認證的標准內核.詳細特點請看:
本帖隱藏的內容
CFS是針對小型設備優化的內核種類,沒有得到linux官方的認證.而BFS內核則是官方認證的標准內核.
BFS:寬度優先搜索演算法(又稱廣度優先搜索)是最簡便的圖的搜索演算法之一,這一演算法也是很多重要的圖的演算法的原型。Dijkstra單源最短路徑演算法和Prim最小生成樹演算法都採用了和寬度優先搜索類似的思想。其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位址,徹底地搜索整張圖,直到找到結果為止。
CFS:一種新的調度演算法,根據CPU的最大需求運行進程,降低代碼閱讀維護難度,演算法思路更為簡捷.主要難度特點就是動態優先順序的運算.我個人認為從這兩個角度要比BFS省電.
10. 如何將linux內核的CFS調度演算法修改為隨機調
1、實時調度優先於CFS。 2、CFS是按照各進程靜態優先順序的比例進行時間的分配,在一個周期內各進程都有運行機會;實時調度總是調度實時優先順序最高的進程運行,運行時間和機會上都不公平。