一、内核对象
操作系统为了以记录相关信息的方式管理各种资源,在其内部生成数据块(可视为结构体变量)。当然,每种资源需要维护的信息不同,所以每种资源拥有的数据块格式也有差异。这类数据块称为“内核对象”。
内核对象就是为了管理线程、文件等资源而由操作系统创建的数据块,其创建者和所有者均为操作系统。
内核对象通过整数型“句柄”区分,句柄相当于linux的文件描述符。
可以通过句柄区分内核对象,通过内核对象可以区分线程。句柄的整数值在不同进程中可能出现重复,但线程ID在跨进程范围内不会出现重复,线程ID用于区分操作系统创建的所有线程。
二、内核对象的状态
资源类型不同,内核对象也含有不同信息。其中,应用程序实现过程中需要特别关注的信息被赋予某种“状态”。例如,线程内核对象中需要重点关注线程是否已终止,所以终止状态又 称“signaled状态”,未终止状态称为“non-signaled状态”。
WaitForSingleObject函数用于针对单个内核对象验证signaled状态。该函数由于发生事件(变为signaled状态)返回时,有时会把相应内核对象再次改为non-signaled状态。这种可以再次进入non-signaled状态的内核对象称为“auto-test模式”的内核对象,而不会自动跳转到non-signaled状态的内核对象称为“manual-reset模式”的内核对象。
WaitForMultipleObjects函数可以验证多个内核对象状态。