亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

WinCE 進程、線程和內存管理(一)

2019-11-17 04:51:47
字體:
來源:轉載
供稿:網友

  進程、線程、內存治理是一個內核最基本的服務,也是一個內核最主要的組成部分。這幾方面的知識是一個軟件開發人員必須把握的基礎知識。雖然一個人不懂這些知識也能編寫簡單的程序,但這樣的程序只能算是皮毛。把握了進程、線程和內存治理方面的知識,就能夠充分利用操作系統內核提供的服務,提高你編寫的軟件的執行效率、更節省資源、更健壯。順便說一下,在Windows CE.net下可以運行用Visual Studio.net開發的.net平臺上運行的軟件,但這樣的軟件是最上層的軟件,離操作系統內核太遠了。不但執行效率相對較低,而且還要把.net 框架加到內核中。所以在大多數情況下,EVC仍然是第一選擇。

WinCE 進程、線程和內存治理(一)
點擊查看大圖

圖一 CE內核結構

  一、進程和線程

  1、概念:

  Windows CE.NET是一個搶占多任務操作系統,搶占多任務又被稱為調度。在調度過程中,內核的調度系統包含一個當前所有進程中線程的優先級列表,并對所有的線程按優先級排列順序。當中斷發生時,調度系統重新安排所有線程的排列順序。

  一個進程是一個正運行的應用程序的實例。它由兩個部分組成:一個是操作系統用來治理這個進程的內核對象。另一個是這個進程擁有的地址空間。這個地址空間包含應用程序的代碼段、靜態數據段、堆、棧,非Xip(Execute In Place)DLL。從執行角度方面看,一個進程由一個或多個線程組成。一個線程是一個執行單元,它控制CPU執行進程中某一段代碼段。一個線程可以訪問這個進程中所有的地址空間和資源。一個進程最少包括一個線程來執行代碼,這個線程又叫做主線程。

  2、進程:

  Windows CE.NET最多支持32個進程同時運行。這是由整個系統分配給所有進程的總地址空間決定的。低于Windows CE 4.0版本(也就是低于.NET的版本)的CE操作系統,總進程空間從0x0000 0000到0x4200 0000 ,每32MB地址空間為一個槽(Slot),共33個槽。當一個進程啟動時,內核選擇一個沒有被占用的槽作為這個進程的地址空間。其中0x0000 0000到0x01FF FFFF這個槽稱為Slot 0。每個進程在即將得到CPU控制權時,將整個地址映射到Slot 0。這個進程在幫助文檔中稱為當前運行進程(currently running PRocess)。分配一個槽后,內核在這個槽內按由低地址到高地址順序為代碼段、靜態數據段分配足夠的地址空間,然后是堆、棧,棧之后的空間為所有 DLL保留,包括XIP和非XIP DLL。注重Slot 0最底部64KB是永遠保留的。從Slot 1 到 Slot32 為進程使用。前幾個槽一般為系統程序使用。如filesys.exe、device.exe、gwes.exe等。

  Windows CE.NET與低版本操作系統略有不同。這一點是從MSDN 的"Technical Articles"和"Knowledge Base"的文章中找到的,這的確讓我費了一番功夫。在Windows CE.NET的幫助文件中只能找到和早期版本相同的說法,而"Technical Articles"和"Knowledge Base"中有幾篇文章清楚的說明了Windows CE.NET 和低版本操作系統的不同。在低版本操作系統中,的確如上所說分為33個槽,Slot 0用于當前運行進程,共支持32個進程同時運行。而且所有DLL都加載到進程的地址空間。但Windows CE.NET下 Slot 1也用于當前進程(Slot 1只用于加載所有XIP DLL)。那么一個進程就不是占有32MB地址空間了,而是64MB。在講解內存治理時我會具體講解。

  創建一個進程的API函數如下:

BOOL CreateProcess(LPCTSTR lpapplicationName, LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWord dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation );
  Windows CE.NET不支持安全性、當前目錄、繼續性,所以這個函數很多參數都必須設為0或FALSE。具體第3、4、7、8、9設為0,第5設為FALSE。第1參數為應用程序名稱,這個參數不能為NULL。假如只傳遞應用程序名稱而沒有指定路徑,那么系統將先搜索/Windows目錄,接著搜索OEM指定的搜索路徑。第2參數用于傳遞啟動參數,必須為UNICODE碼。第6參數為創建標志??梢詾?(創建一個常規進程)、CREATE_SUSPENDED(啟動后掛起)、DEBUG_PROCESS(用于創建這個進程的父進程調試用)、DEBUG_ONLY_THIS_PROCESS(不調試子進程)、CREATE_NEW_CONSOLE(控制臺進程)。第10參數傳遞給它一個PROCESS_INFORMATION結構變量的地址。返回進程和主線程的句柄和ID。

  終止一個進程最好是由WinMain函數返回。在主線程中調用ExitThread函數也可以。在當前進程終止另一個進程使用TerminateProcess函數。CE下的TerminateProcess函數要比其他Windows下TerminateProcess函數功能強大。TerminateThread函數的危險在于,此函數一旦成功執行,指定的線程會馬上終止執行,那么可能有很多的結束處理工作還沒來得及進行,但是此線程加載的DLL會被通知結束執行。要調用TerminateThread函數就必須先了解要終止的線程的具體情況。另外假如指定的線程正在執行系統API調用時,TerminateThread函數不能馬上終止此線程的執行,而是在API函數執行完畢后才退出。所以使用TerminateThread前必須對線程的具體情況要了解。

  3、線程:

  線程除了能夠訪問進程的資源外,每個線程還擁有自己的棧。棧的大小是可以調整的,最小為1KB或4KB(也就是一個內存頁。內存頁的大小取決于CPU),一般默認為64KB,但棧頂端永遠保留2KB為防止溢出。假如要改變棧初始時大小,在EVC"Project"-"Settings"-"Link"鏈接選項"/STACK"后的參數中指定大小。其中參數1為默認大小,參數2為一個內存頁大小,都用十六進制表示。假如將棧的初始值設置太小,很輕易導致系統訪問非法并立即終止進程。

  線程有五中狀態,分別為運行、掛起、睡眠、阻塞、終止。當所有線程全部處于阻塞狀態時,內核處于空閑模式(Idle mode),這時對CPU的電力供給將減小。

  創建一個線程的API函數如下:


HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId );
  Windows CE.NET 不支持安全性所以參數1必須設置為0。假如參數5為STACK_SIZE_PARAM_IS_A_RESERVATION,那么參數2可以指定棧的大小,內核將按照參數2的數值來為此線程擁有的棧保留地址空間。假如參數5不為STACK_SIZE_PARAM_IS_A_RESERVATION,那么參數2必須設置為0。參數3為執行路徑的首地址,也就是函數的地址。參數4用來向線程中傳遞一個參數。參數5除了上面說明外,還可以為0、CREATE_SUSPENDED。CREATE_SUSPENDED表示這個線程在創建后一直處于掛起狀態,直到用ResumeThread函數來恢復。最后一個參數保存函數返回的創建的線程ID。

  退出一個線程同退出一個進程有類似的方法。最好是由函數返回,在線程中調用ExitThead函數也可以。

  Windows CE.NET不像其他Windows操作系統將進程分為不同的優先級類,Windows CE.NET只將線程分為256個優先級。0優先級最高,255最低,0到248優先級屬于實時性優先級。0到247優先級一般分配給實時性應用程序、驅動程序、系統程序。249到255優先級中,251優先級(THREAD_PRIORITY_NORMAL)是正常優先級。255優先級(THREAD_PRIORITY_IDLE)為空閑優先級。249優先級(THREAD_PRIORITY_HIGHEST)是高優先級。248到255優先級一般分配給普通應用程序線程使用。具體分段見下表:

優先級范圍分配對象 0-96高于驅動程序的程序 97-152 基于Windows CE的驅動程序 153-247低于驅動程序的程序 248-255 普通的應用程序  
  Windows CE.NET操作系統具有實時性,所以調度系統必須保證高優先級線程先運行,低優先級線程在高優先級線程終止后或者阻塞時才能得到CPU時間片。而且一旦發生中斷,內核會暫停低優先級線程的運行,讓高優先級線程繼續運行,直到終止或者阻塞。具有相同優先級的線程平均占有CPU時間片,當一個線程使用完了CPU時間片或在時間片內阻塞、睡眠,那么其他相同優先級的線程會占有時間片。這里提到的CPU時間片是指內核限制線程占有CPU的時間,默認為100ms。OEM可以更改這個值,甚至設置為0。假如為0,當前線程將一直占有CPU,直到更高優先級線程要求占有CPU。這個調度算法似乎是很有效、很完美,但卻存在著一種情況,當這種情況發生時程序會死鎖。舉例來說:一個應用程序包含兩個線程,線程1是高優先級,線程2是低優先級,當線程1運行過程中處于阻塞時,線程2得到時間片,線程2這次進入了一個臨界區,我們都知道臨界區內的資源是不會被其它線程訪問的,當線程2正運行時,線程1已經從阻塞狀態轉變為運行狀態,而這次線程1卻要訪問線程2的資源,這個資源卻被臨界區鎖定,那么線程1只能等待,等待線程2從臨界區中運行結束并釋放資源的獨占權。但是線程2卻永遠不會得到時間片,因為CE保證高優先級線程會先運行。這時程序就會處于死鎖狀態。當然系統不會死鎖,因為還有更高優先級的線程、驅動程序在運行。對于這種情況,CE采取優先級轉換的辦法來解決。就是當發生這種情況時,內核將線程2的優先級提高到線程1的優先級水平。這樣線程2就可以執行完臨界區代碼了,線程1也就能夠訪問資源了。然后內核再恢復線程2原來的優先級。

  掛起一個線程使用SuspendThread函數。參數只有一個――線程的句柄。要說明的是假如要掛起的線程正調用一個內核功能,這時執行此函數可能會失敗。需要多次調用此函數直到函數返回值不為0xFFFFFFFF,說明掛起成功?;謴途€程使用ResumeThread函數。參數也只有一個――線程的句柄。

  關于線程本地存儲器和纖程,實際用到的時候非常少,這部分知識可以參考《Windows核心編程》。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中国日韩欧美久久久久久久久| 国产日韩欧美视频在线| 在线中文字幕日韩| 91sao在线观看国产| 亚洲男人天天操| 国产精品第七影院| 亚洲国产美女久久久久| 91免费人成网站在线观看18| 欧美色图在线视频| 精品无人区太爽高潮在线播放| 亚洲人午夜色婷婷| 黄色精品在线看| 97成人在线视频| 日韩av不卡在线| 国产热re99久久6国产精品| 亚洲国产日韩欧美在线图片| 亚洲第一精品夜夜躁人人躁| 国内偷自视频区视频综合| 日韩精品免费观看| 国产精品视频久久久| 欧美性猛交xxxx乱大交蜜桃| 欧美性受xxxx黑人猛交| 欧美成人免费小视频| 亚洲人成电影网站色www| 亚洲男人7777| 粉嫩av一区二区三区免费野| 国产一区二区成人| 欧美疯狂性受xxxxx另类| 欧美精品日韩三级| 亚洲男人第一网站| 日本午夜精品理论片a级appf发布| 国产日韩欧美91| 欧美一级大片在线观看| 久久艹在线视频| 成人精品视频久久久久| 在线播放精品一区二区三区| 动漫精品一区二区| 国产精品久久久久影院日本| 在线播放国产一区中文字幕剧情欧美| 色老头一区二区三区在线观看| 韩国三级电影久久久久久| 国产在线拍揄自揄视频不卡99| 国产成+人+综合+亚洲欧美丁香花| 国产精品96久久久久久又黄又硬| 欧美日本啪啪无遮挡网站| 中文字幕久精品免费视频| 欧美黑人xxxⅹ高潮交| 91精品视频在线播放| 欧美成人免费大片| 午夜精品久久17c| 欧美精品久久一区二区| 国产激情久久久| 日韩中文字在线| 97在线免费视频| 色哟哟亚洲精品一区二区| 精品中文视频在线| 国产精品福利在线| 欧美刺激性大交免费视频| 美乳少妇欧美精品| 亚洲一区二区久久久久久| 成人福利免费观看| 亚洲精品ady| 韩剧1988免费观看全集| 日韩精品在线免费播放| 欧美高清电影在线看| 精品国产美女在线| 亚洲精品www| 中文字幕亚洲一区二区三区| 91亚洲精品视频| 秋霞成人午夜鲁丝一区二区三区| 日本一区二区在线播放| 精品久久久久人成| 91久久精品在线| 一本色道久久88精品综合| 国产福利视频一区二区| 成人精品久久av网站| 国产精品视频999| 亚洲欧美国产一本综合首页| 日本久久亚洲电影| 国模吧一区二区三区| 色综合亚洲精品激情狠狠| 久久久噜噜噜久久| 欧洲亚洲免费视频| 国产精品久久婷婷六月丁香| 精品调教chinesegay| 亚洲自拍高清视频网站| 日韩在线视频免费观看| 97精品国产91久久久久久| 亚洲一级片在线看| 日本精品va在线观看| 最近2019中文免费高清视频观看www99| 久青草国产97香蕉在线视频| 国产精品色午夜在线观看| 欧美最猛性xxxx| 亚洲欧洲视频在线| 国产精品福利网| 亚洲欧美激情另类校园| 色偷偷av一区二区三区乱| 日韩亚洲欧美成人| 色综合亚洲精品激情狠狠| 日韩在线观看免费av| 91高清在线免费观看| 国产精品视频久久久久| 久久大大胆人体| 狠狠干狠狠久久| 国产午夜精品视频免费不卡69堂| 欧美人与物videos| 亚洲激情电影中文字幕| 国内精品久久久久久| 精品久久久久人成| 国产99视频在线观看| 日产精品久久久一区二区福利| 国产精品视频免费观看www| 久久亚洲精品一区| 国产在线拍偷自揄拍精品| 亚洲人在线观看| 亚洲第一网中文字幕| 亚洲欧美激情在线视频| 福利二区91精品bt7086| 久久久精品国产一区二区| 欧美日本在线视频中文字字幕| 亚洲国产精品免费| 国语自产精品视频在线看一大j8| 色噜噜国产精品视频一区二区| 高清欧美性猛交| 精品五月天久久| 精品欧美aⅴ在线网站| 日韩欧美国产成人| 欧美成人一区在线| 亚洲国产精品va在看黑人| 亚洲乱码一区二区| 国产精品久久久久国产a级| 国产精品青青在线观看爽香蕉| 国产精品嫩草影院久久久| 中文字幕在线成人| 色琪琪综合男人的天堂aⅴ视频| 成人黄色影片在线| 亚洲自拍偷拍在线| 欧美专区中文字幕| 91精品久久久久久久久久另类| 欧美整片在线观看| 久久精品最新地址| 亚洲a在线观看| 狠狠躁夜夜躁人人爽超碰91| www.午夜精品| 91在线观看免费观看| 久久亚洲一区二区三区四区五区高| 在线观看免费高清视频97| 在线日韩欧美视频| 亚洲欧美日韩在线高清直播| 欧美一级大片视频| 亚洲一区二区中文| 久久久久中文字幕2018| 欧美洲成人男女午夜视频| 555www成人网| 亚洲电影免费在线观看| 亚洲欧美成人在线| 欧美在线一级va免费观看| 亚洲人成在线电影| 欧美亚洲另类制服自拍| 国产精品美女视频网站| 国产精品电影网| 国产精品日韩在线| 色婷婷综合久久久久中文字幕1|