进程

来源:互联网 发布:软件项目管理案例分析 编辑:程序博客网 时间:2024/05/22 09:21

原文地址>>

已经做了几年的软件开发了,对于什么是进程,却没有一个系统的认识。只知道双击一个exe文件,任务管理器中就会多出一个进程。然后知道每个进程会有一个地址空间,在进程中的内存访问其实都是相对于该地址空间的地址表示。其实也算是知道个大概了,只是没有系统的总结出来而已,通过阅读《Windows核心编程》,重新对进程有了一个系统的认识。

进程是程序的一个实例,它由以下两部分构成:

1. 一个内核对象,操作系统通过他来管理进程。内核对象也是系统保存进程统计信息的地方。(其实还不是很清楚具体会有哪些统计信息,难道是任务管理器里显示的那些信息?有待进一步研究)

2. 一个地址空间(通俗点讲应该就是为进程在内存条上分配了一块可供他读写的内存块),其中包含所有可执行文件或DLL模块的代码和数据以及动态内存分配(堆)。

 

进程本身其实不做任何实质的事情,进程所提供的功能都是由他拥有的线程执行。因此进程最少需要有一个线程(即主线程),不然他就啥也干不了了。线程的工作主要是执行进程空间中包含的代码。一个进程可以拥有多个线程(除主线程外其他线程就该都是从主线程中产生)。操作系统会对进程中所有线程采用转流的方式为其分配CPU时间片。当CPU正在运行载个线程时,其他线程会被暂停现有工作而挂起。(这其实就是多线程问题产生的根本原因)

 

*貌似下面的内容有点与标题不符,仔细想想,好像也没有,应为上面说的是理论上的东西,下面讲的是实际开发中的东西。

 

-Console程序(CUI)与图形界面程序(GUI)-

还真的没想过为什么同样一个exe,有的双击出来界面是一个控制台,有的是图形界面。(说明我的观察力还不够,很多时候自己都会被一些习以为常的东西所蒙蔽)。

如果别人问我这个问题我肯定会说,肯定是在程序里哪个地方记录了该程序的类型,当运行该程序时操作系统会进行判断然后区分处理。其实道理是差不多的,只不过作为Windows程序员应该还是要知道得更细节一点。从Windows核心编程中我找到如下答案:

当我们通过VS创建一个项目时,我们首先会选择项目类型(控制台项目或Windows应用程序)。其实我们的这个选择会导致VS在编绎链接的时候会往exe文件中写入一个链接器开关/SUBSYSTEM:CONSOLE或/SUBSYSTEM:WINDOWS。当该程序被运行时,操作系统会去检查文件映像的文件头,并获取链接器写入的子系统值。如果是/SUBSYSTEM:CONSOLE,加载程序会自动确保有一个可用的文本控制台窗口。(然后将程序的输入输出流与该文本控制台窗口相绑定?不确定)。而如果是/SUBSYSTEM:WINDOWS,操作系统只会仅仅加载这个程序,界面什么的由程序自己去处理。

两种程序的入口函数也是不一样的:

GUI的入口函数是

WinMain

而CUI的入口函数是

main

 

-进程实例的名柄-

其实我一直是做.NET开发,C++做得很少。之前是一起到句柄就一头雾水,总是不理解到底是个什么东西。(其实也就是个地址嘛,只是给它命了个名字而已)。

加载到进程地址空间的每一个可执行文件或者DLL文件都被赋予了一个独一无二的实例句柄。可执行文件的实例被当作WinMain函数的第一个参数传入,以备后用。

 

-进程的环境变量-

每个进程都有一个与它关联的环境块,其实就是在进程地址空间中分配的一起内存。保存了一些与当前进程环境相关的信息。(终于知道为什么可以在进程中得到当前运行目录了,原来都是保存在这里的),这个环境变量是可以通过main函数的参数传进来的,但是还没看过里面到底会有些什么信息,有时间一定要写个程序测试一下。(放一个TODO在这)


0 0
原创粉丝点击