一个进程的诞生与死亡

执行一个程序,必然就产生一个进程。最直接的程序执行方式就是在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

时间: 2024-08-01 10:42:21

一个进程的诞生与死亡的相关文章

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

前两讲我们介绍了fork()系统调用以及execve()内核函数(注:所有的库函数exec*都是execve的封装例程). 简单回顾一下fork()系统调用(传送门:fork()到底干了啥?): 进程调用fork()创建一个新的进程,新进程复制了父进程的task_struct(PCB,process control block,进程控制块),以及task_struct中的各个子模块,比如内核堆栈等,然后对各个子模块做了修改.系统调用通过eax寄存器保存返回值,fork()系统调用结束后从内核态返

一个网站的诞生09--自动监控

部署Web App,需要买一个域名,我推荐http://www.namecheap.com/,用信用卡或者paypal付款,一年10刀. 如果需要VPS,买Linode.com的,它家新推出每月10刀的主机,性能绝佳,如果选择东京的机房,从大陆访问很快,用海外的主机不需要备案,这是最大的卖点. 网站的tornado代码运行了,网站可以访问了.有时候网站会因为各种原因崩溃,比如被攻击,代码bug,流量太大等等. 这时候就需要一个自动监控脚本.这个脚本监控网站的tornado进程,每隔几秒检测一次进

一个网站的诞生10--自动化部署

所谓自动部署就是说,如果用10台机器跑tornado程序提供Web服务,它们上面的代码都是一样的,这也叫生产环境.在公司写新代码,写好了,测试通过,这叫开发环境.然后执行自动部署程序,它把新代码提交到版本管理服务器,然后连上生产环境的10台服务器,让它们更新代码,再重启tornado程序,新代码就上线了,用户看到的就是新发布的网站. 自动部署的关键是两个东西,一个是版本服务器,一个是远程操作. 推荐用git版本服务器,推荐寥雪峰的git教程,写得非常清晰,是目前为止我见到的最容易入手的,链接在这

一个网站的诞生05--如何把网站做到估值过亿

网站的意义,在于创造对用户有价值的东西,估值是网站意义的一个衡量指标,提升估值的手段,也就等价于把网站做得更有用. 如何计算一个网站的估值?国际标准是每个活跃用户的价值是40刀左右,Whatsapp卖了190亿刀,它有4.5亿活跃用户.中国略有差别,微信的估值是40亿~50亿刀,有3亿用户,但中国的用户商业价值不够高,人均GDP太低,所以每个活跃用户的价值是10-15刀,也就是RMB60-90元.如果网站(包括同名App)要想估值过亿,要有一百万的活跃用户.另一种估算方式是,行业第二名的估值是第

实现同一个脚本多次运行,系统中只有一个进程

编写脚本,实现同一个脚本多次运行,系统中只有一个进程 [email protected] scripts]#cat pid.sh #!/bin/sh pidpath=/tmp/a.pid if [ -f "$pidpath" ]   then     kill `cat $pidpath` >/dev/null 2>&1     rm -f $pidpath fi echo $$ >$pidpath sleep 300 测试如下 [email protecte

一个网站的诞生08-- 在Web App嵌入地图

LBS-Location Based Service,基于位置的服务.如果要在Web App嵌入地图,差不多可以做成LBS了.zuijiancanting.com的设计理念,是把Top餐厅放在地图上,那么当你到某个地方逛逛,或者有约会,拖拉一下地图就可以找到合适的餐厅. 提供地图API服务的公司很多,国外有GoogleMap,OpenStreetMap,国内有百度地图,腾讯地图,高德地图.GoogleMap由于某些原因不能正常使用,不在选择之列.我最先考虑的是OpenStreetMap,因为除了

windows 一个进程可以允许最大的线程数

默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用

一个网站的诞生01--缘由

大概在半年前,我觉得需要做一个网站,寻找新奇有趣的餐厅. 喜欢美食的人,在中意餐厅吃久了,总想找新餐厅换换口味,试试新菜和新的食材. 寻找新餐厅并不容易,甚至是艰难.由于众所周知的原因,网上流传的餐厅文,美食文,常常不可信,编排越精美,越可能是软广---大家天天都很忙,很少有闲心做这么精美的文宣.我跟这些美食文找过,失望大于希望,成功率不到一半.而且,魔都太大,打听到的餐厅,总要去试吃一下,来来回回总跑上几个小时吧?时间很宝贵,这么做太不划算了! 上海的餐厅大众点评网收集的最齐全,如果我把它上面

创建一个进程并调用(.net)

最近有一个项目需求,需要调用一个exe,就上网查询了一下,顺利的完成了工作,感觉虽然简单,但挺有意思,就记录一下. 一,创建一个进程 1,代码视图(控制台程序) 2,代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace KillProcess { class Program { static void