核心物件和控制代碼的介紹及注意事項

2021-08-27 15:27:26 字數 2098 閱讀 7400

核心物件,控制代碼

系統會建立幾種型別的核心物件,比如訪問令牌物件、事件物件、檔案物件、檔案對映物件、i\o完成埠物件、作業物件、郵件槽物件、互斥量物件、管道物件、程序物件、訊號量物件、執行緒物件、可等待計時器物件、執行緒池工廠物件等。

每個核心物件都只是乙個記憶體塊,它由作業系統核心分配,並只能由作業系統核心訪問。這個記憶體塊是乙個資料結構,其成員維護著與物件相關的資訊。

由於核心物件的資料結構只能由作業系統核心訪問,所以應用程式不能在記憶體中定位這些資料結構並直接更改其內容。microsoft有意識強化了這個限制,確保核心物件結構保持一致性狀態。

呼叫乙個會建立核心物件的函式後,函式會返回乙個控制代碼(handle),它標識了所建立的物件。可以將這個控制代碼想象為乙個不透明的值,它可由程序中的任何執行緒使用。在32位 windows程序中,控制代碼是乙個32位的值;在64位windows程序中,則是乙個64位的值。

為了增強作業系統的可靠性,這些控制代碼值是與程序相關的。所以,如果將控制代碼值傳給另乙個程序中的執行緒(通過某種程序間通訊方式),那麼另乙個程序用我們的程序的控制代碼值來發出呼叫時,就有可能失敗;甚至更糟糕的是,它們會根據該控制代碼在我們的程序控制代碼表的索引來引用另乙個程序中的完全不同的核心物件。

核心物件的所有者是作業系統核心,而非程序。  如果我們的程序呼叫了乙個函式建立了乙個核心物件,然後程序終止執行,則核心物件並不一定會銷毀。大多數情況下,這個核心物件是會銷毀的,但假如另乙個程序正在使用我們的程序建立的核心物件時,那麼在其他程序停止之前,這個核心物件時不會銷毀的。總之,核心物件的生命週期可能長於建立它的那個程序。

作業系統核心知道當前有多少個程序正在使用乙個特定的核心物件,因為每個物件都包含了乙個使用計數。如果一旦物件的使用計數變成0,作業系統核心就會銷毀物件。

程序的控制代碼表結構

包括  索引,指向核心物件記憶體塊的指標,訪問掩碼(包含標誌位的乙個dword),標誌

建立執行緒,檔案,檔案對映,訊號量等,這些用於建立核心物件的任何函式都會返回乙個與程序相關的控制代碼,這個控制代碼可由用乙個程序中執行的所有執行緒使用。

呼叫乙個函式時,如果它接受乙個核心物件控制代碼作為引數,就必須把create* 函式返回的值傳遞給它。在內部,這個函式會查詢程序的控制代碼表,獲得目標核心物件的位址,然後以乙個恰當的方式來操縱物件的資料結構。

凡是用於建立核心物件的函式,在檢查他們的返回值時,務必相當仔細。

在只有呼叫createfile時,才能將它的返回值與invalid_handle_value進行比較。

而其他create* 呼叫通常是返回null的   

所以比較時,應注意

關閉核心物件

應注意,如果傳給closehandle函式的是乙個無效的控制代碼,那麼可能發生以下兩種情況之一:

如果程序是正常執行的,closehandle將返回false,而getlasterror返回rror_invalid_handle。如果程序正在被除錯,那麼系統將跑出0xc0000008異常(指定了無效的控制代碼),便於我們除錯這個錯誤。

就在closehandle函式返回之前,它會清除程序控制代碼中對應的記錄項——這個控制代碼現在對我們的這個程序已經無效了,不要在試圖用它。無論核心物件當前是否被銷毀,這個清除操作過程都會發生的! 一旦呼叫了closehandle,我們的程序就不能訪問那個核心物件;但是,如果物件的使用計數還沒有遞減至0,它就不會被銷毀。這是完全正常的;它表明另外還有乙個或多個程序在使用該物件。當其他程序(通過呼叫closehandle)全部停止使用這個物件後,物件就會被銷毀。

如果忘記呼叫closehandle,不一定會發生物件的洩漏情況。

在程序執行期間,程序可能發生資源洩漏的情況。

但是,當程序終止執行,作業系統會確保此程序使用的所有資源都被釋放——這是可以保證的!

對於核心物件,作業系統執行的是以下操作:

程序終止時,系統自動掃瞄該程序的控制代碼表。如果這個表中有任何有效的記錄項(即程序終止前沒有關閉的物件),作業系統會為我們關閉這些物件控制代碼。只要這些物件中有乙個的使用計數遞減至0,核心就會銷毀物件。

所以在應用程式執行時,它可能會洩漏核心物件;但當程序終止執行,系統能保證一切都被正確清除。

如何檢視核心物件?   windows任務管理器    選擇  檢視->選擇列->選擇程序頁列,指定在程序選項卡中顯示控制代碼數列。

介紹和注意事項

該工具包使您能夠通過允許ibm bpm讀取infosphere mdm事務建立的xml來整合infosphere mdm和ibm bpm。該工具包允許針對infosphere mdm使用任何事務,因此您不再侷限於事務的子集。另外,您可以通過簡單地將工具包匯入應用程式來使用整合。您不再需要執行大量部署...

C C 建立物件及注意事項

c 的物件建立方式有3種,詳細見以下 所示。include using namespace std class test test int main 三種方式中,第一種和第二種分別為隱式呼叫和顯示呼叫,兩者都是在程序的虛擬位址空間的棧空間中分配記憶體。第三種方式使用了關鍵字new,是在堆空間中分配記...

Mat物件的使用及注意事項

1,什麼是mat物件 見下圖 mat物件封裝了影象在記憶體中的資訊,用於表示一副載入到記憶體中的影象,是opencv2.0以後引入的 相比之前的ipimage物件,具有自動分配記憶體,不存在記憶體洩漏的優點,mat物件分為頭部與資料部分。2,mat物件的使用 因為mat物件分為頭部和資料兩部分,所以...