一个进程的诞生与死亡
2013-04-11 17:46
176 查看
执行一个程序,必然就产生一个进程(process)。最直接的程序执行方式就是在shell (如
Win95 的文件总管或Windows 3.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 结束进程。
Win95 的文件总管或Windows 3.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 结束进程。
相关文章推荐
- 一个进程的诞生与死亡
- 一个进程的诞生与死亡
- 一个进程的诞生与死亡
- 《深入浅出MFC》——一个进程的诞生与死亡
- 一个进程的诞生于死亡
- 一个进程的创建与死亡
- 6.fork + execve:一个进程的诞生
- 诞生与死亡(进程与线程的深入浅出)
- 进程的诞生与死亡的整个过程
- Linux下xorg进程CPU占用率过高时的一个解决方案
- 一个web应用的诞生(6)--用户账户
- 多个Apk共享在一个进程中
- 多个进程可以监听同一个端口?
- 进程与线程的一个简单解释
- 如何创建一个在任何进程任何帐户任何会话都能存取的内核对象
- 写一个Windows上的守护进程(8)获取进程路径
- 如何将所有的进程运行在一个指定的CPU上
- linux 进程(关于守护进程、检查一个进程是否活着、如何写一个进程号文件)
- linux下单例进程的一个实现方式