Windows操作系统的进程概要

什么是进程

一个正在运行的程序实例。它由两部分组成:
一个内核对象,操作系统用内核对象管理进程,内核对象是保存进程统计信息的地方。
一个地址空间,它包含所有exe,dll模块的代码和数据,还有动态内存分配,比如线程堆栈和堆的分配。

一个进程内的所有线程,都在进程的地址空间中同时指向代码。线程有一组CPU寄存器和它的堆栈。
当系统创建一个进程的时候,会自动为进程创建第一个线程,即主线程(main函数开始)。当线程执行完代码,线程就结束,主线程结束,系统会销毁进程收回地址空间。

系统为线程的运行分配CPU时间,系统内核调度管理线程。

 

进程命令行

系统在春感觉一个进程时,会传一个命令行给它。

进程的环境变量

每个进程都有一个与它关联的环境块,是在进程地址空间里分配的一块内存,其中包含键值对的字符串。

GetCurrentDirectory 进程所在的硬盘目录;

 

创建一个进程内核对象,来管理每个进程

如何利用与进程关联的内核对象来操纵该进程

进程的特性(属性),如何查询和更改这些特性

如何创建新进程

 

终止进程

四种终止进程的方式:

  • 主线程的入口函数返回,即main函数返回。强烈推荐这种方式。
  • 进程中的一个线程调用ExitProcess函数。避免
  • 别的进程的线程调用TerminateProcess函数,避免
  • 进程中所有线程都自然死亡。几乎从来不会发生。除非控制台程序

 

 

主线程的入口函数返回

只有这样,才能保证主线程的所有资源都被正确清理。

调用ExitProcess函数

ExitProcess和ExitThread函数,就操作系统而言,这样做没有什么问题,进程和线程的所有操作系统资源都会被正确清理。  不过,立即结束,C++运行库也许不能执行清理工作。也许会造成内存泄漏和其他资源泄漏。不能将内存数据flush刷到磁盘上。但是进程结束后,泄漏的内存资源都会被操作系统收回。

别的进程的线程调用TerminateProcess函数,避免

虽然进程没有机会执行清理工作。但操作系统汇总进程终止后,彻底清理。确保不会泄漏任何操作系统资源。这意味着进程使用的所有内存都会被释放。所有打开的文件都会被关闭,所有内核对象的使用计数都将递减。所有用户对象和GDI对象都会被销毁。

一旦进程终止,不管怎么终止的,系统都会保证不留下它的任何部分。进程在终止后绝对不会泄漏任何东西。

TerminateProcess函数是异步的,函数返回时,只代表已经告诉系统,不代表进程已经被系统终止,如果要等待需要调用WaitForSingleObject。

 

子进程

Wondows提供了:

动态数据交换DDE,OLE,管道,邮件槽等方式,在不同进程间传递数据。

用GetExitCodeProcess得到子进程的退出码。

独立运行的子进程

这意味着,父进程不再与子进程通信。父进程不用关心它创建的进程,等待它结束后再运行。、

为了断绝关系,父进程必须调用CloseHandle来关闭新进程及其主线程的句柄。:

BOOL  fSuccess = CreateProcess(... , &pi);

if(fSuccess ){

  CloseHandle(pi.hThread);

 CloseHandle(pi.hProcess);

}

管理员以标准用户权限运行时

Windows的提权只能在进程边界上提升。

自动提升权限

UAC如何判断该采取什么操作?

应用程序的可自行文件,嵌入了一种特殊资源:RT_MANIFEST,清单文件,lecel有三个值。.manifest文件。

手动提升权限,使用ShellExcuteEx函数创建进程提权。

令牌

GetTokenInfomation函数获取令牌。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值