新聞中心
Linux內(nèi)核是Linux操作系統(tǒng)的核心組成部分,它管理著計算機硬件資源,為其他應(yīng)用程序提供服務(wù)。Linux內(nèi)核的開發(fā)和維護(hù)需要高度的技術(shù)和經(jīng)驗,因此在Linux內(nèi)核領(lǐng)域擁有專業(yè)技能的人才十分寶貴。如果你想在Linux內(nèi)核方面發(fā)展自己的職業(yè),準(zhǔn)備參加Linux內(nèi)核面試是必不可少的。

在瓊山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司 網(wǎng)站設(shè)計制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,網(wǎng)絡(luò)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),瓊山網(wǎng)站建設(shè)費用合理。
這篇文章將探討如何準(zhǔn)備Linux內(nèi)核面試,包括必備技能、學(xué)習(xí)資源和經(jīng)驗分享等內(nèi)容,幫助你掌握Linux內(nèi)核,成為一名成功的Linux內(nèi)核開發(fā)者。
一、必備技能
1.熟悉Linux開發(fā)環(huán)境
Linux內(nèi)核是在Linux操作系統(tǒng)上開發(fā)的,因此熟悉Linux開發(fā)環(huán)境是掌握Linux內(nèi)核的必備技能。這包括熟悉Linux操作系統(tǒng)的安裝和配置,熟練使用Linux命令,了解Linux文件系統(tǒng)和網(wǎng)絡(luò)協(xié)議等。
2.熟悉C語言和匯編語言
Linux內(nèi)核主要使用C語言進(jìn)行開發(fā),因此熟悉C語言的語法和編程思想是掌握Linux內(nèi)核的另一個必備技能。此外,Linux內(nèi)核中還涉及到一些匯編語言的使用,因此熟悉匯編語言也是必須的。
3.了解計算機硬件架構(gòu)
Linux內(nèi)核是計算機硬件的抽象表示,因此了解計算機硬件架構(gòu)對于掌握Linux內(nèi)核也是至關(guān)重要的。了解計算機內(nèi)部組件的結(jié)構(gòu)和工作原理,包括內(nèi)存、CPU、I/O設(shè)備等,可以幫助你更好地理解Linux內(nèi)核的實現(xiàn)。
二、學(xué)習(xí)資源
1.書籍
《深入理解Linux內(nèi)核》是學(xué)習(xí)Linux內(nèi)核的經(jīng)典教材,詳細(xì)介紹了Linux內(nèi)核的各個方面,包括進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議等。此外還有一些其他優(yōu)秀的書籍,如《Linux內(nèi)核源代碼情景分析》、《Linux驅(qū)動程序開發(fā)詳解》等。
2.課程
在網(wǎng)上可以找到許多關(guān)于Linux內(nèi)核的課程,例如Coursera上的“Linux內(nèi)核分析”課程、“Linux內(nèi)核開發(fā)實戰(zhàn)”課程等。這些課程涵蓋了Linux內(nèi)核的各個方面,可以幫助你更全面深入地理解Linux內(nèi)核。
3.社區(qū)
參與Linux社區(qū)是了解Linux內(nèi)核的重要途徑之一,可以在社區(qū)中找到實戰(zhàn)經(jīng)驗、技術(shù)討論和資源分享等。在Linux社區(qū)中,你可以了解到最新的Linux內(nèi)核技術(shù)和動態(tài)。
三、經(jīng)驗分享
1.關(guān)注開源項目
開源項目是Linux內(nèi)核開發(fā)的重要組成部分,參與開源項目可以幫助你更深入地了解Linux內(nèi)核的實現(xiàn)和應(yīng)用。此外,通過參與開源項目,你還可以積累代碼貢獻(xiàn),提高代碼質(zhì)量和實現(xiàn)能力。
2.參加Hackathon
Hackathon是一種開發(fā)者聚會的形式,可以在短時間內(nèi)完成一個項目,并共享經(jīng)驗和技術(shù)。參加Hackathon可以幫助你快速掌握新技術(shù)和實踐經(jīng)驗,對于Linux內(nèi)核開發(fā)也是有幫助的。
3.解決問題
解決問題是掌握Linux內(nèi)核的重要途徑之一,通過解決問題可以積累實踐經(jīng)驗和技術(shù)能力。在解決問題過程中,你將面對各種各樣的問題,這些問題可以幫助你更好地理解Linux內(nèi)核的實現(xiàn)和工作原理。
Linux內(nèi)核是Linux操作系統(tǒng)的核心組成部分,掌握Linux內(nèi)核需要具備必備技能、了解學(xué)習(xí)資源和分享經(jīng)驗。對于準(zhǔn)備Linux內(nèi)核面試的人來說,了解這些內(nèi)容可以幫助你更好地準(zhǔn)備面試,提高通過面試的概率。同時,掌握Linux內(nèi)核是一件持續(xù)學(xué)習(xí)的過程,需要不斷地學(xué)習(xí)和實踐,才能成為一名優(yōu)秀的Linux內(nèi)核開發(fā)者。
相關(guān)問題拓展閱讀:
- 面試 linux 文件系統(tǒng)怎樣io到底層
- 搞嵌入式linux驅(qū)動開發(fā)面試應(yīng)該做哪些準(zhǔn)備?
面試 linux 文件系統(tǒng)怎樣io到底層
前言:本文主要講解LinuxIO調(diào)度層的三種模式:cfp、deadline和noop,并給出各自的優(yōu)化和適用場景建議。IO調(diào)度發(fā)生在Linux內(nèi)核的IO調(diào)度層。這個層次是針對Linux的整體IO層次體系來說的。從read()或者write()系統(tǒng)調(diào)用的角度來說,Linux整體IO體系可以分為七層,它們分別是:VFS層:虛擬文件系統(tǒng)層。由于內(nèi)核要跟多種文件系統(tǒng)打交道,而每一種文件系統(tǒng)所實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)和相關(guān)方法都可能不盡相同,所以,內(nèi)核抽象了這一層,專門用來適配各種文件系統(tǒng),并對外提供統(tǒng)一操作接口。文件系統(tǒng)層:不同的文件系統(tǒng)實現(xiàn)自己的操作過程,提供自己特有的特征,具體不多說了,大家愿意的話自己去看代碼即可。頁緩存層:負(fù)責(zé)真對page的緩存。通用塊層:由于絕大多數(shù)情況的io操作是跟塊設(shè)備打交道,所以Linux在此提供了一個類似vfs層的塊設(shè)備操作抽象層。下層對接各種不同屬性的塊設(shè)備,對上提供統(tǒng)一的BlockIO請求標(biāo)準(zhǔn)。IO調(diào)度層:因為絕大多數(shù)的塊設(shè)備都是類似磁盤這樣的設(shè)判型搜備,所以有必要根據(jù)這類設(shè)備的特點以及應(yīng)用的不同特點來設(shè)置一些不同的調(diào)度算法和隊列。以便在不同的應(yīng)用環(huán)境下有針對性的提高磁盤的讀寫效率,這里就是大名鼎鼎的Linux電梯所起作用的地方。針對機械硬盤的各種調(diào)度方法就是在這實現(xiàn)的。塊設(shè)備驅(qū)動層:驅(qū)動層對外提供相對比較高級的設(shè)備操作接口,往往是C語言的,而下層對接設(shè)備本身的操作方法和規(guī)范。塊設(shè)備層:這層就是具體的物理設(shè)備了,定義了各種真對設(shè)備操作方法和規(guī)范。有一個已經(jīng)整理好的,非常經(jīng)典,一圖勝千言:我們今天要研究的內(nèi)容主要在IO調(diào)度這一層。它要解決的核心問題是,如何提高塊設(shè)備IO的整體性能?這一層也主要是針對機械硬盤結(jié)構(gòu)而設(shè)計的。眾所周知,機械硬盤的存儲介質(zhì)是磁盤,磁頭在盤片上移動進(jìn)行磁道尋址,行為類似播放一張唱片。這種結(jié)構(gòu)的特點是,順序訪問時吞吐量較高,但是如果一旦對盤片有隨機訪問,那么大量的時間都會浪費在磁頭的移動上,這時候就會導(dǎo)致每次IO的響應(yīng)時間變長,極大的降低IO的響應(yīng)速度。磁頭在盤片上尋道的操作,類似電梯調(diào)度,實際上在最開始的時期,Linux把這個算法命名為Linux電梯算法,即:如果在尋道的過程中,能把順序路過的相關(guān)磁道的數(shù)據(jù)請求都“順便”處理掉,那么就可以在比較小影響響應(yīng)速度的前提下,提高整體IO的吞吐量。這就是我們?yōu)槭裁匆O(shè)計IO調(diào)度算法的原因。目前在內(nèi)核中默認(rèn)開啟了三種算法/模式:noop,cfq和deadline。嚴(yán)格算應(yīng)該是兩種:因為之一種叫做noop,就是空操作調(diào)度算法,也就是沒有任何調(diào)度操作,并不對io請求進(jìn)行排序,僅僅做適當(dāng)?shù)膇o合并的一個fifo隊列。目前內(nèi)核中默認(rèn)的調(diào)度算法應(yīng)該是cfq,叫做完全公平隊列調(diào)度。這個調(diào)度算法人如其名,它試圖給所有進(jìn)程提供一個完全公平的IO操作環(huán)境。注:請大家一定記住這個詞語,cfq,完全公平隊列調(diào)度,不然下文就沒法看了。cfq為每個進(jìn)程創(chuàng)建一個同步IO調(diào)度隊列,并默認(rèn)以時間片和請求數(shù)限定的方式分配IO資源,以此保證每個進(jìn)程的IO資源占用是公平的,cfq還實現(xiàn)了針對進(jìn)程租檔級別的優(yōu)先級調(diào)度,這個我們后面會詳細(xì)解釋。查看和修改IO調(diào)度算法的方法是:cfq是通用服務(wù)器比較好的IO調(diào)度算法選擇,對桌面用戶也是比較好的選擇。但是對于很多IO壓力較大的場景就并不是很適應(yīng),尤其是IO壓力集中在某些進(jìn)程上的場景。因為這種場景我們需要的滿足某個或者某幾個進(jìn)程的IO響應(yīng)速度,而不是讓所有的進(jìn)程公平的使用IO,比如數(shù)據(jù)庫應(yīng)用。deadline調(diào)度(最終期限調(diào)度)就是更適合上述場景的解決方案。deadline實現(xiàn)了四個隊列:其中兩個分別處理正常read和write,按扇區(qū)號排序,進(jìn)行正常io的合并處理以提高吞吐量。因為IO請求可能會集中在某些磁盤位置,這樣會導(dǎo)致新來的請求一直被合并,可能會有其他磁盤位置的io請求被餓死。另外兩個處理超時read和write的隊列,按請求創(chuàng)建時間排序,如果有超時的請求出現(xiàn),就放進(jìn)這兩個隊列,調(diào)度算法保證超時(達(dá)到最終期限時間)的隊列中的請求會優(yōu)先被處理,防止掘歷請求被餓死。不久前,內(nèi)核還是默認(rèn)標(biāo)配四種算法,還有一種叫做as的算法(Anticipatoryscheduler),預(yù)測調(diào)度算法。一個高大上的名字,搞得我一度認(rèn)為Linux內(nèi)核都會算命了。結(jié)果發(fā)現(xiàn),無非是在基于deadline算法做io調(diào)度的之前等一小會時間,如果這段時間內(nèi)有可以合并的io請求到來,就可以合并處理,提高deadline調(diào)度的在順序讀寫情況下的數(shù)據(jù)吞吐量。其實這根本不是啥預(yù)測,我覺得不如叫撞大運調(diào)度算法,當(dāng)然這種策略在某些特定場景差效果不錯。但是在大多數(shù)場景下,這個調(diào)度不僅沒有提高吞吐量,還降低了響應(yīng)速度,所以內(nèi)核干脆把它從默認(rèn)配置里刪除了。畢竟Linux的宗旨是實用,而我們也就不再這個調(diào)度算法上多費口舌了。1、cfq:完全公平隊列調(diào)度cfq是內(nèi)核默認(rèn)選擇的IO調(diào)度隊列,它在桌面應(yīng)用場景以及大多數(shù)常見應(yīng)用場景下都是很好的選擇。如何實現(xiàn)一個所謂的完全公平隊列(CompletelyFairQueueing)?首先我們要理解所謂的公平是對誰的公平?從操作系統(tǒng)的角度來說,產(chǎn)生操作行為的主體都是進(jìn)程,所以這里的公平是針對每個進(jìn)程而言的,我們要試圖讓進(jìn)程可以公平的占用IO資源。那么如何讓進(jìn)程公平的占用IO資源?我們需要先理解什么是IO資源。當(dāng)我們衡量一個IO資源的時候,一般喜歡用的是兩個單位,一個是數(shù)據(jù)讀寫的帶寬,另一個是數(shù)據(jù)讀寫的IOPS。帶寬就是以時間為單位的讀寫數(shù)據(jù)量,比如,100Mbyte/s。而IOPS是以時間為單位的讀寫次數(shù)。在不同的讀寫情境下,這兩個單位的表現(xiàn)可能不一樣,但是可以確定的是,兩個單位的任何一個達(dá)到了性能上限,都會成為IO的瓶頸。從機械硬盤的結(jié)構(gòu)考慮,如果讀寫是順序讀寫,那么IO的表現(xiàn)是可以通過比較少的IOPS達(dá)到較大的帶寬,因為可以合并很多IO,也可以通過預(yù)讀等方式加速數(shù)據(jù)讀取效率。當(dāng)IO的表現(xiàn)是偏向于隨機讀寫的時候,那么IOPS就會變得更大,IO的請求的合并可能性下降,當(dāng)每次io請求數(shù)據(jù)越少的時候,帶寬表現(xiàn)就會越低。從這里我們可以理解,針對進(jìn)程的IO資源的主要表現(xiàn)形式有兩個:進(jìn)程在單位時間內(nèi)提交的IO請求個數(shù)和進(jìn)程占用IO的帶寬。其實無論哪個,都是跟進(jìn)程分配的IO處理時間長度緊密相關(guān)的。有時業(yè)務(wù)可以在較少IOPS的情況下占用較大帶寬,另外一些則可能在較大IOPS的情況下占用較少帶寬,所以對進(jìn)程占用IO的時間進(jìn)行調(diào)度才是相對最公平的。即,我不管你是IOPS高還是帶寬占用高,到了時間咱就換下一個進(jìn)程處理,你愛咋樣咋樣。所以,cfq就是試圖給所有進(jìn)程分配等同的塊設(shè)備使用的時間片,進(jìn)程在時間片內(nèi),可以將產(chǎn)生的IO請求提交給塊設(shè)備進(jìn)行處理,時間片結(jié)束,進(jìn)程的請求將排進(jìn)它自己的隊列,等待下次調(diào)度的時候進(jìn)行處理。這就是cfq的基本原理。當(dāng)然,現(xiàn)實生活中不可能有真正的“公平”,常見的應(yīng)用場景下,我們很肯能需要人為的對進(jìn)程的IO占用進(jìn)行人為指定優(yōu)先級,這就像對進(jìn)程的CPU占用設(shè)置優(yōu)先級的概念一樣。所以,除了針對時間片進(jìn)行公平隊列調(diào)度外,cfq還提供了優(yōu)先級支持。每個進(jìn)程都可以設(shè)置一個IO優(yōu)先級,cfq會根據(jù)這個優(yōu)先級的設(shè)置情況作為調(diào)度時的重要參考因素。優(yōu)先級首先分成三大類:RT、BE、IDLE,它們分別是實時(RealTime)、更佳效果(BestTry)和閑置(Idle)三個類別,對每個類別的IO,cfq都使用不同的策略進(jìn)行處理。另外,RT和BE類別中,分別又再劃分了8個子優(yōu)先級實現(xiàn)更細(xì)節(jié)的QOS需求,而IDLE只有一個子優(yōu)先級。另外,我們都知道內(nèi)核默認(rèn)對存儲的讀寫都是經(jīng)過緩存(buffer/cache)的,在這種情況下,cfq是無法區(qū)分當(dāng)前處理的請求是來自哪一個進(jìn)程的。只有在進(jìn)程使用同步方式(syncread或者syncwirte)或者直接IO(DirectIO)方式進(jìn)行讀寫的時候,cfq才能區(qū)分出IO請求來自哪個進(jìn)程。所以,除了針對每個進(jìn)程實現(xiàn)的IO隊列以外,還實現(xiàn)了一個公共的隊列用來處理異步請求。當(dāng)前內(nèi)核已經(jīng)實現(xiàn)了針對IO資源的cgroup資源隔離,所以在以上體系的基礎(chǔ)上,cfq也實現(xiàn)了針對cgroup的調(diào)度支持??偟膩碚f,cfq用了一系列的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)了以上所有復(fù)雜功能的支持,大家可以通過源代碼看到其相關(guān)實現(xiàn),文件在源代碼目錄下的block/cfq-iosched.c。1.1cfq設(shè)計原理在此,我們對整體數(shù)據(jù)結(jié)構(gòu)做一個簡要描述:首先,cfq通過一個叫做cfq_data的數(shù)據(jù)結(jié)構(gòu)維護(hù)了整個調(diào)度器流程。在一個支持了cgroup功能的cfq中,全部進(jìn)程被分成了若干個contralgroup進(jìn)行管理。每個cgroup在cfq中都有一個cfq_group的結(jié)構(gòu)進(jìn)行描述,所有的cgroup都被作為一個調(diào)度對象放進(jìn)一個紅黑樹中,并以vdisktime為key進(jìn)行排序。vdisktime這個時間紀(jì)錄的是當(dāng)前cgroup所占用的io時間,每次對cgroup進(jìn)行調(diào)度時,總是通過紅黑樹選擇當(dāng)前vdisktime時間最少的cgroup進(jìn)行處理,以保證所有cgroups之間的IO資源占用“公平”。當(dāng)然我們知道,cgroup是可以對blkio進(jìn)行資源比例分配的,其作用原理就是,分配比例大的cgroup占用vdisktime時間增長較慢,分配比例小的vdisktime時間增長較快,快慢與分配比例成正比。這樣就做到了不同的cgroup分配的IO比例不一樣,并且在cfq的角度看來依然是“公平“的。選擇好了需要處理的cgroup(cfq_group)之后,調(diào)度器需要決策選擇下一步的service_tree。service_tree這個數(shù)據(jù)結(jié)構(gòu)對應(yīng)的都是一系列的紅黑樹,主要目的是用來實現(xiàn)請求優(yōu)先級分類的,就是RT、BE、IDLE的分類。每一個cfq_group都維護(hù)了7個service_trees,其定義如下:其中service_tree_idle就是用來給IDLE類型的請求進(jìn)行排隊用的紅黑樹。而上面二維數(shù)組,首先之一個維度針對RT和BE分別各實現(xiàn)了一個數(shù)組,每一個數(shù)組中都維護(hù)了三個紅黑樹,分別對應(yīng)三種不同子類型的請求,分別是:SYNC、SYNC_NOIDLE以及ASYNC。我們可以認(rèn)為SYNC相當(dāng)于SYNC_IDLE并與SYNC_NOIDLE對應(yīng)。idling是cfq在設(shè)計上為了盡量合并連續(xù)的IO請求以達(dá)到提高吞吐量的目的而加入的機制,我們可以理解為是一種“空轉(zhuǎn)”等待機制??辙D(zhuǎn)是指,當(dāng)一個隊列處理一個請求結(jié)束后,會在發(fā)生調(diào)度之前空等一小會時間,如果下一個請求到來,則可以減少磁頭尋址,繼續(xù)處理順序的IO請求。為了實現(xiàn)這個功能,cfq在service_tree這層數(shù)據(jù)結(jié)構(gòu)這實現(xiàn)了SYNC隊列,如果請求是同步順序請求,就入隊這個servicetree,如果請求是同步隨機請求,則入隊SYNC_NOIDLE隊列,以判斷下一個請求是否是順序請求。所有的異步寫操作請求將入隊ASYNC的servicetree,并且針對這個隊列沒有空轉(zhuǎn)等待機制。此外,cfq還對SSD這樣的硬盤有特殊調(diào)整,當(dāng)cfq發(fā)現(xiàn)存儲設(shè)備是一個ssd硬盤這樣的隊列深度更大的設(shè)備時,所有針對單獨隊列的空轉(zhuǎn)都將不生效,所有的IO請求都將入隊SYNC_NOIDLE這個servicetree。每一個servicetree都對應(yīng)了若干個cfq_queue隊列,每個cfq_queue隊列對應(yīng)一個進(jìn)程,這個我們后續(xù)再詳細(xì)說明。cfq_group還維護(hù)了一個在cgroup內(nèi)部所有進(jìn)程公用的異步IO請求隊列,其結(jié)構(gòu)如下:異步請求也分成了RT、BE、IDLE這三類進(jìn)行處理,每一類對應(yīng)一個cfq_queue進(jìn)行排隊。BE和RT也實現(xiàn)了優(yōu)先級的支持,每一個類型有IOPRIO_BE_NR這么多個優(yōu)先級,這個值定義為8,數(shù)組下標(biāo)為0-7。我們目前分析的內(nèi)核代碼版本為Linux4.4,可以看出,從cfq的角度來說,已經(jīng)可以實現(xiàn)異步IO的cgroup支持了,我們需要定義一下這里所謂異步IO的含義,它僅僅表示從內(nèi)存的buffer/cache中的數(shù)據(jù)同步到硬盤的IO請求,而不是aio(man7aio)或者linux的native異步io以及l(fā)ibaio機制,實際上這些所謂的“異步”IO機制,在內(nèi)核中都是同步實現(xiàn)的(本質(zhì)上馮諾伊曼計算機沒有真正的“異步”機制)。我們在上面已經(jīng)說明過,由于進(jìn)程正常情況下都是將數(shù)據(jù)先寫入buffer/cache,所以這種異步IO都是統(tǒng)一由cfq_group中的async請求隊列處理的。那么為什么在上面的service_tree中還要實現(xiàn)和一個ASYNC的類型呢?這當(dāng)然是為了支持區(qū)分進(jìn)程的異步IO并使之可以“完全公平”做準(zhǔn)備嘍。實際上在最新的cgroupv2的blkio體系中,內(nèi)核已經(jīng)支持了針對bufferIO的cgroup限速支持,而以上這些可能容易混淆的一堆類型,都是在新的體系下需要用到的類型標(biāo)記。新體系的復(fù)雜度更高了,功能也更加強大,但是大家先不要著急,正式的cgroupv2體系,在Linux4.5發(fā)布的時候會正式跟大家見面。我們繼續(xù)選擇service_tree的過程,三種優(yōu)先級類型的service_tree的選擇就是根據(jù)類型的優(yōu)先級來做選擇的,RT優(yōu)先級更高,BE其次,IDLE更低。就是說,RT里有,就會一直處理RT,RT沒了再處理BE。每個service_tree對應(yīng)一個元素為cfq_queue排隊的紅黑樹,而每個cfq_queue就是內(nèi)核為進(jìn)程(線程)創(chuàng)建的請求隊列。每一個cfq_queue都會維護(hù)一個rb_key的變量,這個變量實際上就是這個隊列的IO服務(wù)時間(servicetime)。這里還是通過紅黑樹找到servicetime時間最短的那個cfq_queue進(jìn)行服務(wù),以保證“完全公平”。選擇好了cfq_queue之后,就要開始處理這個隊列里的IO請求了。這里的調(diào)度方式基本跟deadline類似。cfq_queue會對進(jìn)入隊列的每一個請求進(jìn)行兩次入隊,一個放進(jìn)fifo中,另一個放進(jìn)按訪問扇區(qū)順序作為key的紅黑樹中。默認(rèn)從紅黑樹中取請求進(jìn)行處理,當(dāng)請求的延時時間達(dá)到deadline時,就從紅黑樹中取等待時間最長的進(jìn)行處理,以保證請求不被餓死。這就是整個cfq的調(diào)度流程,當(dāng)然其中還有很多細(xì)枝末節(jié)沒有交代,比如合并處理以及順序處理等等。1.2cfq的參數(shù)調(diào)整理解整個調(diào)度流程有助于我們決策如何調(diào)整cfq的相關(guān)參數(shù)。所有cfq的可調(diào)參數(shù)都可以在/sys/class/block/sda/queue/iosched/目錄下找到,當(dāng)然,在你的系統(tǒng)上,請將sda替換為相應(yīng)的磁盤名稱。我們來看一下都有什么:這些參數(shù)部分是跟機械硬盤磁頭尋道方式有關(guān)的,如果其說明你看不懂,請先補充相關(guān)知識:back_seek_max:磁頭可以向后尋址的更大范圍,默認(rèn)值為16M。back_seek_penalty:向后尋址的懲罰系數(shù)。這個值是跟向前尋址進(jìn)行比較的。以上兩個是為了防止磁頭尋道發(fā)生抖動而導(dǎo)致尋址過慢而設(shè)置的?;舅悸肥沁@樣,一個io請求到來的時候,cfq會根據(jù)其尋址位置預(yù)估一下其磁頭尋道成本。設(shè)置一個更大值back_seek_max,對于請求所訪問的扇區(qū)號在磁頭后方的請求,只要尋址范圍沒有超過這個值,cfq會像向前尋址的請求一樣處理它。再設(shè)置一個評估成本的系數(shù)back_seek_penalty,相對于磁頭向前尋址,向后尋址的距離為1/2(1/back_seek_penalty)時,cfq認(rèn)為這兩個請求尋址的代價是相同。這兩個參數(shù)實際上是cfq判斷請求合并處理的條件限制,凡事復(fù)合這個條件的請求,都會盡量在本次請求處理的時候一起合并處理。fifo_expire_async:設(shè)置異步請求的超時時間。同步請求和異步請求是區(qū)分不同隊列處理的,cfq在調(diào)度的時候一般情況都會優(yōu)先處理同步請求,之后再處理異步請求,除非異步請求符合上述合并處理的條件限制范圍內(nèi)。當(dāng)本進(jìn)程的隊列被調(diào)度時,cfq會優(yōu)先檢查是否有異步請求超時,就是超過fifo_expire_async參數(shù)的限制。如果有,則優(yōu)先發(fā)送一個超時的請求,其余請求仍然按照優(yōu)先級以及扇區(qū)編號大小來處理。fifo_expire_sync:這個參數(shù)跟上面的類似,區(qū)別是用來設(shè)置同步請求的超時時間。slice_idle:參數(shù)設(shè)置了一個等待時間。這讓cfq在切換cfq_queue或servicetree的時候等待一段時間,目的是提高機械硬盤的吞吐量。一般情況下,來自同一個cfq_queue或者servicetree的IO請求的尋址局部性更好,所以這樣可以減少磁盤的尋址次數(shù)。這個值在機械硬盤上默認(rèn)為非零。當(dāng)然在固態(tài)硬盤或者硬RAID設(shè)備上設(shè)置這個值為非零會降低存儲的效率,因為固態(tài)硬盤沒有磁頭尋址這個概念,所以在這樣的設(shè)備上應(yīng)該設(shè)置為0,關(guān)閉此功能。group_idle:這個參數(shù)也跟上一個參數(shù)類似,區(qū)別是當(dāng)cfq要切換cfq_group的時候會等待一段時間。在cgroup的場景下,如果我們沿用slice_idle的方式,那么空轉(zhuǎn)等待可能會在cgroup組內(nèi)每個進(jìn)程的cfq_queue切換時發(fā)生。這樣會如果這個進(jìn)程一直有請求要處理的話,那么直到這個cgroup的配額被耗盡,同組中的其它進(jìn)程也可能無法被調(diào)度到。這樣會導(dǎo)致同組中的其它進(jìn)程餓死而產(chǎn)生IO性能瓶頸。在這種情況下,我們可以將slice_idle=0而group_idle=8。這樣空轉(zhuǎn)等待就是以cgroup為單位進(jìn)行的,而不是以cfq_queue的進(jìn)程為單位進(jìn)行,以防止上述問題產(chǎn)生。low_latency:這個是用來開啟或關(guān)閉cfq的低延時(lowlatency)模式的開關(guān)。當(dāng)這個開關(guān)打開時,cfq將會根據(jù)target_latency的參數(shù)設(shè)置來對每一個進(jìn)程的分片時間(slicetime)進(jìn)行重新計算。這將有利于對吞吐量的公平(默認(rèn)是對時間片分配的公平)。關(guān)閉這個參數(shù)(設(shè)置為0)將忽略target_latency的值。這將使系統(tǒng)中的進(jìn)程完全按照時間片方式進(jìn)行IO資源分配。這個開關(guān)默認(rèn)是打開的。我們已經(jīng)知道cfq設(shè)計上有“空轉(zhuǎn)”(idling)這個概念,目的是為了可以讓連續(xù)的讀寫操作盡可能多的合并處理,減少磁頭的尋址操作以便增大吞吐量。如果有進(jìn)程總是很快的進(jìn)行順序讀寫,那么它將因為cfq的空轉(zhuǎn)等待命中率很高而導(dǎo)致其它需要處理IO的進(jìn)程響應(yīng)速度下降,如果另一個需要調(diào)度的進(jìn)程不會發(fā)出大量順序IO行為的話,系統(tǒng)中不同進(jìn)程IO吞吐量的表現(xiàn)就會很不均衡。就比如,系統(tǒng)內(nèi)存的cache中有很多臟頁要寫回時,桌面又要打開一個瀏覽器進(jìn)行操作,這時臟頁寫回的后臺行為就很可能會大量命中空轉(zhuǎn)時間,而導(dǎo)致瀏覽器的小量IO一直等待,讓用戶感覺瀏覽器運行響應(yīng)速度變慢。這個low_latency主要是對這種情況進(jìn)行優(yōu)化的選項,當(dāng)其打開時,系統(tǒng)會根據(jù)target_latency的配置對因為命中空轉(zhuǎn)而大量占用IO吞吐量的進(jìn)程進(jìn)行限制,以達(dá)到不同進(jìn)程IO占用的吞吐量的相對均衡。這個開關(guān)比較合適在類似桌面應(yīng)用的場景下打開。target_latency:當(dāng)low_latency的值為開啟狀態(tài)時,cfq將根據(jù)這個值重新計算每個進(jìn)程分配的IO時間片長度。quantum:這個參數(shù)用來設(shè)置每次從cfq_queue中處理多少個IO請求。在一個隊列處理事件周期中,超過這個數(shù)字的IO請求將不會被處理。這個參數(shù)只對同步的請求有效。slice_sync:當(dāng)一個cfq_queue隊列被調(diào)度處理時,它可以被分配的處理總時間是通過這個值來作為一個計算參數(shù)指定的。公式為:time_slice=slice_sync+(slice_sync/5*(4-prio))。這個參數(shù)對同步請求有效。slice_async:這個值跟上一個類似,區(qū)別是對異步請求有效。slice_async_rq:這個參數(shù)用來限制在一個slice的時間范圍內(nèi),一個隊列最多可以處理的異步請求個數(shù)。請求被處理的更大個數(shù)還跟相關(guān)進(jìn)程被設(shè)置的io優(yōu)先級有關(guān)。1.3cfq的IOPS模式我們已經(jīng)知道,默認(rèn)情況下cfq是以時間片方式支持的帶優(yōu)先級的調(diào)度來保證IO資源占用的公平。高優(yōu)先級的進(jìn)程將得到的時間片長度,而低優(yōu)先級的進(jìn)程時間片相對較小。當(dāng)我們的存儲是一個高速并且支持NCQ(原生指令隊列)的設(shè)備的時候,我們更好可以讓其可以從多個cfq隊列中處理多路的請求,以便提升NCQ的利用率。此時使用時間片的分配方式分配資源就顯得不合時宜了,因為基于時間片的分配,同一時刻最多能處理的請求隊列只有一個。這時,我們需要切換cfq的模式為IOPS模式。切換方式很簡單,就是將slice_idle=0即可。內(nèi)核會自動檢測你的存儲設(shè)備是否支持NCQ,如果支持的話cfq會自動切換為IOPS模式。另外,在默認(rèn)的基于優(yōu)先級的時間片方式下,我們可以使用ionice命令來調(diào)整進(jìn)程的IO優(yōu)先級。進(jìn)程默認(rèn)分配的IO優(yōu)先級是根據(jù)進(jìn)程的nice值計算而來的,計算方法可以在manionice中看到,這里不再廢話。2、deadline:最終期限調(diào)度deadline調(diào)度算法相對cfq要簡單很多。其設(shè)計目標(biāo)是:在保證請求按照設(shè)備扇區(qū)的順序進(jìn)行訪問的同時,兼顧其它請求不被餓死,要在一個最終期限前被調(diào)度到。我們知道磁頭對磁盤的尋道是可以進(jìn)行順序訪問和隨機訪問的,因為尋道延時時間的關(guān)系,順序訪問時IO的吞吐量更大,隨機訪問的吞吐量小。如果我們想為一個機械硬盤進(jìn)行吞吐量優(yōu)化的話,那么就可以讓調(diào)度器按照盡量復(fù)合順序訪問的IO請求進(jìn)行排序,之后請求以這樣的順序發(fā)送給硬盤,就可以使IO的吞吐量更大。但是這樣做也有另一個問題,就是如果此時出現(xiàn)了一個請求,它要訪問的磁道離目前磁頭所在磁道很遠(yuǎn),應(yīng)用的請求又大量集中在目前磁道附近。導(dǎo)致大量請求一直會被合并和插隊處理,而那個要訪問比較遠(yuǎn)磁道的請求將因為一直不能被調(diào)度而餓死。deadline就是這樣一種調(diào)度器,能在保證IO更大吞吐量的情況下,盡量使遠(yuǎn)端請求在一個期限內(nèi)被調(diào)度而不被餓死的調(diào)度器。
搞嵌入式linux驅(qū)動開發(fā)面試應(yīng)該做哪些準(zhǔn)備?
軟硬件的基礎(chǔ)知識一定要扎實,比方中斷的原理,串口通信的原理什么的。。。
最重要的還是滾埋仿你自己在這一年中做過什么,把你自己做過的東西講清楚的話,
一般人家HR就能判斷你這個人到底肚子里大纖是不是有真材實貨,不要像很多
華而不實液知的人一樣,自己什么代碼都沒寫過的項目也往簡歷里面湊,這樣沒好處。
至于薪水,我們相信做驅(qū)動開發(fā)的工作永遠(yuǎn)也不會差,關(guān)鍵還是得能在工作
中出成績才能對得起人家的高薪水。另外除了薪水之外,公司能具有的工作學(xué)習(xí)
氣氛更加重要,畢竟,你也只有一年的工作經(jīng)驗,還是處于經(jīng)驗的積累期。
軟硬件的基礎(chǔ)知識一定要扎實,比方中斷的原理,串口通信的原理什么的。。。
最重要的還是你自己在這一年中做過什么,把你自己做過的東西講清楚的話,
一般人家HR就能判斷你這個迅源喚人到底肚子里是不是有真材實貨,不要像很多
華而不實的人一樣,自己什么代碼都沒寫過的項目也往簡歷里面湊,這樣沒好處。
至于薪水,我們相信做驅(qū)動開發(fā)的工作永遠(yuǎn)也不會差,關(guān)鍵還是得能在工作
中出成績才能對得起人家的高薪水。另外除了薪水之外,畝凱公司能具有的工作學(xué)習(xí)
氣氛更加重要,畢竟,裂棚你也只有一年的工作經(jīng)驗,還是處于經(jīng)驗的積累期。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
杭州巨立安技術(shù)(JulianTec),專注于提供Linux相關(guān)的項目研發(fā)和技術(shù)培訓(xùn)服務(wù)。
我也是啊
linux 內(nèi)核 面試的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 內(nèi)核 面試,掌握Linux內(nèi)核:如何準(zhǔn)備Linux內(nèi)核面試,面試 linux 文件系統(tǒng)怎樣io到底層,搞嵌入式linux驅(qū)動開發(fā)面試應(yīng)該做哪些準(zhǔn)備?的信息別忘了在本站進(jìn)行查找喔。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機房服務(wù)器托管租用。
當(dāng)前題目:掌握Linux內(nèi)核:如何準(zhǔn)備Linux內(nèi)核面試 (linux 內(nèi)核 面試)
URL地址:http://m.fisionsoft.com.cn/article/djepjcj.html


咨詢
建站咨詢
