软件开发技术名词的解密篇(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调度不过来),当然,这是我个人的猜想:) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章