MFC 深入分析 shuhuan2009@gmail.com
我们习惯以进程(process)表示一个执行中的程序,并且认为它是 CPU 调度单位。事
实上线程才是调度单位。
核心对象
核心对象是系统的一种资源,系统对象一旦产生,任何应用程序都可以开启并使用该
对象。
系统给予核心对象一个计数值作为管理之用
。
核心对象 产生方法
event CreateEvent
mutex CreateMutex
semaphore CreateSemaphore
file CreateFile
file-mapping CreateFileMapping
process CreateProcess
thread CreateThread
前三者用于线程的同步化,file-mapping 对象用于内存映射文件。process 和 thread 对象则是
本文的主角。
这些核心对象的产生方式不同,但都会获得一个
handle
作为识别,每使用一
次,其对应的计数值就加
1。核心对象的结束方式相当一致,调用 CloseHandle 即可。
process 对象并不如你想象的那样,用来执行程序代码(
程序代码的执行是线程的工作
),
process
对象只是一个数据结构,系统用它来管理线程
。
一个进程的诞生与死亡
执行一个程序,必然就产生一个进程。整个流程:
1. shell 调用 CreateProcess 激活 App.exe
2. 系统产生一个“进程核心对象”,计数值为 1
3. 系统为此进程建立一个 4GB 地址空间
4. 加载器将必要的代码加载到上述地址空间中,包括 App.exe 的程序、数据,以及所需的
动态链接函数库(DLLs)
5. 系统为此进程建立一个线程,成为主线程(primary thread)。
线程才是
CPU
时间的分
配对象
6. 系统调用 C runtime 函数库的 Startup code
7. Startup code 调用 App 程序的 WinMain 函数
8. App 程序开始运行
9. 使用者关闭 App 主窗口,是 WinMain 中的消息循环结束掉,于是 WinMain 结束
10. 回到 Startup code
11. 回到系统,系统调用 ExitProcess 结束进程
一个线程的诞生与死亡
执行程序代码是线程的工作。当一个进程建立起来后,主线程也产生。所以每一个
Windows 程序一开始就有了一个线程。我们可以调用 CreateThread 产生额外的线程,系统
会帮我们完成下列事情:
1. 配置“线程对象”,其 handle 将成为 CreateThread 的返回值
评论0