2004年7月6日 20點20分
書接上回
1.進程的內核對象句柄表
當一個進程被初始化時,系統要爲它分配一個句柄表.該句柄表只用於內核對象不用於用戶對象或GDI對象.句柄表它只是個數據結構的數組,每個結構都包含一個指向內核對象的指針,一個訪問屏蔽和一些標誌.
句柄表如圖如示
索引 |
內核對象內存塊的指針 |
訪問屏蔽(標誌位的DWORD) |
標誌 |
1 |
0x???????? |
0x???????? |
0x???????? |
2 |
0x???????? |
0x???????? |
0x???????? |
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
當進程第一次被初始化時,它的句柄表是空的,當進程中的線程調用創建內核對象的函數時,內核就爲該對象分配一個內存塊,並對它初始化。初始化的過程是,內核對進程的句柄表掃描,找一個空項。然後初始化內核對象內存塊的指針,訪問屏蔽,標誌。
2.創建內核對象
創建內核對象的函數例如
HANDLE CreateThread(…..)
HANDLE CreateFile(……)
HANDLE CreateFileMapping(……)
HANDLE CreateSemaphore(…….)
這些創建內核對象返回的句柄是放入進程的句柄表中的索引,其用於標識內核對象的信息存入的位置., 在win2000中返回的值用於標識放入進程的句柄表的該對象的字節數,而不是索引號.
3.關閉內核對象
BOOL CloseHandle(HANDLE hobj)
此函數首先檢查調用進程的句柄表,以確保傳遞給經的索引用標識一個進程,如果該索引是有效的,那麼系統就可以獲得內核對象的數據結構的地址,計數等,它會清除進程的句柄表中的項,此時該句柄對你的進程就無效了。如果計數爲0,該內核便從內存中撤消該內核對象,如果不爲0,也會執行closeahandle操作,計數減1,標識着系統中還有別的進程對此對象進行訪問,當其它進程停止使用該對象時(也就是也執行了closehandle操作),該對象將被撤消。
Q:如果沒有調用CloseHandle函數, 會不會出現內存泄漏呢?
A:這是可能的,當進程終止運行了,系統會自動掃描進程的句柄表,如果在終止進程運行前沒有關閉對象,系統將關閉這些對象句柄,如果對象的使用計數爲0, 內核便撤消該對象,但如果不爲0, 那麼就會出現內存泄漏。
4.跨越進程邊界共享內核對象
這就是說,在不同進程中運行的線程需要共享內核對象.
比如
1:文件映射 在同一臺機器上運行的兩個進程之間共享數據塊
2.管道使得應用程序能夠在連風的不同機器上運行的進程之間發送數據塊
3.互斥對象,事件使得不同進程中的線程能夠同步它們的連續運行,就像一個程序在完成某項任務時需要將情況通知另一個應用程序的情況相同.
前一斷時間由於工作比較忙,沒有來得及更新,請大家見諒
上面只簡單的介紹的一些進程的相關知識,後續將詳細介紹.(待續)