Windows进程和线程
构建Windows的系统服务和所有的应用程序都是以进程的形式驻留在内存中的,由处理器调度执行来完成设定的计算功能
一.Windows的进程和线程的定义
1. 一个Windows进程都有自己独立的虚拟地址空间,用以保护私有的执行代码和数据不被其他的进程破坏。每个进程包含一个或多个线程,运行在一个进程中的线程可以创建新的线程和进程
2. Windows操作系统,处理调度的对象是线程,而进程为线程的运行提供资源和上下文环境,保证所属的线程在进程的虚拟地址空间范围内运行
3. Windows一个进程包含以下信息:
1. 唯一的进程标识
2. 一个独立的虚拟地址空间
3. 映射到进程细腻地址空间的执行代码和数据
4. 访问各种系统资源的对象句柄表
5. 安全上下下文定义来说明与进程相关的用户,安全信息和访问特权设定
6. 至少包含一个可执行线程
4. Windows一个线程包含以下信息:
1. 唯一的线程标识
2. CPU寄存器的状态数据,用以表示处理的状态
3. 两个线程栈,一个在用户态执行时使用,另外一个在核心态执行时使用
4. 一个供子系统,运行库和东岱链接库使用的线程本地存储空间
二.进程和线程的关联
1. 系统通过创建进程来为线程提供必要的上下文环境,如:内存,资源对象。
2. 进程以执行进程块的形式驻留在内存中
3. 系统通过创建线程来运行具体的程序,同时提供处理器调度所需要的信息。
4. 线程以执行线程块的形式驻留在内存中
5. 一个运行的线程可以在同一个进程中创建新的线程来运行新的功能,也可以创建新的进程来启动新程序的运行环境
6. 构建进程的数据由分别驻留在系统地址空间中的核心进程块和驻留在进程地址空间的进程环境块构成
7. 构建线程的数据由分别驻留在系统地址空间中的核心线程块和驻留在进程地址空间的线程环境块构成
8. 进程通过核心进程块中指向核心线程块的指针来访问该进程所属的线程,还通过进程环境块为运行在用户态的服务访问进程提供接口。
9. 线程也通过驻留在进程地址空间的线程环境块为运行在用户态的服务访问线程提供接口
10. 线程通过线程环境块中指针指向它所属的进程的进程环境块,因此线程调度器可以通过线程访问进程环境提供的上下文信息
Windows进程和线程关联图
图2 Windows进程和线程关联图
三.Windows的进程结构
1. Windows将表示进程的数据结构统称为执行进程块,它提供了操作系统管理进程所需要的基本信息
2. 执行进程块包括本进程和父进程的标识,进程使用系统内存的配额,进程管理虚拟内存的信息,进程所使用的对象句柄,进程访问的安全性描述以及供Windows子系统访问的进程信息等
3. 执行进程块还有一部分数据被称为核心进程块,它包含Windows内核调度所属线程需要的基本信息如:时间片,核心栈和进程基准优先级等。
4. 执行进程块还有一部分称作进程环境块的数据驻留在进程地址空间,提供映像调入器,堆管理器和其他运行在用户态的动态链接库所需要的进程信息。
Windows进程的数据结构
执行进程块的数据项 | 功能 |
进程标识 | 唯一的进程标识号,父进程标识号和运行的镜像文件名称 |
系统资源配额 | 对该进程所使用系统内存池以及分页文件的配额限制 |
虚拟内存管理 | 用来描述进程的哪些虚拟地址空间被占用,哪些空间可以使用,以及进程虚拟内存管理的状态信息 |
工作集信息 | 该进程的虚拟地址空间中驻留在物理内存中页面集合 |
意外本地过程调用端口 | 当进程所属的线程出现意外时,进程管理器会通过本地过程调用发送意外信息到该进程,通过该端口接收意外信息进行相应的处理 |
调试本地过程调用端口 | 当进程所属的线程触发调试事件时,进程管理器会通过本地过程调用发送调试消息给该进程,通过该端口接收调试消息进程相应的处理 |
访问安全描述 | 访问该进程的安全设置 |
对象句柄表 | 指向该进程的所有对象句柄 |
Windows子系统进程信息 | Windows子系统调用该进程所需要的进程信息 |
核心进程块 | 包含了Windows内核调度该进程的所属线程所需要的基本信息如:分配给该进程的处理器时间,时间片大小,核心栈信息,进程基准优先级以及进程状态等 |
进程环境块 | 驻留在进程地址空间中,提供映像调入器,堆管理器和其他运行在用户态的动态链接库所需要的进程信息如:程序映像的基地址,用户站信息和线程的局部空间 |
表3.Windows进程的数据结构
四.Windows的线程结构
1. 在Windows将表示线程的数据结构统称为执行线程块,它为管理线程提供了线程的基本信息。
2. 执行线程包括该线程所属的进程,线程创建和结束时间,线程运行的起始例程的地址,线程级别的安全控制和等待处理I/O请求包列表等。
3. 其中一部分数据被称为核心线程块:用来存储用于处理器调度线程的相关信息如:执行时间,优先级和核心栈的地址等。
4. 还有一部分被称作线程环境块的线程数据驻留进程地址空间中,它为调入映像和动态链接库提供上下文信息。
Windows线程的数据结构
内容 | 功能 |
线程时间 | 创建线程和结束时间 |
所属进程标识 | 所属进程的标识 |
起始地址 | 线程起始例程的地址 |
访问安全控制 | 线程级别的访问安全控制信息 |
局部过程调用信息 | 线程处理局部过程调用的消息标识以及处理消息的地址 |
I/O信息 | 等待处理的I/O请求包的列表 |
核心线程块 | 存储系统进行线程调度和同步的线程信息如:该线程的可用执行时间,核心栈的地址,指向系统服务列表的指针,线程环境块的指针以及与处理器调度相关的信息 |
线程环境块 | 驻留在进程地址空间,存储用于映像调入器和Windows动态链接库所使用的线程上下文信息如:线程的唯一标识,用户栈的地址以及指向所属进程的进程环境块 |
表4.Windows线程的数据结构
五.Windows进程和线程的创建
5.1进程的创建过程
1. 应用程序是通过调用相应的进程创建函数来创建一个新的Windows进程的,最常用的进程创建函数是:CreateProcess
2. 创建进程的过程是由3个部分配合完成的:创建进程的系统服务,Windows子系统和新的进程。
3. CreateProcess通过调用相关的系统服务来调入需要执行的映像文件并创建进程和初始线程对象,并通过消息通知Windows子系统新的进程和线程对象已被创建。
4. Windows子系统在安装了新的进程和线程后,通知进程管理器执行初始线程。初始线程将新的进程初始化,并开始执行设定的代码
5. 如图5所示,Windows通过CreateProcess函数来创建进程的过程如下:
(1) CreateProcess通过调用进程管理服务找到文件的映像,并为其创建区域对象
(2) 创建执行进程对象,包括设置执行进程块,初始化进程的地址空间,初始化核心进程块和进程环境块
(3) 创建初始线程,包括创建执行进程块,设置线程的唯一标识和创建线程环境块
(4) 通过发送消息通知Windows子系统新的进程已被创建,子系统将初始化线程插入进程的线列表,将新的进程加入子系统进程列表
(5) 在控制传回进程的初始线,对进程进行初始化
(6) 在新的进程和线程的上下文内调入相应的东岱链接库,开始执行程序
Windows创建进程的过程
图5 Windows创建进程的过程
5.2线程的创建过程
1. 应用程序是通过调用相应的线程创建函数来创建一个新的Windows线的,最常用的是线程创建函数:CreateThread
2. CreateThread通过系统服务调用将创建线程的请求传递到位于Windows执行体中的进程管理器,它创建线程对象,并调用相应的系统服务初始化核心线程块
3. CreateThread创建线程的过程如下:
(1) 在进程的地址空间中为线程创建用户栈,并初始化运行上下文环境
(2) 初始化线程的线程环境块
(3) 创建执行线程对象
(4) 通知Windows子系统新线程已经被创建,子系统将新线程的线程ID插入到相应进程的线程列表
(5) 新线程的句柄和标识被返回到调用线程
(6) 线程进入调度队列等待执行
PS:进程线程调度,请看WIndows处理器调度机制