1. 进程 = 一个内核对象 + 一个地址空间
2. 进程的实际执行者是线程 cpu调度的也是线程。 进程是最有惰性的,进程从来不执行任何东西,它只是一个线程的容器。
3. hInstanceExe的实际值是一个内存基地址, 系统将可执行文件的映像加载到进程地址空间的这个位置。vs的基地址通常是0x00400000。 GetModuleHandle返回可执行文件或者dll文件映像加载到的基地址
4. 每个进程都有一个与它相关联的环境块,这是在地址空间内分配的一块内存
5. p85 进程的创建过程
内核对象(使用计数) - ----- 创建虚拟地址空间、加载 -- ---- 创建新进程主线程的内核对象(使用计数) -- ---- 入口函数
6. p94 根据dwFlags 判断其余成员是否有效
7. 使用计数 p98 createprocess 创建一个新进程,系统创建继承内核对象和线程内核对象,初始使用计数为1, 就在createprocess返回之前,系统会使用完全访问权限打开进程对象和线程对象,使用计数变为2,意味着:系统想要释放进程对象,进程必须终止(使用计数变为1),而且父进程必须调用closehandle(1减为0),线程类似。
存在的误解:closehandle即杀死进程或线程,这是错误的。只是告诉系统对进程或者线程的统计数据不再感兴趣
8. 进程的父子关系只存在子进程生成的一瞬间。
9. 进程终止, 进程中运行的其他任何线程都会终止。但是很多清理工作不能完成(析构函数,数据写回磁盘)
10. c/c++运行时会完成很多清理工作,所以最好不要用exitprocee等函数强制结束。 termanateprocess可以完全清理(异步)。为了确保进程终止,需要使用waitforsingleObject。
11. 进程间传递数据: 动态数据交换,ole,管道,邮槽, 内存,映射文件(最方便)
c/c++中,0可以转化为任意数据类型,所以在一些 数据结构作为参数的时候可以传入null?