每個核心物件只是核心分配的乙個記憶體塊。 並且只能由該核心訪問。該記憶體塊是一種資料結構,它的尵負責維護該物件的各種資訊。有些資料成員(如安全描述符、使用計數器等)在所有的物件型別中都是相同的,但大多數資料成員屬於特定的物件型別。例如,程序物件有乙個程序id、一本基本優先順序和乙個退出**,而檔案物件則擁有乙個位元組位移、乙個共享模式和乙個開啟模式。
ms規定,核心物件只能被核心訪問,因此應該程式無法在記憶體中找到這些資料結構並直接改變他們的內容。其目的是為了確保核心物件結構保持狀態的一致。這個限制也使得使用者可以在不破壞任何應用程式的情況下在這些結構中添、刪除和修改資料成員。
我們不能直接修改,但我們又要修改。於是物件控制代碼便出現了。 當建立乙個核心物件的時候,會返回乙個它的控制代碼。這是乙個不透明的值,你只需要知道它能標誌你建立的這個物件就行了。 而當需要修改核心物件時,只需將這個控制代碼傳入ms為你提供的api,這個api自然知道你需要修改哪個物件。值得注意的是,這些控制代碼值是與程序密切相關的。也就是說,a程序自己建立的控制代碼只能在他自己的程序中,以及它所有的執行緒中使用。如果其它程序試圖訪問這個控制代碼,就會呼叫失敗。當然ms也提供了幾種程序間共享核心物件的方法。
核心物件有乙個引用計數,標誌著你的核心物件被引用了多少次。 因為核心物件是核心所有,所以核心必須知道什麼時候外部不需要使用物件了。 引用計數就是這個目的。 核心物件在第一次建立的時候,計數為1,當另乙個程序訪問它的時候,便會加1。當有程序呼叫closehandle並傳入它的控制代碼時,它的引用計數就減1。當核心檢測到此引用計數為0的時候,便會找個合適的時機釋放掉這個物件。值得說明的是,就算沒有呼叫closehandle,當所有使用這個核心物件的程序退出時,核心也會釋放掉這個物件。因此,可以確保在沒有程序引用該物件的時候,系統中不保留任何核心物件。當然,如果不釋放,則會在程式執行過程中造成記憶體佔用量大的可能。
對於核心物件,我們除了關注其控制代碼外,還應該關注它的安全描述符,雖然這個安全描述符在普通的應用程式(如普通的小軟體,客戶端應用程式等)中不使用。但對於某些場合,如伺服器。或者是對使用者身份有要求的應用程式中卻要使用。 它標誌著訪問此應用程式的許可權。
在建立核心物件時,會傳入乙個 psecurity_attributes 引數 如:
handle hfile,
psecurity_attributes psa,
dword flprotect,
dword dwmaximumsizehigh,
dword dwmaximumsizelow,
pctstr pszname);
大多數應用程式傳遞給psa的是null,這樣物件管理組中的任何成員和物件建立者有著同樣的全部訪問許可權。
psecurity_attributes定義大概如下:
typedef struct _psecurity_attributes psecurity_attributes;
而對於物件的安全描述,則只有第二個成員lpsecuritydescriptor有用。 比如我們想要開啟乙個檔案對映,則可以像如下操作。
傳入file_map_read則表示著你需要開啟此檔案,並在開啟後讀取這個檔案。 此時核心就會進行安全檢查,看是否你有讀取該對映檔案的許可權。而這個檢查則是由你先前建立此檔案對映時傳入的安全描述符而決定。
物件屬性描述符
從 es5 開始,物件的屬性都具備了屬性的描述符,它能設定屬性的特性。我們可以使用 object.defineproperty 來新增或者配置乙個屬性並對它的特性進行配置。屬性有 writable enumerable 和 configurable 這三個或之一都為屬性描述符。一.writable ...
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
神奇的描述符(一) 描述符協議的實現
描述符通過描述符協議實現,任何實現或部分實現以下方法的類,都可以作為描述符使用。def get self,instance,owner def set self,instance,value def delete self,instance get 方法接收三個引數 self為描述符例項自身 ins...