軟件開發技術名詞的解密篇(3)-ATL,HANDLE,DLL,Process,Thread

"ATL":Active Template Library,活動模板庫
  這在VC編程下應該算是比較高級的話題了,它集COM和模板技術於一身,帶來了極方便的組件編寫方法和極高的學習門檻。可以說,進入ATL領域就算是進入了中級以上的編程領域。ATL是爲組件而生,它的目的是爲了讓程序員更方便地編寫組件(純用C++寫一個最簡單的組件實現一個“Hello World”對初學者來說都是要命的),同時它使用模板技術來類似於MFC一樣建立了一個開發COM的框架代碼庫(模板庫),使用該框架及模板庫可以相對方便地進行組件開發。ATL中的一個特點就是你自己的類將成爲ATL代碼庫中某些類的父類,這是一件很有趣的事(這也是模板技術的一個特點)。

  "HANDLE": 句柄
  這是一箇中文翻譯很古怪的字,對初學者來說是百思不得其解的東東。這其實等價於void*(順便提一下,初學者往往對VC代碼中各種古怪的符號、類型標記/宏等百思不得其解,其實它們大多來自基本類型的#define或者typedef,請將光標移到這些符號上(譬如HANDLE),然後按下F12,編譯器自會把你帶到它的聲明處,反覆使用幾次,你終會見到它的原貌,然後長吁一口氣:原來不過如此而已。沒用過的初學者請牢記:F12)。很多初學者總想知道一個HANDLE代表一個什麼對象,我的建議是不要去理解爲某對象,而就是理解爲訪問某一個對象的入口,事實上HANDLE大多數時候是一個整數索引(標誌該對象在操作系統的某表中的位置,就好像一個數組的下標一樣),Windows系統核心中主要是幾張大表,這樣一個整數索引就是標記目標在這個表中的位置,供操作系統訪問時查詢用。偶而它的確是指向某對象的指針,有時它還攜帶一些額外輔助信息。總之,我們不要去直接訪問它,把訪問HANDLE的任務交給操作系統好了,除非你還嫌寫程序不累:)。

  "DLL": Dynamic Link Library 動態鏈接庫
  DLL的一個特點就是可以動態加載(顧名思義),即在主程序(我更喜歡稱爲客戶程序)需要該模塊時才由操作系統加載到內存。畢竟一個大型應用程序我們經常使用到的功能並不多,這樣一些不常用的功能模塊(DLL)在程序運行時一般將不被載入,可極大節省內存開銷。DLL同時也是目前最常用的分發模塊的方法,便於彼此協作。程序中對DLL的調用主要有兩種方法:1 針對使用DEF文件導出函數的DLL,使用API函數LoadLibrary(“DLLModuleName" )加載,然後使用GetProcAddress()得到函數指針,進而調用 2 直接將類、函數等導出,客戶程序使用同一份頭文件聲明,加入對應的lib鏈接庫,即可在客戶程序中直接使用DLL中的類或函數,無需LoadLibrary。

  "Process": 進程
  進程是一個動態的概念,包括從進程的創建申請,PCB(Process Control Block進程控制塊,一般操作系統實現爲一個表格(struct))的創建,地址空間的內存分配,模塊代碼載入並執行,執行完以後進行撤銷,整個過程被稱爲"進程"。在Win32下,一個進程有4G的邏輯空間。但我們也常把它作爲靜態概念來使用,在Win32下,一個EXE的執行就是一個進程(如果它內部又開了新進程,另當別論)。

  "Thread": 線程
  爲了更有效的提高CPU的利用率,更好地實現多任務併發,微軟將進程進行進一步分割,實現了CPU任務調度的新對像:線程。一個進程擁有至少一個線程。我們在實現多任務併發的時候通常是建立一個新線程(建立線程的系統開銷要小於進程),線程以我們自己的一個函數作爲入口,函數執行完畢自動撤銷(當然你也可以在執行過程中強制結束該線程)。順便提一下,在UNIX下並沒有線程這個概念,想來是因爲UNIX主要是以多進程的併發服務爲主(所以它更適合於做服務器),系統運行時通常已經有了太多的進程,所以沒有必要再對進程進行細化,因爲這樣做甚至會降低系統效率(CPU調度不過來),當然,這是我個人的猜想:) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章