句柄的由來[1]
windows 之是以要設立句柄,根本上源于記憶體管理機制的問題—虛拟位址,簡而言之資料的位址需要變動,變動以後就需要有人來記錄管理變動,(就好像戶籍管理一樣),是以系統用句柄來記載資料位址的變更。
資料對象加載進入記憶體中之後即獲得了位址,但是這個位址并不是固定的,(至于為什麼以及什麼情況下變動具體需要大家研究虛拟位址的原理與機制我這裡隻提我确定知道的例子)資料對象會根據需要在記憶體與硬碟之間遊弋移動(例如不常用的資料會為常用資料讓出其占用的記憶體空間進而被淘汰進硬碟中的虛拟記憶體之中以優化配置整體系統的資源進而提升效率性能),是以其實體位址總是變動的,那麼作為管理者 則必須對 管理對象所發生的變化了如指掌才行,是以系統為程序配置設定固定的位址(句柄)來存儲程序下的資料對象變化後的位址也就是目前的位址,其實設計機制很簡單 :系統的某個部門移動了對象的位址後,同時上報給句柄所屬部門管理者,管理者将改動寫入句柄即可。該資料被重新起用時去其所屬句柄内按内容存取即可。
句柄,英文:HANDLE,在Windows程式設計中是一個很重要的概念,在許多地方都扮演着重要的角色。但由此而産生的句柄概念也大同小異,比如:《Microsoft Windows 3 Developer's Workshop》(Microsoft Press,by Richard Wilton)一書中句柄的概念是:在Windows環境中,句柄是用來辨別項目的。
在程式設計中,句柄是一種特殊的智能指針 。當一個應用程式要引用其他系統(如資料庫、作業系統)所管理的記憶體塊或對象時,就要使用句柄。
句柄與普通指針的差別在于,指針包含的是引用對象的記憶體位址,而句柄則是由系統所管理的引用辨別,該辨別可以被系統重新定位到一個記憶體位址上。這種間接通路對象的模式增強了系統對引用對象的控制。
在上世紀80年代的作業系統(如Mac OS 和Windows)的記憶體管理中,句柄被廣泛應用。Unix系統的檔案描述符基本上也屬于句柄。和其它桌面環境一樣,WindowsAPI大量使用句柄來辨別系統中的對象,并建立作業系統與使用者空間之間的通信管道。例如,桌面上的一個窗體由一個HWND類型的句柄來辨別。如今,記憶體容量的增大和虛拟記憶體算法使得更簡單的指針愈加受到青睐,而指向另一指針的那類句柄受到冷淡。盡管如此,許多作業系統仍然把指向私有對象的指針以及程序傳遞給用戶端的内部數組下标稱為句柄。[2]
WINDOWS程式中并不是用實體位址來辨別一個記憶體塊,檔案,任務或動态裝入子產品的。相反,WINDOWS API給這些項目配置設定确定的句柄,并将句柄傳回給應用程式,然後通過句柄來進行操作。