一个进程的诞生与死亡

转载 2004年07月14日 23:47:00

大笑微笑生气吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头生气微笑大笑


偷笑我爱北京天安门偷笑


偷笑天安门上太阳升偷笑


偷笑伟大领袖毛主席偷笑


偷笑指引我们向前进偷笑

偷笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑偷笑

<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; 执行一个程序,必然就产生一个进程(<span lang="EN">Process</span>)。最直接的程序执行方式就是在<span lang="EN">shell</span>(如<span lang="EN"> Windows 9x</span>的资源管理器或<span lang="EN">Windows 3.x</span>的文件管理器)中以鼠标双击某一个可执行文件图标(假设其为<span lang="EN">App.exe</span>),执行起来的<span lang="EN">App</span>进程其实是<span lang="EN">shell</span>调用<span lang="EN">CreateProcess</span>激活的。让我们看看整个流程:<span lang="EN"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN" style="FONT-FAMILY: 宋体"><o:p><font size="2">&nbsp;</font></o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>1</span><span style="FONT-FAMILY: 宋体">、<span lang="EN">shell</span>调用<span lang="EN">CreateProcess</span>激活<span lang="EN">App.exe</span>。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>2</span><span style="FONT-FAMILY: 宋体">、系统产生一个“进程核心对象”,计数值为<span lang="EN">1</span>。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>3</span><span style="FONT-FAMILY: 宋体">、系统为此进程建立一个<span lang="EN"> 4GB </span>地址空间。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -15.75pt; mso-para-margin-left: 4.0gd; mso-char-indent-count: -1.5"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">4</span><span style="FONT-FAMILY: 宋体">、加载器将必要的码加载到上述地址空间中,包括<span lang="EN">App.exe</span>的程序、数据,以及所需的动态链接函数库(<span lang="EN">DLLs</span>)。加载器如何知道要加载哪些<span lang="EN">DLLs</span>呢?它们被记录在可执行文件(<span lang="EN">PE</span>档案格式)的<span lang="EN"> .idata section </span>中。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -15.75pt; mso-para-margin-left: 4.0gd; mso-char-indent-count: -1.5"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">5</span><span style="FONT-FAMILY: 宋体">、系统为些进程建立一个线程,称为主线程(<span lang="EN">primary thread</span>)。线程才是<span lang="EN">CPU</span>时间分配的对象。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; mso-para-margin-left: 2.0gd"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">6</span><span style="FONT-FAMILY: 宋体">、系统调用<span lang="EN">C Runtime</span>函数库的<span lang="EN">Startup code</span>。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; mso-para-margin-left: 2.0gd"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">7</span><span style="FONT-FAMILY: 宋体">、<span lang="EN">Startup code</span>调用<span lang="EN">App</span>程序的<span lang="EN">WinMain</span>函数。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; mso-para-margin-left: 2.0gd"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">8</span><span style="FONT-FAMILY: 宋体">、<span lang="EN">App</span>程序开始运行。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; mso-para-margin-left: 2.0gd"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">9</span><span style="FONT-FAMILY: 宋体">、用户关闭<span lang="EN">App</span>主窗口,使<span lang="EN">WinMain</span>中的消息循环结束掉,于是<span lang="EN">WinMain</span>结束。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; mso-para-margin-left: 2.0gd"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">10</span><span style="FONT-FAMILY: 宋体">、回到<span lang="EN">Startup code</span>。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt; mso-para-margin-left: 2.0gd"><font size="2"><span lang="EN" style="FONT-FAMILY: 宋体">11</span><span style="FONT-FAMILY: 宋体">、回到系统,系统调用<span lang="EN">ExitProcess</span>结束进程。<span lang="EN"><o:p></o:p></span></span></font></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36.75pt; TEXT-INDENT: -15.75pt; mso-para-margin-left: 2.0gd; mso-char-indent-count: -1.5"><span lang="EN" style="FONT-FAMILY: 宋体"><o:p><font size="2">&nbsp;</font></o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体"><font size="2">可以说,通过这种方式执行起来的所有<span lang="EN">Windows</span>程序,都是<span lang="EN">shell</span>的子进程。本来,母进程与子进程之间可能有某些关系存在,但<span lang="EN">shell</span>在调用<span lang="EN">CreateProcess</span>时已经把母子之间的脐带关系剪断了,因此它们事实上是独立个体。<span lang="EN"><o:p></o:p></span></font></span></p>

诞生与死亡(进程与线程的深入浅出)

进程的诞生与死亡 程序的运行必定会产生一个进程(process) 流程如下:呼叫CreateProcess启动exe。       系统产生“进程核心物件”,计数值为1;       系统为进...
  • iloveyou418
  • iloveyou418
  • 2018年01月06日 21:41
  • 28

jvm学习笔记:第3章java判断对象是否死亡

3.2.2 根搜索算法 在主流的商用程序语言中(Java和C#,甚至包括前面提到的古老的Lisp),都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就...
  • sbvfhp
  • sbvfhp
  • 2015年02月01日 14:12
  • 1302

深圳医械帮:一个军团的诞生

25年来,整个中国医械行业的基因竟然都来自一家长不大的公司。成功者的基因来自一个失败者,那么这种基因还会有更大的生命力吗?   采访/本刊记者 叶静 刘建强   文/本刊记者 叶静 编辑/雷晓宇...
  • guomutian911
  • guomutian911
  • 2015年08月30日 21:13
  • 1608

6.fork + execve:一个进程的诞生

前两讲我们介绍了fork()系统调用以及execve()内核函数(注:所有的库函数exec*都是execve的封装例程)。            简单回顾一下fork()系统调用(传送门:fork...
  • chengonghao
  • chengonghao
  • 2016年05月06日 21:14
  • 893

深入理解Python中的进程

博客核心内容:1、进程中常用的一些方法 2、多进程解决Socket网络编程中的案例详解 3、进程之间的相互通信(IPC) 4、进程同步(加锁的机制)1、进程中常用的一些方法源代码:class P...
  • a2011480169
  • a2011480169
  • 2017年07月15日 21:24
  • 637

datanode启动之后很快有自己关闭掉

因为一直存在namenode重启无法正常启动,必须每次格式化namenode的情况,所以今天开始设置了core-site.xml中hadoop.tm.dir的设置。设置之后namenode终于摆脱了以...
  • yunlong34574
  • yunlong34574
  • 2014年03月16日 12:14
  • 7259

僵尸态子进程的回收

一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被   僵尸进程 销毁, 而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是 使进程退出,但...
  • xiaopangzi313
  • xiaopangzi313
  • 2013年08月01日 13:42
  • 741

linux进程管理(5 完结)---进程消亡

当前进程消亡时主要做了三件大事:释放当前进程占用的资源;为当前进程的子进程重新寻找“养父”;通知当前进程的父进程,释放当前进程剩下的资源。...
  • luomoweilan
  • luomoweilan
  • 2014年04月30日 21:52
  • 2073

linux进程状态小结

本文章是看过微信中的一篇文章叫做linux进程状态浅析后的小的笔记式总结. 众所周知的操作系统的进程的状态有就绪,运行,阻塞典型的三态. 那么在linux下进程的状态可以具体的分为下面的几种1.T...
  • recall_yesterday
  • recall_yesterday
  • 2016年10月10日 21:31
  • 344

第一节:汇编语言的产生

一、 汇编语言的产生:   为什么要产生汇编语言呢?众所周知,在没有高级语言和汇编语言的时候,程序员都是用机器码来写程序指令的(程序指令就是用0,1)写的 如:  s=768+122...
  • u014321400
  • u014321400
  • 2014年04月02日 14:47
  • 366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个进程的诞生与死亡
举报原因:
原因补充:

(最多只允许输入30个字)