进程、线程和作业

来源:互联网 发布:axios.post 传递数组 编辑:程序博客网 时间:2024/05/24 06:44

尽管表面上看起来程序和进程非常类似,但本质上它们却是截然不同的。

程序是指一个静态的指令序列,而进程则是一个容器,其中包含了当执行一个程序的特定实例时所用到的各种资源。

一个Windows进程是由以下元素构成的:

1)一个私有的虚拟地址空间,这是指该进程可以使用的一组虚拟内存地址。

2)一个可执行的程序,它定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中。

3)一个已打开句柄的列表,这些句柄指向各种系统资源,比如信号量、通信端口和文件,该进程内所有的线程都可以访问这些系统资源。

4)一个被称为访问令牌的安全环境,它标识了与该进程关联的用户、安全组和特权。

5)一个被称为进程ID的唯一标识符(在内部被称为客户ID)。

6)至少一个执行线程。

   每个进程也指向它的父进程或创建者进程。然而,如果父进程退出的话,子进程中的父进程信息并不会被更新。因此,一个进程有可能指向一个已不再存在的父进程。

 

 

线程是一个进程内部的实体,也是Windows执行此进程时的调度实体。如果没有线程,则进程的程序不可能运行。

线程包括以下一些最基本的部件:

1)一组代表处理器状态的CPU寄存器中的内容。

2)两个栈,一个用于当前进程在内核模式下执行的时候,另一个用于线程在用户模式下执行的时候。

3)一个被称为线程局部存储区(TLS,thread-local storage)的私有存储区域,各个子系统、运行库和DLL都会用到该存储区域。

4)一个被称为线程ID的唯一标示符(在内部也被称为客户ID-进程ID和线程ID是在同一个名字空间中生成的,所以它们永远不会重叠)。

5)有时候线程也有他们自己的安全环境,如果多线程服务器应用程序要模仿其客户的安全环境,则往往可以利用线程的安全环境。

 

易失的寄存器、栈和私有存储区域合起来被称为线程的环境

 

 

纤程(Fiber)与线程

    线程使得一个应用程序可以调度它自己的“线程”的执行过程,而不必依赖于Windows内置的基于优先级的调度机制。纤程常常也被称为“轻量级”的线程。

 

 

虽然线程有自己的执行环境,但是,同一个进程内部的所有线程共享该进程的虚拟地址空间以及其余的属于该进程的资源,这意味着,一个进程内的所有线程可以读或者写另一个线程的内存。然而,一个进程中的线程不可能直接引用另一个进程的地址空间,除非两种情况:

第二个进程将它的一部分私有地址空间变成共享内存区;

或者,第一个进程有权打开第二个进程,从而可以使用诸如ReadprocessMemory和WriteProcessMemory等跨进程的内存函数。

 

 

 Windows在进程模型上做了一个扩展,称为作业。作业对象的主要功能是,使得一组进程被当做一个整体来管理和维护。作业对象允许对特定的属性进行控制,也允许对一个进程,或者所有与作业相关联的进程进行限制。

 

 

 

原创粉丝点击