摘要:桌面操作系統隨著個人計算機硬件的進步飛速發展。以Unix為基礎的Mac OS X在最近一次主要升級Mac OS X 10.6 Snow Leopard中對底層技術進行了重要的革新,引入了64位內核、 Grand Central Dispatch、OpenCL等新技術。底層技術的更新為開發人員提供了更友好的多線程,更深入的發掘了硬件的潛力,也為操作系統的進一步的發展奠定了基礎。
關鍵詞:Mac OS X;操作系統;底層技術;64位;多線程;OpenCL
中圖分類號:TP316文獻標識碼:A文章編號:1009-3044(2010)02-278-03
The New Technologies under the Fur of Mac OS X v10.6 Snow Leopard
LIU Zhao
(Post-graduate Department, Chinese People's Public Security University, Beijing 100038, China)
Abstract: Desktop operating systems interact with us every minute. The OS venders have put dramatic efforts in integrating new technologies into their products. Based on Unix, the Mac OS X has reached its 6th major updates. The OS is refined from the bottom up and many new technologies are introduced. These new technologies radically simplify the code needed to make best use of multiple processors, improve the performance, efficiency, and will deliver great benefits to developers.
Key words: Mac OS X; Operating System; 64bit; multi-threading; OpenCL
自2001年起,蘋果電腦公司的操作系統Mac OS X選擇Unix作為其基礎。最近的第6次主要升級——Mac OS X v10.6 Snow Leopard被定義為“精煉”,這意味著用戶界面上沒有特別顯著的變化。隨著2009年8月底新操作系統的到來,本次升級所帶來的底層新技術可以一窺個人桌面操作系統領域的發展動向。
1 64位內核
64位運算的一個重要優點就是可以訪問高達16EB的內存,從而使大部分的數據處理直接在內存中進行,不需要臨時的磁盤存儲,大大提高了數字計算和其他任務的處理速度。64位運算的優勢顯而易見,服務器及專業應用等領域已經開始廣泛轉向64位,但個人桌面操作系統從32位向64位過渡的過程卻超出想像的漫長。這其中主要的原因包括64位驅動程序的缺乏,以及日常軟件需要使用超過4G內存的情況微乎其微。不過Snow Leopard有意推動64位在個人桌面領域的深入。
Snow Leopard同時包含了64位的內核和32位的內核。除了在服務器Xserve和特別內存配制的Mac Pro上,其他情況下Snow Leopard默認均會以32位內核啟動。用戶可以手動選擇以64位內核啟動。默認以32位內核啟動保證了新系統兼容現有的32位驅動及內核擴展,允許以64位內核啟動則為未來預留的選擇的空間。32位的內核同樣受限于4G的地址空間。內核的一個主要作用就是跟蹤和管理系統內存,Mac OS X使用64-byte內存紀錄內存中每個頁面(4KB)的狀態。假設計算機安裝了96GB內存,那么完整紀錄這96GB內存的狀態需要占大約1.5GB的地址空間,這已經接近32位內核全部地址空間的三分之一。單純的內存管理就使用去三分之一的地址空間對內核效率會產生負面的影響。64位內核理論上將不受這一限制,16EB的地址空間為應對內存的飛速增長做了充足的準備。
Mac OS X個人桌面和服務器均只有一個發行版本,因此對默認是否開啟64位內核的判斷完全交給操作系統本身。Windows操作系統則通過提供32位和64位不同發行版本將這一選擇交給最終用戶本身。64位Windows通過WoW64(Windows-on-Windows-64)模擬層使32位應用程序得以運行。WoW64將32位系統調用轉譯成64位的系統調用。但WoW64固有的局限性使得在其上運行32位進程無法調用64位DLL,同時無法運行依賴32位內核驅動的32位程序。如果用戶手中的硬件設備暫時沒有64位驅動則很可能需要重新安裝32位Windows操作系統。
2 操作系統層面的多線程:Grand Central Dispatch
隨著多核心處理器的普及,越來越多精力被投入到如何有效的發揮多核心的真正工效之中。在傳統模式下,為了實現多核心多線程,開發人員本身需要做大量的工作。利用線程為多核處理器編程需要小心的把程序分成可以單獨執行的線程,將敏感數據鎖定,管理線程數,同時檢查是否要和其他程序爭奪處理器資源。現有的程序很大程度上需要重新優化。多核心及多線程編程的復雜程度使得很多應用軟件從成本出發并未針對其真正優化。為走出這一困境,Mac OS X v10.6 Snow Leopard提出了Grand Central Dispatch技術,試圖將多核心及多線程的操作交給操作系統本身,而不再是交給應用程序,根據處理器的數量調整應用程序的工作負荷,使用任務所需數量的線程,從而提高應用程序的效率。
GDC是Mac OS X底層的C庫。GDC主要通過Blocks、Queues和線程池(Thread pools)來實現。
Blocks是對C的擴展,是GDC的任務單元。Blocks將函數及其變量封裝成便于調用的形式。例如:
b = 2;
simpleAdder = ^int( int a ){ return a + b };
r = simpleAdder(5) // 5 + 2 = 7
GDC按照FIFO的順序對任務“enqueued”和“dequeued”。
每當一個Queue中有任務需要運行,GDC會將該任務“dequeued”,并交給線程池中的一個空閑的線程。
傳統多線程編程的過程中,為一個應用程序創建多少個線程才能使性能最優化這一問題一直困擾著開發人員。這一問題解答并不是確定的,其很大程度上取決于該程序運行時有多少系統資源可分配。例如一個被劃分為8個任務的程序以4個線程運行在一個8核心處理器上,但同時這個處理器的其中6個核心已經在忙于別的程序的任務,那么此時創建4個線程并不是最優化的,很多時間均浪費在切換線程上;假設另6個內核已經完成其任務,此時的線程數4也不是最優化的,有4個內核將沒有任務。開發人員無法預知系統運行時的狀態,因此最好有單獨的機制全局把握最優線程數。在GDC中,線程池中的線程數目交由GDC根據系統資源決定。這樣開發人員不必要再把大量的精力花費在考慮創建線程數目上。同時由于GDC的全局性,GDC動態根據系統資源的占用來創建線程。當線程處理完畢當前任務后會回到線程池,當前Queue的任務全部完成后,GDC可以將此線程分配給其他Queue,這樣也同時節約了創建新線程的時間和資源。隨著硬件水平的提高,越來越多的核心將會集成進處理器內,而開發人員也不必為此而重新優化程序,GDC會自動調整。
GDC鼓勵開發人員從“同步”轉向“異步”:從主線程中分離出可能會導致等待的部分,例如對文件的操作,或者等待用戶輸入等等。例如下面的這段代碼:
{
NSDictionary *stats = [myDoc analyze];
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
[stats release];
}
第一行代碼執行文件分析,第二行更新程序內部狀態,第三行刷新顯示,典型的對文件操作并提示用戶相關信息的程序,且每一步都在主線程中進行。假設用戶試圖分析的文件很大或者結構很復雜,那么第一步分析的過程可能有20-30秒,在此期間,整個程序將不會有任何響應,用戶需要等待。利用GDC可以很容易的將分析文件的部分從主線程剝離,從而避免程序暫時無響應:
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSDictionary *stats = [myDoc analyze];
dispatch_async(dispatch_get_main_queue(), ^{
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
[stats release];
});
});
}
外部的dispatch_async將一個任務放入 global GDC queue,這個任務包含了耗時的文件分析和第二次調用dispatch_async—將刷新用戶界面放入主線程的queue(Cocoa程序用戶界面的刷新必須在主線程中進行)。經過這樣簡單的修改后,對文件的分析被放入后臺異步運行。當文件分析完成后,并不需要任何消息機制,也不需要在程序中添加任何處理消息的代碼,只需將刷新用戶界面的任務再次放入主線程的queue中執行。
蘋果電腦公司將GDC開源后,開源社區已經將其并入Unix和Linux之中,幫助開發人員在更廣泛的平臺上更便捷的開發支持多線程的應用程序。相信其他操作系統也會為開發者提供類似的友好環境。
3 OpenCL:挖掘GPU的通用運算能力
作為個人桌面計算機的重要組成部分,新型Graphic Processing Units(GPUs)也得到了飛速發展。當常用桌面處理器還以4核為主的時候,GPU已經同時有上百個處理單元。GPU的計算能力已經向1,000GFLOPS進發:每秒1兆次的浮點運算。雖然GPU主要負責圖像的處理,但其并行快速的特點也適合一些通用計算。挖掘GPU的通用計算能力需要面對不同種類GPU的不同體系結構、數據類型和指令集。類似在3D領域廣泛使用的OpenGL,OpenCL為GPU用于通用計算提供支持。
OpenCL為GPU用于通用計算提供C語言的API。開發人員可以不用再考慮GPU之間的區別而專注于程序本身。OpenCL支持對向量的直接運算,可以直接對向量進行操作,同時其內在對并行的支持,數據不再需要被手動分解,可以整體發送給GPU,由GPU分配到各個計算單元計算完畢后直接返回結果。
和OpenGL類似,隨著GPU的升級,OpenCL程序的執行速度也會得到相應的提升。每當GPU升級,通過更新操作系統的OpenCL實現,而開發人員不需要重寫代碼,程序速度自然提升,這一機制類似OpenGL驅動升級。這與幾年前使用MMX指令集編寫的代碼,隨著CPU的加速,很可能要用SSE4指令集重新編寫有所不同。
將一個技術購建在另一個技術之上是軟件開發中通常的做法:在Snow Leopard中,OpenCL構建在GDC之上。這一結果并不意外。OpenCL所需要的并行特性,以及對數據的操作,均適合使用Blocks。
4 未來:The Road Ahead
Snow Leopard已經發布了4個月,第三方應用程序已經逐步開始向64位遷移,同時開源社區也完成了GDC向Unix/Linux的整合。視頻、圖像處理,科學計算等專業軟件已經開始64位化:Matlab已經完成64位遷移,Adobe也將在下一代的Creative Suite中實現64位。Snow Leopard通過引入底層新技術,將異步及多線程大力向前推動,隨著個人桌面計算機硬件繼續朝多核心方向發展,異步及多線程必將得到進一步發展。可以預見科學計算軟件很快會收獲OpenGL帶來的速度提升。
Snow Leopard將Mac OS X的內在發展方向定義在更好的使用整體系統資源上,并盡其所能的讓開發人員跟容易利用及分配這些資源。革新操作系統的底層技術暫時無法讓最終用戶明顯感覺到速度的提升和用戶界面的飛躍,但能夠幫助開發人員更好的使用系統資源,更便捷的發揮硬件的效能。隨著越來越多的開發人員開始將新技術應用到程序之中,更多的新特性將被發掘,并最終反饋到用戶的使用過程中。個人桌面操作系統通過底層技術革新正在使越來越多的人可以以更低的成本使用更強大的運算能力。
參考文獻:
[1] Page D.A Practical Introduction to Computer Architecture[M].Springer,2009.
[2] Siracusa J.Mac OS X 10.6 Snow Leopard: the Ars Technica review[M].Condé Nast Digital Business Group,2009.
[3] Singh A.Mac OS X Internals: A Systems Approach[M].Addison Wesley Professional,2006.
[4] Russinovich M.Windows Administration:Inside the Windows Vista Kernel[M].Microsoft Corporation and CMP Media,LLC,2008.
[5] Microsoft Corporation.Best Practices for WOW64[S].2009.
[6] Microsoft Corporation.Running 32-bit applications on 64-bit Windows (including information on Redirection)[S].