實(shí)時調(diào)度器類 實(shí)時調(diào)度類有兩類進(jìn)程:
SMP 下面我們簡單介紹一下SMP的主要過程:框架周期性調(diào)度器在執(zhí)行完上面所說的過程后會調(diào)用trigger_load_balance觸發(fā)個SCHEDULE_SOFTIRQ軟中斷,該中斷確保會在適當(dāng)?shù)臅r機(jī)執(zhí)行run_rebalance_domains。該函數(shù)最終對當(dāng)前CPU調(diào)用rebalance_domains判斷該CPU下的每個調(diào)度域是否需要balance,如果需要最終將調(diào)用load_balance來實(shí)現(xiàn)負(fù)載均衡;另外內(nèi)核為每個就緒隊(duì)列提供一個遷移線程,用來接收遷移請求,這些請求被保存在migration_queue鏈表中。load_balance函數(shù)首先查找CPU(進(jìn)入這個過程的CPU已經(jīng)是CPU_IDLE)所屬調(diào)度域內(nèi)最忙的(CPU)運(yùn)行隊(duì)列,然后使用move_tasks將該隊(duì)列(最忙)中適當(dāng)數(shù)目的進(jìn)程遷移到當(dāng)前CPU的運(yùn)行隊(duì)列里,最終move_tasks調(diào)用特定調(diào)度器類的load_balance方法。下面兩種進(jìn)程在load_balance里無法完成: A. 進(jìn)程由于親緣性不能在當(dāng)前CPU下運(yùn)行 B. 進(jìn)程正在運(yùn)行(成本太大) 當(dāng)load_balance失敗的時候(沒有完成一個進(jìn)程的balance),會設(shè)置最忙運(yùn)行隊(duì)列的active_balance及它將要遷移的目標(biāo)CPU(當(dāng)前CPU),然后喚醒最忙CPU的遷移線程wake_up_process(busiest->migration_thread),那么此時最忙CPU運(yùn)行的就是這個遷移線程(之前的線程不再運(yùn)行),所以之前的線程現(xiàn)在就有可能會被遷移到目標(biāo)CPU;最忙CPU運(yùn)行遷移線程,當(dāng)它檢查到rq->active_balance則調(diào)用active_load_balance,最終分別調(diào)用特定調(diào)度器類的move_one_task函數(shù)(該函數(shù)完成的過程會比load_balance更激烈的方法,如不考慮優(yōu)先級)。 調(diào)度域:多個就緒隊(duì)列(CPU)組織為一個調(diào)度域,將物理上鄰近或共享高速緩存的CPU群集起來,它是負(fù)載均衡的單位,在balance時應(yīng)優(yōu)先選擇在同一個調(diào)度域內(nèi)的CPU之間的遷移 在CPU(邏輯CPU)間的遷移優(yōu)先(這也關(guān)系到調(diào)度域的組織):同一個core(L1,L2),同一個物理CPU(L3),同一個NUMA節(jié)點(diǎn)。我們的開發(fā)機(jī)器是2個物理CPU,每個物理CPU內(nèi)有4個core,每個core又虛擬出2個超線程,所以我們看到的16個CPU,其實(shí)是16個超線程,一般的NUMA初始設(shè)置是把同一個物理CPU的放在同一個NUMA節(jié)點(diǎn)內(nèi)。這些信息可以從/proc/cpuinfo查看:processor(表示邏輯cpu,也就是超線程);physical id(表示物理CPU ID);core id(表示一個物理CPU內(nèi)的core id,不同CPU間的core id可能一樣);siblings(表示)一個物理CPU上的超線程數(shù);cpu cores(表示一個物理CPU的core數(shù))
|
|