1.1 进程

进程代表了程序的一个运行实例,是起容纳和管理作用的对象。有个相当常用的术语叫作“进程运行”,它其实是不准确的。进程不运行—它只管理。从技术上来说,线程才是执行代码的东西。从高层次的角度来看,进程拥有如下内容:

  • 可执行程序。它包含了用来在进程中执行的原始的代码和数据。
  • 私有虚拟地址空间。进程中的代码不管出于何种目的要分配内存时,都从这里分配。
  • 主令牌(primary token)。它是一个保存进程默认安全上下文的对象,在进程内执行代码的线程会用到它,除非某个线程通过身份扮演(impersonation)而使用了另一个不同的令牌。
  • 私有的句柄(handle)表。它是保存了执行体对象(executive object)如事件(event)、信号量(semaphore)和文件的句柄。
  • 一个或多个执行线程。普通的用户模式进程在创建时具有一个线程,该线程执行经典的main/WinMain函数。没有任何线程的用户模式进程多半是没用的,并且正常情况下会被内核销毁。

图1-1中描绘了进程中的元素。

000

图1-1 进程中的重要成分

进程用一个唯一的进程标识符来标识,只要内核仍然有这个进程对象存在,这个标识符就是唯一的。一旦内核中的进程对象被销毁了,这个标识符就有可能被新的进程所使用。大家需要意识到有一点很重要,可执行文件本身并非一个进程的唯一标识符。例如,可能同时有五个notepad.exe的实例正在运行。每个进程都有自己的地址空间、自己的线程、自己的句柄表、自己的唯一进程标识符,等等。所有这五个进程使用同一个映像文件(notepad.exe)作为初始代码和数据。图1-2显示了任务管理器中详情标签页的一个屏幕截图,其中显示了五个notepad.exe的实例,每个都有自己的属性。

000

图1-2 记事本的五个实例