星期二, 1月 08, 2008

在2007/09/12 於悅知網站所發表的"電源管理—Linux下的ACPI"

ACPI的全名為Advanced Configuration and Power Interface,是在1996年12月由HP、Intel、Microsoft、Phoenix及Toshiba一同推出的,主要的作用就是在控制與管理系統上所有和電源相關的硬體或設備,當然也包括了外接的週邊設備。在【Linux作業系統之奧義】一書中有提到有關Intel及AMD在Linux下省電模式,這一部份就是ACPI針對CPU的電源管理的其中一種表現方式,所以其實ACPI是一個非常浩大且重要的管理機制。
大家都知道開機與關機,但這一兩個動作所牽涉到的層面其實非常廣,從CPU的電源要吃多少、關機要關到哪一個程度、關機後的動作為何,一直到要如何回覆到原本的狀態,都在ACPI的規範中。舉一個最簡單的例子,在Windows95或Linux 2.4 kernel之前,是不是一按系統的Power Button就會直接斷電,但在Windows98及Linux 2.6 kernel之後的版本,就可以進入所謂的關機階段,自動一步一步的將電源關閉。這中間的差別在哪裡?是硬體還是軟體?其實就在於整個電源的管理模式更新為ACPI的方式。

針對系統的電源管理,ACPI處理電源的方式可以分為G0、G1、G2、G3四個主要的全系統狀態(Global State),分別介紹如下:
1、
G0:一般正常的“工作”狀態,使用者開機進入作業系統後便是屬於此一階段,在這一個正常的用電階段,使用者還是可以進行細部的調整,例如等一下會介紹到針對設備的省電模式。。
2、
G1:就是較常聽到的“睡眠”狀態(sleeping),也是一般使用者比較有機會在作業系統下做調整的模式,在G1的狀態下,可以再細分為S1、S2、S3、S4四個子狀態:

S1:S1是在睡眠狀態中最吃電的一種狀態,Notebook中有時使用的"Standby"選項就是採用S1的方式,但比較好的做法,現在都會以S3為標準。CPU中的cache都持續供電,但停止執行指令。在CPU及記憶體的部份都有電力在供應,但其他的裝置就沒有硬性規定,可斷電也可供電。S1的狀態一般都是在較舊的電腦中才會看到,因為很多新型的主機都將G1S1的功能拿掉,或是廠商會支援使用者在BIOS中做設定,讓使用者可以選擇使用S1或是S3。

S2:所謂的沉睡(Deeper Sleep),連CPU都會斷電,但鮮少電腦會支援G1S2。

S3:這對大家而言一定最為熟悉,因為這就是在Windows選項中會出現的“Standby”,但在技術上的名稱則為Suspend to RAM (STR)。在此狀態下,只有主記憶體有接受供電的權利。但值得注意的是,雖然大部份的資料都會回寫到記憶體,但硬碟本身的Buffer有可能來不及回寫到硬碟,這樣就會造成資料流失,因此在用S3的狀態時,最好是先將硬碟的buffer及cache都關掉,以免造成上述的問題發生。另外,因為ACPI並不是一個世界通用標準,只是由幾間公司所在推的一個功能,因此Linux並沒有完全的支援,像談到現在為止的S1、S2、S3到目前為止Linux都沒有加到預設的功能,只有接下來提到的S4已經變為Fedora 7、RHEL5及SLES10的標準配備。

S4:俗稱冬眠狀態(Hibernet),其技術上的名稱則為Suspend to Disk (STD),這一階段會將所有執行中的資料全部寫入到硬碟中,而之所以要寫入硬碟,就是因為要完全的斷電,但也因為如此,在回覆到原本工作狀態所使用的時間會比S3來得久。在Fedora 7中,已經將S4加入到關機的功能之一,這也是G1中唯一可以在Linux下所使用的“睡眠”方式 。




3、
G2:可稱為Soft Off或是S5,在主機完全關機時,僅供少許的電力給一些像網路卡、鍵盤或像USB設備等,俱有“喚醒”功能(Wake)的設備,當需要開機時,只要透過網路或鍵盤就可以將遠端或近端直接打開電腦。但有個限制,比如說原本設定從網路開機,如果關機後使用者將網路卡拔掉,就會破壞G2的狀態,意即進入G3。在Linux中可以設定網路卡的等待狀態,也就是說直接指定某一張網路卡,當關機時要傾聽有沒有需要被“喚醒”,




設定完成後,只要在同一個網段內的電腦,執行“喚醒”指令,就可以透過在等待中的網路卡的MAC Address,將電腦“喚醒”,也就是進入開機程序。






4、
G3:Mechanical Off,這時的供電大小近乎於零,其實就是各位使用者一般的關機,在正常關機程序結束時便進入G3的狀態,但為何指明是“近乎於零”,因為其實還是有些許的電力在等待使用者開機使用,所以如果在家中要省電,還是把插頭拔掉吧,不然電腦是永遠都在吃電狀態的。


剛剛所提到的這些全系統狀態,指的都是整體的電源管理,而ACPI同時針對CPU也定義了電能以及效能狀態的規範,只是Linux到目前為止大部份沒有完全照著ACPI的方式執行。

以電能狀態而言,CPU分為C0、C1、C2、C3四種狀態,裝置也同樣被區分為D0、D1、D2、D3四種狀態,基本上大同小異,都是數字越小就越耗電,越大就越省電,但在Linux下可以看到,其實不會完全遵照這些狀態的定義,也就是功能雖然有部份做到,但不會完全照著ACPI的定義。









就CPU的效能狀態來說,ACPI定義了17個狀態,稱為P-States,從P0一直到P16。P0的效能最高,P16最低;但相對來說,也就是P0最耗電,而P16是最省電。在Linux 2.6 kernel下,要看到Linux針對ACPI所定義出的CPU效能狀態(P-States),就必須在/sys目錄下才看得到。在圖中可以看到,雖然定義了17種狀態,但實際上只會使用到2到3種的速度去因應CPU的效能變化,但在實際的運作中,只能說夠用了。






當然ACPI定義了不只這一些,另外還有很多的表格要去參考,真的是蠻複雜的一個機制,尤其ACPI並非完全由作業系統來控制的,一樣是透過作業系統與BIOS不斷的溝通才有辦法達到各個狀態。但ACPI對目前全球正熱門的節能概念來說,非常的實用,尤其是一些長期使用NOTEBOOK的使用者來說,更可以讓電力更持久。但有些特殊情況並不適合使用類似的節能方式,會造成反效果(連電力都會更浪費),這在【Linux作業系統之奧義】一書中也已經解釋過,其原因是出在於處理節奏上的差異。適不適用於系統上,還是要等待使用者細心的評估過才能決定,不過,身為一個系統管理者,勢必多了一份為地球省一點電的責任。

3 則留言:

gold 提到...

就CPU的效能狀態來說,ACPI定義了17個狀態,稱為P-States,從P0一直到P16。P0的效能最高,P16最低;但相對來說,也就是P16最耗電,而P0是最省電。 以上似乎有誤

Juergen Chiu 提到...

Hi Gold,
感謝您的意見
在我看到的文件與認知中
我提到的部份只在G State會用到, 也就是需要進入睡眠的狀態, 定義的電源模式.
而你所提到的P State, 應該是只在C State會出現的階段(執行階段), 但我看系統中, 一般BIOS在設定P State似乎也沒有到P16, 大部份好像也都只有兩個值.
另外P16好像是低電壓/低頻率的, P0是高電壓高頻率.
想知道到這邊為止是否與你的看法是一樣的, 謝謝.

ps:若可以也請直接使用mail討論. juergen dot chiu at gmail dot com

Juergen Chiu 提到...

Hi Gold,
抱歉, 剛剛看到我的筆誤了

"就CPU的效能狀態來說,ACPI定義了17個狀態,稱為P-States,從P0一直到P16。P0的效能最高,P16最低;但相對來說,也就是P16最耗電,而P0是最省電。 "

這部份已經更正, 謝謝.
有任何問題還是請你繼續提出...^^