昨天去研華聽了一場微軟嵌入式多媒體講座。其實我對講座本身倒不太在意,我是沖着CE6的評估版CD光牒去,拿到CD光牒後不久就撤了,呵呵。雖然可以從網上直接 下載下傳,但是放在硬碟裡還是很占地方的,自己刻CD光牒也嫌麻煩。到的時候晚了幾分鐘,好在講座也沒正式開始,微軟的哥們正在向不辭勞苦跋山涉水提前趕到的同志 們噴CE6和CE5的差別。
說到差別,CE6引入的新的虛拟記憶體模型是不能不提的。有人就問了一個問題,說CE5中所有程序共享一份虛拟空間,在CE6中每個程序有自己單獨的虛拟空 間,會不會導緻性能的下降?這顯然是一個CE的開發者都很關心的問題,不過微軟這哥們看來沒好好研究過CE的系統核心機制,回答得不得要領,隻是含糊的說 從測試結果看CE6和CE5的性能看起來差不多。
這個問題其實不難回答。所有程序共享一份虛拟空間和每個程序有自己的虛拟空間,這裡面有什麼差別?主要的差別也就是CE5中一個程序可以直接通路另一個進 程的記憶體,而CE6中不可以(得用ReadProcessMemory之類API)。是以看起來在CE6在記憶體通路方面确實是慢了,但問題的關鍵在于,哪 些情況下一個程序會直接去通路另一個程序的記憶體?一般場合下,應用程式是不會也不應該直接通路其他程序記憶體的,如果需要程序間通信,應該用file mapping之類的标準技術。在CE5中,隻有一類情況是比較特殊的,可能會需要對其他程序的直接記憶體通路,那就是裝置驅動程式(用 MapCallerPtr或MapPtrToProcess)。這又涉及到CE6的另一處改進。在CE6中,裝置驅動程式現在可以挪到kernel程序 中。這對性能意味着什麼?在程序間記憶體通路上,驅動程式得用memory marshalling技術來替代原先的直接通路,這确實比原來慢了。但是在核心程序運作的代碼在API調用方面性能提高了-對NK.EXE的API和原 先通過PSL(Protected Server Libraries)實作的API(filesys.exe, gwes.exe, device.exe)都可以直接調用(因為都在kernel程序裡)。正負兩方面的影響互相抵消,使得裝置驅動程式在性能上可能和原先差不多(當然實際 情況還得看具體的程式)。但是從另外一方面來看,裝置驅動程式移入核心程序對應用程式的性能提升是有很大好處的。因為原先通過PSL技術實作的API(如 BitBlt等GDI函數),由于每次調用process context都需要切換到server process context(如gwes.exe),開銷還是很大的,當年Windows NT就因為類似的原因把GDI子產品移入了核心中。
在CE5 下開發經常讓我有一種回到了WIN16時代的錯覺。可以直接通路其他程序的記憶體簡直是一種誘惑,我的WinCE Remote Process Explorer裡很多地方就這麼幹了,移植到CE6,這個問題是最麻煩的。CE6則在很多方面和XP越來越像。雖然我還沒有用過CE6,但我相信總體來 說CE6的性能應該是會比CE5快的。