本文轉自:http://www.wowotech.net/pm_subsystem/pm_qos_overview.html
QOS為Quality Of Service(服務質量)的簡稱,對PM QoS而言,表示linux kernel電源管理相關的服務質量。那到底什么是服務質量呢?
我們知道,Linux PM的主要功能,是節(jié)省功耗,但同時,會付出一定的性能代價,例如延遲(latency)增加、吞吐量(throughput)下降。可以把PM當作一種服務,把它對性能的影響,類比為服務的質量(QoS)。對性能的影響越大,QoS越低,反之越高。
不過,PM QoS framework的存在,并不是為了定義并測量系統(tǒng)的服務質量(Linux系統(tǒng)對實際的qos沒有任何興趣),而是為了定義一套框架,以滿足系統(tǒng)各個實體(如進程、設備驅動等等)對QoS的期望為終極目標。根據(jù)實際的場景,這些期望可描述為:xxx不大于某個值;xxx不小于某個值;等等。
這個終極目標,是基于這樣的事實:機器是極端的實用主義者。最理想的狀況,是剛剛滿足系統(tǒng)各個實體對QoS的期望,因而可以在滿足需求的同時,最大化的省電。粗俗一點,就是“我能考60分,為什么要多花一點力氣去考61分?”。這樣的思路,值得我們深思。
本文將基于PM QoS framework整體的軟件架構,介紹它的功能、應用場景、使用方式等。
kernel將“系統(tǒng)各個實體對QoS的期望”抽象為一個一個的constraint(可以理解為約束),圍繞這些constraint,可以將系統(tǒng)的實體分為三類:requestor、pm qos framework和requestee。示意圖如下:

requestors提出對QoS的constraint。常見的requestor包括應用進程、GPU device、net device、Flash device等等,它們基于自身的實際特性,需要系統(tǒng)的QoS滿足一定的條件,才能正常工作。
pm qos core負責匯整、整理這些constraint,并根據(jù)實際情況,計算出它們的極值(最大或者最小)。
requestee在需要的時候,從pm qos core處獲取constraint的極值,并確保自身的行為,可以滿足這些constraints。一般情況下,requestee都是電源管理有關的service,包括cpuidle、runtime pm、pm domain等等。
注:requestor和requestee這兩個詞匯,是蝸蝸自己造出來的,只是為了理解方便。實際上,Linux kernel使用“QoS dependencies”的概念,分別用“Dependents on a QoS value”和“Watchers of QoS value”表述這兩個實體,具體可參考kernel/power/qos.c和drivers/base/power/qos.c的文件header。
介紹完requestor和requestee之后,還要再回答一個問題:系統(tǒng)中到底有哪些constraint?這決定了request的對象。截至到目前,PM QoS framework將constraint分為2類,每一類包括若干個constraint,具體如下。
1)系統(tǒng)級的constraint,包括cpu&dma latency、network latency、network throughput和memory bandwidth 4個constraint。
2)設備級別的constraint,包括從低功耗狀態(tài)resume的latency、active狀態(tài)的latency和一些QoS flag(如是否允許power off)。
蝸蝸會在后續(xù)的文章中詳細描述這些constraints的意義,這里先有個大概的認識即可。
根據(jù)上面2類constraint,Linux kernel提供了2個不同的QoS framework:
一個是系統(tǒng)級別的,用于cpu&dma latency、network latency、network throughput、memory bandwidth等場合,稱作PM QoS classes framework。
另一個是device級別的,用于per-device場合,稱作per-device PM QoS framework。
這2個framework有著共同的目標,即:向requestors提供request的add、modify、remove等接口,用于管理QoS requests;將QoS requests分門別類,計算出極值(簡稱value);向requestee提供request value的查詢接口。其軟件架構(非常簡單)如下:

PM QoS classes framework位于kernel/power/qos.c中,負責系統(tǒng)級別的PM QoS管理。per-device PM QoS framework位于drivers/base/power/qos.c中,負責per-device的PM QoS管理。Common header位于include/linux/pm_qos.h中,負責通用數(shù)據(jù)結構的抽象、函數(shù)聲明等工作。
需要說明的是,PM QoS classes framework會通過misc設備,向用戶空間程序提供PM QoS的request、modify、remove功能,以便照顧到它們對PM QoS的需求。
接下來的文章中,將分別從PM QoS classes framework和per-device PM QoS framework兩個角度描述PM QoS framework,本文就不再詳細描述了。
新聞熱點
疑難解答