时间:2013-04-22 10:24:00 作者:木木 来源:系统之家 1. 扫描二维码随时看资讯 2. 请使用手机浏览器访问: http://m.xitongzhijia.mg188.cn/xtjc/20121120/18577.html 手机查看 评论 反馈
简单地说,当计算机运行一个软件,会被拆分成若干部分来执行,进程就是计算机正在运行的程序,它具体指程序执行时所需的虚拟地址空间和控制信息。而每一个应用程序运行于独立的进程、他们拥有自己独立的地址空间。不同应用程序的分界线称为进程边界。今天就为大家介绍windows的那些进程与应用程序,希望了解这些能更好的为系统服务.
进程
一般进程可以定为一个正在运行的程序的一个实例,
一个内核对象,操作系统可以用它来管理进程。也是系统保存进程统计信息的地方。
一个地址空间,其中包含了可执行文件和DLL模块的代码数据,同时包括动态内存分配,和线程堆栈和堆得分配。
CPU的工作方式,是 一个进程可以有多个线程..然后CPU会轮流调度资源分配给各个线程,就像一个时钟一样。
关于Windows应用程序的组成
要点描述:
1. GUI 和 CUI 分别表示 图形和控制台的界面,
2./SUBSYSTEM:CONSOLE 和 /SUB-SYSTEM:WINDOWS 分别是控制台和窗口的链接器开关
3._tWinMain 图形界面的入口点函数 和 _tmain 控制台界面的入口点函数。
一、Windows一般可以建立两种应用程序。
1.GUI程序 - 图形用户界面 - 它使用的连接器开关是/SUBSYSTEM:CONSOLE
2.CUI程序 - 控制台界面 - 它使用的连接器开关是/SUB-SYSTEM:WINDOWS
操作系统会加载并检查可执行文件映像的文件头,并获取这个子系统值。
根据子系统值来创建 一个符合要求的程序界面。
二、 Windows 应用程序
都会有个入口点函数,在程序运行时,函数会被调用。
int WINAPI _tWinMain(
HINSTANCE hInstanceExe,
HINSTANCE,
PTSTR pszCmdLine,
int nCmdShow);
int _tmain(
int argc,
TCHAR *argv[],
TCHAR *envp[]);
操作系统实际并不调用我们所写的入口点函数。相反,它会调用由C/C++运行库实现并链接时使用-entry:命令选项来设置
的一个C/C++运行时启动函数。该函数将初始化C/C++运行库,使我们能调用malloc和free之类函数。
应用程序类型和相应的入口点函数表
当链接器正确选择了C/C++运行库启动函数后,链接器会根据指定的链接器开关,寻找相应的入口点函数,否则会返回
"unresolved external symbol"(无法解析的外部符号)错误。 不然一般会根据情况分别选择 嵌入可执行文件的启动函数。
当然我们也可以从自己的项目中移除/SUBSYSTEM链接器开关,让程序自动判断应该使用哪个子系统。
去启动入口点函数 (WinMain, wWinMain, main, or wmain) 。
VisualC++有自带C运行库的源码。可以在ertex.c文件中找到 这4个启动入口点函数源代码。这些启动函数的用途下面简单说下:
1.获取指向心进程的完整命令行的一个指针。
2.获取指向新进程的坏境变量的一个指针。
3.初始化C/C++运行库的全局变量。如果包含了StdLib.h,我们的代码就可以访问这些变量。
4.初始化C运行库内存分配函数malloc和calloc和其他底层I/O历程使用的堆。
5.调用所有全局和静态C++类对象的构造函数。
C/C++启动函数会调用应用程序的入口点函数。比如我们写了一个_tWinMain函数,且定义了_UNICODE
其调用过程如下:
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineUnicode,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
如果没有定义_UNICODE,其调用过程将如下所示:
GetStartupInfo(&StartupInfo);
int nMainRetVal = WinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineAnsi,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
注意_ImageBase是一个链接器定义的伪变量,可执行文件都被映射到应用程序内存中的什么位置以后讨论。
现在 我们如果写了一个_main函数,可以定义?_UNICODE其调用过程如下:
int nMainRetVal = wmain(argc, argv, envp);
没定义_UNICODE,调用过程如下:
int nMainRetVal = main(argc, argv, envp);
另外注意用Visual Studio 生成的应用程序CUI是没有入口点的第3个参数
int _tmain(int argc, TCHAR* argv[]);
要自己添加成
int _tmain(int argc, TCHAR* argv[], TCHAR* env[])
env参数指向一个参数,所有环境变量和值 都用等号(=)分隔。
为安全起见 Microsoft 并不赞成使用所有这些变量,因为使用了这些变量代码可能会在C运行库初始化这些变量之前开始执行,因此我们应该直接调用对于的WindowsAPI函数。
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。而应用程序是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。
发表评论
共0条
评论就这些咯,让大家也知道你的独特见解
立即评论以上留言仅代表用户个人观点,不代表系统之家立场