一个进程的诞生与死亡
2017-04-15 00:11
302 查看
执行一个程序,必然就产生一个进程。最直接的程序执行方式就是在shell中以鼠标双击某一个可执行文件图标,执行起来的App进程起始是shell调用CreateProcess激活的。
1.shell调用CreateProcess激活App.exe
2.产生一个进程核心对象,计数值为1
3.系统为此进程建立一个4GB地址空间
4.加载器将必要的代码加载到上述地址空间中,包括App.exe的程序、数据,以及所需要的动态链接函数库DLL。加载器如何知道要加载那些DLLs呢?它们被记录在可执行文件PE文件的.idata section中。
5.系统为此进程建立一个线程,称为主线程。线程才是CPU时间的分配对象。
6.系统调用C runtime函数库的Startup code
7.Startup code调用App程序的WinMain函数
8.App程序开始运行
9.使用者关闭App主窗口,是WinMain中的消息循环结束掉,于是WinMain结束
10.回到Startup code
11.回到系统,系统调用ExitProcess结束进程
一个线程的诞生与死亡
执行程序代码,是线程的工作。当一个进程建立起来后,主线程也产生。所以每一个Windows程序一开始就有了一个线程。我们可以调用CraeteThread产生额外的线程,系统会帮我们完成下列事情:
1.配置“线程对象”,其handle将成为CreateThread的返回值
2.设定计数值为1
3.配置线程的context
4.保留线程的堆栈
5.将context中的堆栈指针缓存器(SS)和指针缓存器(IP)设定妥当。
所谓的工作切换(context switch)其实就是对线程context的切换。
http://blog.csdn.net/zang141588761/article/details/49512053
1.shell调用CreateProcess激活App.exe
2.产生一个进程核心对象,计数值为1
3.系统为此进程建立一个4GB地址空间
4.加载器将必要的代码加载到上述地址空间中,包括App.exe的程序、数据,以及所需要的动态链接函数库DLL。加载器如何知道要加载那些DLLs呢?它们被记录在可执行文件PE文件的.idata section中。
5.系统为此进程建立一个线程,称为主线程。线程才是CPU时间的分配对象。
6.系统调用C runtime函数库的Startup code
7.Startup code调用App程序的WinMain函数
8.App程序开始运行
9.使用者关闭App主窗口,是WinMain中的消息循环结束掉,于是WinMain结束
10.回到Startup code
11.回到系统,系统调用ExitProcess结束进程
一个线程的诞生与死亡
执行程序代码,是线程的工作。当一个进程建立起来后,主线程也产生。所以每一个Windows程序一开始就有了一个线程。我们可以调用CraeteThread产生额外的线程,系统会帮我们完成下列事情:
1.配置“线程对象”,其handle将成为CreateThread的返回值
2.设定计数值为1
3.配置线程的context
4.保留线程的堆栈
5.将context中的堆栈指针缓存器(SS)和指针缓存器(IP)设定妥当。
所谓的工作切换(context switch)其实就是对线程context的切换。
http://blog.csdn.net/zang141588761/article/details/49512053
相关文章推荐
- 一个进程的诞生与死亡
- 《深入浅出MFC》——一个进程的诞生与死亡
- 一个进程的诞生与死亡
- 一个进程的诞生于死亡
- 一个进程的诞生与死亡
- 诞生与死亡(进程与线程的深入浅出)
- 进程的诞生与死亡的整个过程
- 一个进程的创建与死亡
- 6.fork + execve:一个进程的诞生
- Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活
- 进程与线程的一个简单解释
- (小技巧六)只允许一个进程运行winform
- 进程有哪几种基本状态,在一个系统中为什么必须区分出这几种状态?
- 探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句
- python 一个小的进程监控程序
- 构建一个分布式操作系统的简单方案—答陈硕的“分布式系统中的进程标识”一文
- 使用java终止一个进程
- 每日掌握一个linux命令 之 进程管理命令 ps
- 进程与线程的一个简单解释
- 进程与线程的一个简单解释