《深入浅出MFC》——一个进程的诞生与死亡
2011-08-12 12:27
162 查看
执行一个程序,必然就产生一个进程(process)。最直接的程序执行方式就是在shell(如Win95的文件总管或Windows3.x的文件管理员)中以鼠标双击某一个可之星文件图标(假设其为App.exe),执行起来的App进程其实是shell调用CreateProcess激活的。
让我们看看整个流程:
1.shell调用CreateProcess激活App.exe。
2.系统产生一个「进程核心对象」,计数值为1。
3.系统为此进程建立一个4GB地址空间。
4.加载器将必要代码加载到上述地址空间中,包括App.exe的程序、资料,以及所需的动态链接函数库(DLLs)。加载器如何知道要加载那些DLLs呢?它们被记录在可执行文件(PE文件格式)的.idata section中。
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程序,都是shell的子进程。本来,母进程与子进程之间可以有某些关系存在,但shell在调用CreateProcess时已经把母子之间的脐带关系剪断了,因此它们事实上是独立实例。
摘自《深入浅出MFC》
让我们看看整个流程:
1.shell调用CreateProcess激活App.exe。
2.系统产生一个「进程核心对象」,计数值为1。
3.系统为此进程建立一个4GB地址空间。
4.加载器将必要代码加载到上述地址空间中,包括App.exe的程序、资料,以及所需的动态链接函数库(DLLs)。加载器如何知道要加载那些DLLs呢?它们被记录在可执行文件(PE文件格式)的.idata section中。
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程序,都是shell的子进程。本来,母进程与子进程之间可以有某些关系存在,但shell在调用CreateProcess时已经把母子之间的脐带关系剪断了,因此它们事实上是独立实例。
摘自《深入浅出MFC》
相关文章推荐
- 一个进程的诞生于死亡
- 一个进程的诞生与死亡
- 一个进程的诞生与死亡
- 一个进程的诞生与死亡
- 一个进程的诞生与死亡
- 进程的诞生与死亡的整个过程
- 一个进程的创建与死亡
- 6.fork + execve:一个进程的诞生
- 诞生与死亡(进程与线程的深入浅出)
- 写一个Windows上的守护进程(7)捕获异常并生成dump
- 进程与线程的一个简单解释
- JAVA里面如何让一个线程死亡或结束
- 同一个父进程的多个子进程之间的通信
- ubuntu显示端口占用、正在运行的程序,以及强制关闭一个进程
- 一个网站的诞生04--抓取一个餐厅的某个月的全部评论
- 进程与线程的一个简单解释
- 安卓开发,一个Activity启动了一个本地服务,然后把Activity切换到后台,那这是后台进程还是次要服务进程
- 一个C#写的调用外部进程类
- 进程与线程一个简单的理解
- 进程与线程的一个简单解释