任務(wù)調(diào)度器
?專欄內(nèi)容:
參天引擎內(nèi)核架構(gòu)
本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實(shí)現(xiàn)多機(jī)的數(shù)據(jù)庫節(jié)點(diǎn)的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術(shù)難點(diǎn)的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點(diǎn)的情況下對故障容災(zāi)的支持。手寫數(shù)據(jù)庫toadb
本專欄主要介紹如何從零開發(fā),開發(fā)的步驟,以及開發(fā)過程中的涉及的原理,遇到的問題等,讓大家能跟上并且可以一起開發(fā),讓每個(gè)需要的人成為參與者。
本專欄會定期更新,對應(yīng)的代碼也會定期更新,每個(gè)階段的代碼會打上tag,方便階段學(xué)習(xí)。
?開源貢獻(xiàn):
- toadb開源庫
個(gè)人主頁:我的主頁
管理社區(qū):開源數(shù)據(jù)庫
座右銘:天行健,君子以自強(qiáng)不息;地勢坤,君子以厚德載物.
前言
現(xiàn)代的CPU都是多core處理器,而且在intel處理器中每個(gè)core又可以多個(gè)processor,形成了多任務(wù)并行處理的硬件架構(gòu),在服務(wù)器端的處理器上架構(gòu)又有一些不同,傳統(tǒng)的采用SMP,也就是對稱的多任務(wù)處理架構(gòu),每個(gè)任務(wù)都可以對等的訪問所有內(nèi)存,外設(shè)等,而如今在ARM系列CPU上,多采用NUMA架構(gòu),它將CPU核分了幾個(gè)組,給每個(gè)組的CPU core分配了對應(yīng)的內(nèi)存和外設(shè),CPU訪問對應(yīng)的內(nèi)存和外設(shè)時(shí)速度最優(yōu),跨組訪問時(shí)性能會降底一些。
隨著硬件技術(shù)的持續(xù)發(fā)展,它們對一般應(yīng)用的性能優(yōu)化能力越來越強(qiáng),同時(shí)對于服務(wù)器軟件的開發(fā),提出更高要求,要想達(dá)到極高的并發(fā)和性能,就需要充分利用當(dāng)前硬件架構(gòu)的特點(diǎn),對它們進(jìn)行壓榨。那么,我們的應(yīng)用至少也是要采用多任務(wù)架構(gòu),不管是多線程還是多進(jìn)程的多任務(wù)架構(gòu),才可以充分利用硬件的資源,達(dá)到高效的處理能力。
當(dāng)然多任務(wù)框架的采用,不僅僅是多線程的執(zhí)行,需要對多任務(wù)下帶來的問題進(jìn)行處理,如任務(wù)執(zhí)行返回值獲取,任務(wù)間數(shù)據(jù)的傳遞,任務(wù)執(zhí)行次序的協(xié)調(diào);當(dāng)然也不是任務(wù)越多處理越快,要避免線程過多導(dǎo)致操作系統(tǒng)夯住,也要防止任務(wù)空轉(zhuǎn)過快導(dǎo)致CPU使用率飆高。
本專欄主要介紹使用多線程與多進(jìn)程模型,如何搭建多任務(wù)的應(yīng)用框架,同時(shí)對多任務(wù)下的數(shù)據(jù)通信,數(shù)據(jù)同步,任務(wù)控制,以及CPU core與任務(wù)綁定等相關(guān)知識的分享,讓大家在實(shí)際開發(fā)中輕松構(gòu)建自已的多任務(wù)程序。
概述
現(xiàn)代操作系統(tǒng)都是多任務(wù)的系統(tǒng),它們都會有一個(gè)任務(wù)調(diào)度器的功能,在操作系統(tǒng)課程上,我們也學(xué)過各種任務(wù)調(diào)度算法,在實(shí)際實(shí)現(xiàn)中會依據(jù)各種應(yīng)用場景實(shí)現(xiàn)多套不同的調(diào)度策略。
調(diào)度器介紹
多任務(wù)的調(diào)度是一項(xiàng)非常復(fù)雜的事情,linux的歷史版本中,經(jīng)常會對調(diào)度做一些優(yōu)化,這里簡單介紹一下linux的調(diào)度器。
在CPU中一般會有一個(gè)以上的core,每個(gè)core又可以分多個(gè)processor,常見的就是intel i5,i7的CPU, 在linux 下,可以通過 cat /proc/cpuinfo
查看,每個(gè)’core id’看對應(yīng)幾個(gè)processor。
實(shí)際運(yùn)行的程序任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)大于這些處理器的數(shù)量的,所以操作系統(tǒng)中一般會有一個(gè)調(diào)度器的模塊,通過一定的方法,讓各個(gè)任務(wù)都有機(jī)會在CPU上執(zhí)行,常見的有時(shí)間片輪轉(zhuǎn),先來先服務(wù),優(yōu)先級搶占等策略;操作系統(tǒng)為了應(yīng)對不同的使用場景,也制定了一系統(tǒng)策略供應(yīng)用者選擇。
linux調(diào)度器策略,有一些是給內(nèi)核任務(wù)用的,有一些是留給用戶任務(wù),目前對這些策略分了五大類,這五類之間優(yōu)先級是固定的,按優(yōu)先級從高到低,分別為 Stop
, Deadline
, Realtime
, CFS
, Idle
,每種類型下可能會有多種調(diào)度策略,下面簡單分享一下。
在調(diào)度器中會維護(hù)一個(gè)任務(wù)的優(yōu)先級隊(duì)列,當(dāng)產(chǎn)生任務(wù)時(shí),會根據(jù)任務(wù)的優(yōu)先級,將它插入到相同優(yōu)先級的任務(wù)隊(duì)列的末尾,當(dāng)有高優(yōu)先級任務(wù)時(shí),會搶占低優(yōu)先級任務(wù)。
而當(dāng)一個(gè)任務(wù)時(shí)間片或周期到時(shí),主動(dòng)釋放CPU后,但任務(wù)還沒有完成,此任務(wù)仍然會重新插入到相同優(yōu)先級的任務(wù)隊(duì)列末尾,如果它是當(dāng)前最高優(yōu)先級任務(wù)時(shí),它會被立即調(diào)度運(yùn)行。
Stop-task scheduling 分類
在linux 內(nèi)核代碼中如下描述
// SPDX-License-Identifier: GPL-2.0
/*
* stop-task scheduling class.
*
* The stop task is the highest priority task in the system, it preempts
* everything and will be preempted by nothing.
*
* See kernel/stop_machine.c
*/
Stop scheduling class是優(yōu)先級最高級別的調(diào)度,它可以搶占任何任務(wù)的資源,同時(shí)它不能被搶占,直到它自己完成或釋放CPU。
這一特性決定它只能被內(nèi)核線程使用,主要處理一些CPU切換的任務(wù),也就是調(diào)度器的管理工作,比如通過top命令,可以看到有 migration/1,這里的數(shù)字是CPU core的意思,將任務(wù)在不同core之間遷移的調(diào)度。
deadline scheduling 分類
該分類下有一種處理策略 SCHED_DEADLINE
, 這是在linux 3.14版本中引入的,它是用戶線程優(yōu)先級最高的處理級別,使用GEDF (Global Earliest Deadline First) 和 CBS (Constant Bandwidth Server) 兩種算法的結(jié)合。
SCHED_DEADLINE
策略的任務(wù),是以任務(wù)截止時(shí)間為調(diào)度周期,當(dāng)該任務(wù)占用CPU時(shí),會搶占比它優(yōu)先級低的任務(wù)(比如后面大類下的策略任務(wù)),直到任務(wù)的截止時(shí)間到期,或者任務(wù)完成才會釋放CPU。
此類策略主要用于多媒體處理,如音視頻的編解碼處理任務(wù),和其它預(yù)設(shè)任務(wù)期限的處理。
在linux中,使用sched_setattr
進(jìn)行設(shè)置。
Realtime(RT) scheduling 分類
此分類下有兩種調(diào)度策略可選,每種策略下還可以指定任務(wù)的優(yōu)先級,優(yōu)先級范圍為 1-99,數(shù)字越大優(yōu)先級越高;
當(dāng)然此大類下的任務(wù)的優(yōu)先級都高于后面介紹的大類的任務(wù),同時(shí)優(yōu)先級也低于前面兩個(gè)大類的任務(wù)。
-
SCHED_FIFO: First in-first out scheduling
這種策略相對簡單,相同優(yōu)先級的任務(wù)先入隊(duì)的,先進(jìn)行調(diào)度運(yùn)行,直到更高優(yōu)先級任務(wù)搶占,或者任務(wù)完成為止,或者自己釋放CPU。 -
SCHED_RR: Round-robin scheduling
此種策略是前一種的增強(qiáng),運(yùn)行周期最大為系統(tǒng)定義的時(shí)間片,超過時(shí)間片就會被調(diào)度到隊(duì)列中,時(shí)間片可以通過sched_rr_get_interval
函數(shù)進(jìn)行查看。
這兩種策略都可以用pthread_attr_setschedpolicy
進(jìn)行設(shè)置。
completely fair (CFS) scheduling 分類
正如分類名稱,完全公平的調(diào)度,這一大類主要用于用戶線程,創(chuàng)建線程時(shí)默認(rèn)策略就是SCHED_OTHER
;
此大類下有三種調(diào)度策略可選,它們的優(yōu)先級必須設(shè)置為0,它們使用另一權(quán)重 nice 的設(shè)置,調(diào)整同類策略任務(wù)的優(yōu)先級,nice值范圍為-20 - 19, 值越小權(quán)重越大,也就是優(yōu)先級越高。
- SCHED_OTHER: Default Linux time-sharing scheduling
默認(rèn)創(chuàng)建線程的策略,在內(nèi)核中的命名是SCHED_NORMAL
,也就是用戶線程最常用的一種分時(shí)調(diào)度策略。每個(gè)任務(wù)的可用時(shí)間片由nice值來決定,當(dāng)nice值低時(shí),有更多的時(shí)間來運(yùn)行,當(dāng)nice值高時(shí),運(yùn)行的時(shí)間相比就會少一些;
- SCHED_BATCH:Scheduling batch processes
主要運(yùn)行一些非交互式的批處理任務(wù),這些任務(wù)需要持續(xù)運(yùn)行一段時(shí)間,它們是計(jì)算密集性,不適合頻繁的調(diào)度。
此策略下的任務(wù)通常在沒有SCHED_OTHER
策略的任務(wù)時(shí),才進(jìn)行調(diào)度運(yùn)行。
- SCHED_IDLE: Scheduling very low priority jobs
此類型策略對應(yīng)的任務(wù)優(yōu)先級最低,通常用于系統(tǒng)中沒有其它任務(wù)時(shí),才進(jìn)行調(diào)度運(yùn)行,它的nice 值對本身的優(yōu)先級沒有影響。
Idle scheduling 分類
與 SCHED_IDLE
是有區(qū)別的,在此分類下暫時(shí)沒有策略可選,它是一種優(yōu)先級最低的調(diào)度類型,目前它不用于用戶級的線程調(diào)度,只用于內(nèi)核調(diào)度器在CPU空閑時(shí)的任務(wù) swapper/1,數(shù)字代表core編號,此時(shí)沒有任務(wù),CPU處于一種節(jié)能模式。
總結(jié)
多任務(wù)操作系統(tǒng),如Windows和Linux,允許多個(gè)程序同時(shí)運(yùn)行,為現(xiàn)代計(jì)算提供了強(qiáng)大的支持。采用多任務(wù)操作系統(tǒng)的原因?yàn)榱颂岣哂?jì)算機(jī)的效率和響應(yīng)速度。在單任務(wù)操作系統(tǒng)中,計(jì)算機(jī)只能一次完成一個(gè)任務(wù),這導(dǎo)致效率低下。而多任務(wù)操作系統(tǒng)通過同時(shí)處理多個(gè)任務(wù),提高了工作效率。例如,在編輯文檔的同時(shí)下載文件或聽音樂,大大增強(qiáng)了用戶的體驗(yàn)。總之,多任務(wù)操作系統(tǒng)滿足了現(xiàn)代社會的多元化需求,為人們提供了便捷、高效的工作與生活方式。
結(jié)尾
非常感謝大家的支持,在瀏覽的同時(shí)別忘了留下您寶貴的評論,如果覺得值得鼓勵(lì),請點(diǎn)贊,收藏,我會更加努力!文章來源:http://www.zghlxwxcb.cn/news/detail-777275.html
作者郵箱:study@senllang.onaliyun.com
如有錯(cuò)誤或者疏漏歡迎指出,互相學(xué)習(xí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-777275.html
到了這里,關(guān)于【linux 多線程并發(fā)】多任務(wù)調(diào)度器,調(diào)度策略時(shí)間片輪轉(zhuǎn),先進(jìn)先出,多種實(shí)時(shí)任務(wù)的策略,內(nèi)核級最高優(yōu)先級調(diào)度策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!