星期日, 10月 22, 2006

CE book Notes : Process and IPC objects

以下是"Building Powerful Platform with Windows CE"的筆記..



和大部分的Realtime OS一樣...

Program ,Process,Thread

在Storage中,還沒活化(也就是說,還沒有依照program header alloc memory, 給他用,還沒將run-time 環境設好的狀態)。叫Program。
Program活化後,就叫Process,Process有自己的memory space,OS 用virtual memory的方式為每個process提供自己的memory space,並且保護不讓彼此影響,也不會影響到OS。
Thread是OS scheduler的排程單位,每個Process都是自己的"Pimary Thread",當然,可以create 多個Thread,方便設計,同一個Process的Thread都和share同一個memory space,所以可以互相access彼此宣告的變數。

Thread可以run在kernel mode或是user mode,這是由CE kernel決定的,一般ISR thread會run在kernel mode,其他就run在user mode,kernel mode的thread可以access所有kernel resource,所以也可以crash kernel。

在kernel mode執行的thread 效能會比較好一點,因為減少了access right check的時間。所以如果你很勇敢的話,可以啟動"full kernel mode"選項,讓所有的process (thread) 都run在kernel mode。


Process是用CreateProcess( )來啟動,argument是Process的對應program name,可以在argument中直接指定program所在的path,不然kernel會依照 "WINDOWS", "\","PPSHELL","."。OEM 可以在registry : HKEY_LOCAL_MACHINE\Loader\SystemPath 中寫入search path string。

Thread用CreateThread( )來啟動,argument是thread的function address (pointer),還有一個argument是用來傳遞給這個thread的working space,通常是一個structure。Thread可以啟動在suspend mode,然後用ResumeThread 恢富工作。


Schedler

CE的schedule是preemptive,priority, time-slice base。預設的tread quantum是100ms,OEM可以在kernel 啟動時設定自己要的thread quantum。

每個thread可以有0-255 的priority,0是最高的priority。當有很多thread是相同的priority時,scheduler採用round robin的方式。


Synchronization

和其他RTOS一樣,CE也有Mutex,Semaphore,Events,Critical Section用於IPC的object。每個object在使用前都要用create來取得一個handle作溝通用。thread可以用WaitForSingleObject 或是WaitForMultipleObject 來wait(取得)單一或多個IPC object。
所以syhchronization object的用法通常是宣告一個global variable 的object handle,在還沒使用前create他,然後各thread用這個global variable來操作。

Mutex 就是簡單的互斥物件,CE為了防止programmera acqure到一個mutex後還沒release就又acquire他,設計成"acquire一個已經擁有的mutex時,會馬上return,不會被block..。

Semaphore 可以看作是counting mutex,在create semaphore時可以決定他的available number是多少(32 bit int)。

Events是用來"通知"的object,一個thread可以signle 一個event,讓wait 這個event的thread知道該事件已經發生。CE的設計是:當有多個thread都在wait同一個event,只有第一個wait這個event的thread會return。

Critical Section 用EnterCriticalSection和LeaveCriticalSection來形成一個不會被swap out 的code section。(但是不清楚ISR會不會也被disable)。


Communication between Process


剛剛講的都是Thread之間的IPC,因為同一個process的thread都在同一個memory space,所以可以用共用變數來傳遞IPC object handle。但是在Process間就不能這樣用了,因為Process間有OS的virtual memory 隔開,不互相存取對方的變數。所以Process間的IPC就要用其他的方法。

CE利用Windows Message作為Process間同步的機制,一樣,要使用前,必須要用RegisterWindowsMessage向kernel 索取一個沒有人用的message id,然後用這個message來傳遞資料給其他Process (那其他Process怎麼會知道他要對哪一個Message ID反應?)。

傳遞message時,可以同時包含兩個參數: lParam, wParam。都是DWORD,這也就代表只能傳遞 8 bytes的資料,如果要傳更大的資料,就要先用structure包裝好,然後將structure pointer放在lParam中,但是因為Process間的virtual memory mapping是不同的,所以光傳address過去,對方也取不到你的memory 資料。為此,要使用WM_COPYDATA這一個message來傳遞參數才行,這個message的lParam是COPYDATASTRUCT型別,包含一個pointer和一個size,kernel會負責將size的資料copy到對方的空間。這樣的需求(kernel幫忙處理),就要用SendMessage這一個function來傳遞WM_COPYDATA,讓kernel在將message交到reciver process前,先將data copy好。

3 則留言:

KX 提到...

Hello Checko,

Q:Is it possible that Process A can share memory with Process B?

It seems to can use CreateFileMapping ,but I can't understand how to do it?
Linux has shm(shared memory)API, and socket, pipe for IPC, but WinCE ?

Thanks.

Kany Li 提到...

Yes, try to catch Memory Map File, or using IPC as keywords in MSDN. You will find a lot.

Kany Li 提到...

Yes, try to catch Memory Map File, or using IPC as keywords in MSDN. You will find a lot.

網誌存檔