什麼是控制代碼?為什麼會有控制代碼?HANDLE

來源:互聯網
上載者:User

從廣義上,能夠從一個數值拎起一大堆資料的東西都可以叫做控制代碼。控制代碼的英文是"Handle",本義就是"柄",只是在電腦科學中,被特別地翻譯成"控制代碼",其實還是個"柄"。從一個小東西拎起一大堆東西,這難道不像是個"柄"嗎?

然後,指標其實也是一種"控制代碼",只是由於指標同時擁有更特殊的含義——實實在在地對應記憶體裡地一個地址——所以,通常不把指標說成是"控制代碼"。但指標也有著能從一個32位的值引用到一大堆資料的作用,這不是控制代碼又是什嗎?

Windows系統中有許多核心對象(這裡的對象不完全等價於"物件導向程式設計"一詞中的"對象",雖然實質上還真差不多),比如開啟的檔案,建立的線程,程式的視窗,等等。這些重要的對象肯定不是4個位元組或者8個位元組足以完全描述的,他們擁有大量的屬性。為了儲存這樣一個"對象"的狀態,往往需要上百甚至上KB的記憶體空間,那麼怎麼在程式間或程式內部的子過程(函數)之間傳遞這些資料呢?拖著這成百上千的位元組拷貝來拷貝去嗎?顯然會浪費效率。那麼怎麼辦?當然傳遞這些對象的首地址是一個辦法,但這至少有兩個缺點:

  1. 暴露了核心對象本身,使得程式(而不是作業系統核心)也可以任意地修改對象地內部狀態(首地址都知道了,還有什麼不能改的?),這顯然是作業系統核心所不允許的;
  2. 作業系統有定期整理記憶體的責任,如果一些記憶體整理過一次後,對象被搬走了怎麼辦?

所以,Windows作業系統就採用進一步的間接:在進程的地址空間中設一張表,表裡頭專門儲存一些編號和由這個編號對應一個地址,而由那個地址去引用實際的對象,這個編號跟那個地址在數值上沒有任何規律性的聯絡,純粹是個映射而已。

在Windows系統中,這個編號就叫做"控制代碼"。

 

Handle在Windows中的含義很廣泛,以下關於談到的Handle除非特別說明,將僅限於進程、線程的上下文中。

1、先來談談Handle

Handle本身是一個32位的不帶正負號的整數,它用來代表一個核心對象。它並不指向實際的核心對象,使用者模式下的程式永遠不可能獲得一個核心對象的實際地址(一般情況下)。那麼Handle的意義何在?它實際上是作為一個索引在一個表中尋找對應的核心對象的實際地址。那麼這個表在哪裡呢?每個進程都有這樣的一個表,叫控制代碼表。該表的第一項就是進程自己的控制代碼,這也是為什麼你調用GetCurrentProcess()總是返回0x7FFFFFFF原因。

簡單地說,Handle就是一種用來"間接"代表一個核心對象的整數值。你可以在程式中使用handle來代表你想要操作的核心對象。這裡的核心對象包括:事件(Event)、線程、進程、Mutex等等。我們最常見的就是檔案控制代碼(file handle)。

另外要注意的是,Handle僅在其所屬的進程中才有意義。將一個進程擁有的handle傳給另一個進程沒有任何意義,如果非要這麼做,則需要使用DuplicateHandle(),在多個進程間傳遞Handle是另外一個話題了,與這裡要討論的無關。

2、進程ID

首先,進程ID是一個32位不帶正負號的整數,每個進程都有這樣的一個ID,並且該ID在系統範圍內是唯一的。系統使用該ID來唯一確定一個進程。

深入些說,系統可能使用進程ID來計算代表該進程的核心對象的基地址(及EPROCESS結構的基地址),具體的計算公式你可以去問微軟的OS開發人員。

3、HINSTANCE

HINSTANCE也是一個32不帶正負號的整數,它表示程式載入到記憶體中的基地址。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.