操做系統中的句柄是什麼?(轉)

1.這裏將句柄所能標識的全部東西(如窗口、文件、畫筆等)統稱爲「對象」。html

2.圖中一個小橫框表示必定大小的內存區域,並不表明一個字節,如標有0X00000AC6的橫框表示4個字節。程序員

  

程序運行到某時刻的內存快照               程序日後運行到另外一時刻時的內存快照spa

 

Windows是一個以虛擬內存爲基礎的操做系統,不少時候,進程的代碼和數據並不所有裝入內存,進程的某一段裝入內存後,還可能被換出到外存,當再次須要時,再裝入內存。兩次裝入的地址絕大多數狀況下是不同的。也就是說,同一對象在內存中的地址會變化。那麼,程序怎麼才能準確地訪問到對象呢?爲了解決這個問題,Windows引入了句柄。操作系統

系統爲每一個進程在內存中分配必定的區域,用來存放各個句柄,即一個個32位無符號整型值(32位操做系統中)。每一個32位無符號整型值至關於一個指針,指向內存中的另外一個區域(咱們不妨稱之爲區域A)。而區域A中存放的正是對象在內存中的地址。當對象在內存中的位置發生變化時,區域A的值被更新,變爲當前時刻對象在內存中的地址,而在這個過程當中,區域A的位置以及對應句柄的值是不發生變化的。這種機制,用一種形象的說法能夠表述爲:有一個固定的地址(句柄),指向一個固定的位置(區域A),而區域A中的值能夠動態地變化,它時刻記錄着當前時刻對象在內存中的地址。這樣,不管對象的位置在內存中如何變化,只要咱們掌握了句柄的值,就能夠找到區域A,進而找到該對象。而句柄的值在程序本次運行期間是絕對不變的,咱們(即系統)固然能夠掌握它。.net

因此,咱們能夠這麼理解句柄:指針

數值上,是一個32位無符號整型值(32位系統下);htm

邏輯上,至關於指針的指針;對象

形象理解上,是Windows中各個對象的一個惟一的、固定不變的ID;blog

做用上,Windows使用句柄來標識諸如窗口、位圖、畫筆等對象,並經過句柄找到這些對象。進程

 

關於句柄,再交代一些關鍵性細節:

1.所謂「惟一」、「不變」是指在程序的一次運行中。若是本次運行完,關閉程序,再次啓動程序運行,那麼此次運行中,同一對象的句柄的值和上次運行時比較,通常是不同的。

其實這理解起來也很天然,所謂「一把歸一把,這把是這把,那把是那把,二者不相干」(「把」是形象的說法,就像打牌同樣,這裏指程序的一次運行)。

2.句柄是對象生成時系統指定的,屬性是隻讀的,程序員不能修改句柄。

3.不一樣的系統中,句柄的大小(字節數)是不一樣的,可使用sizeof()來計算句柄的大小。

4.經過句柄,程序員只能調用系統提供的服務(即API調用),不能像使用指針那樣,作其它的事。

 

參考連接:

http://www.javashuo.com/article/p-kcvgnmug-ev.html

 

原文:https://blog.csdn.net/qq_35642036/article/details/82798921

相關文章
相關標籤/搜索