windows线程调度、线程优先级和亲缘性

2023-11-19

windows线程调度、线程优先级和亲缘性

每一个线程在它的线程内核对象中有一个上下文结构,反映了线程最后一次执行的 CPU 寄存器状态,每隔大约 20ms(可以使用 GetSystemTimeAdjustment 获得,我测得这个间隔大约为 15.6ms),Windows 在所有当前内核对象中查找可调度线程,并选择一个可调度线程,从这个线程的上下文结构中读取 CPU 寄存器状态,这个动作叫做“上下文切换”。这时,这个线程开始执行它的代码,大约 20ms 后,Windows 将 CPU 寄存器的状态保存到这个线程的上下文结构中,这个线程不再执行,Windows 查找下一个可调度线程执行上下文切换,另一个线程继续从它上一次中断的地方开始执行,这个过程从系统开机到系统关闭周而复始。

某些线程不是可调度线程,因为这些线程可能被暂停执行,或者正在待某个任务完成。

由于 WIndows 系统是抢先式操作系统,意味着一个线程可能会在任何时候被其它线程中继,又因为 Windows 系统不是实时操作系统,所以不能保证某一时刻某个线程一定会被调度执行,也不能保证这个线程一定会执行给定的时间片。

线程的暂停和恢复

在线程内核对象内部有一个表示暂停计数器的成员,当你调用 CreateProcess 或 CreateThread 时,这个计数器初始化为 1,避免线程被调度给 CPU,保证线程在完全初始化之前不会执行任何代码,一旦线程完全初始完成,创建函数会检测你是否传递了一个 CREATE_SUSPENDED 标志,如果没有传递这个标志,函数会减少暂停计数器计数,只要计数器为 0,这个线程就成为可调度线程,否则它会暂停执行。

可以使用

?
1
DWORD ResumeThread(HANDLE hThread);

来恢复线程的执行,这个函数如果成功,返回之前线程被暂停的次数,否则返回 0xFFFFFFFF。

一个线程可以被暂停多次,那么恢复的话也必须调用 ResumeThread 多次,任何线程都可以调用

?
1
DWORD SuspendThread(HANDLE hThread);

来暂停一个线程的执行,只要它有那个线程的句柄,一个线程可以暂停自身的执行,但不可恢复自身。一个线程可以最多被暂停 MAXIMUM_SUSPEND_COUNT (WinNT.h 定义为 127 )次。暂停一个线程时必须非常注意,因为你不知道将要被暂停的线程正在做什么,比如,如果一个线程正在从堆中申请内存,这时,这个线程会在堆中有一个锁,如果这时线程被暂停执行,其它线程会一直待锁被释放,这样会造成死锁。

暂停和恢复一个进程

Windows 并没有提供一个暂停和恢复一个进程内所有线程的函数,我们可以枚举一个进程内的所有线程来达到这个目的,下面是一段摘自 Windows via C/C++ 的一段代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows线程调度、线程优先级和亲缘性 的相关文章

  • Linux中常见目录操作和文件操作命令

    pwd命令 用于查看显示当前所在目录 ls命令 用于显示指定目录中的文件或子目录的信息 cd命令 用于切换当前用户所在的工作目录 其中路径可以是绝对路径 也可以是相对路径 mkdir命令 用于创建目录 rm命令 用于删除文件或目录 touc
  • QQ被盗后,如何找回好友

    QQ被盗了 可以再申请一个号码 但是QQ里面的好友却无法再申请了 特别是一些重要的联系人也丢失了 下面的方法可以帮你找回好友 1 确认电脑中保存着被盗QQ号码的登录记录 也就是QQ安装目录下的包含这个号码为目录名的子目录 如果你采用的是网吧
  • Ubuntu下工作空间的创立以及思岚系列激光雷达的使用(详细)和驱动安装及地图创建

    环境 ubuntu20 04 双系统 其他环境也是可以的 首先我们需要先创建rplidar ros的工作空间 这里为推荐从源码处下载 我将介绍两种创建工作空间的方法 1 直接创建 比较简单 个人推荐 mkdir p catkin ws sr
  • qt, connect参数,Qt::DirectConnection,Qt::QueuedConnection

    connect用于连接qt的信号和槽 在qt编程过程中不可或缺 它其实有第五个参数 只是一般使用默认值 在满足某些特殊需求的时候可能需要手动设置 Qt AutoConnection 默认值 使用这个值则连接类型会在信号发送时决定 如果接收者
  • 期货开户手续费的组成和收费模式

    期货公司的费用 公开透明 不会私自提高费率 A级别的期货公司 不会私自提高期货投资者的交易费率 不会私自提高期货投资者的保证金比例 说一下投资者最关系的费率问题 期货投资交易的手续费是由两部分组成 1 交易所手续费 这个是固定标准也是市场上
  • linux安装nacos集群

    一 前置环境 java nacos mysql 3台vm 192 168 5 171 192 168 5 172 192 168 5 181 一台配置好其他都一样的 1 下载安装包 https github com alibaba naco
  • C++ OPENCV 获得两矩形的交集矩形

    获得两个矩形的交集 该交集类型也是矩形 这种情况就范围交集的矩形 蓝色部分 这种情况返回 cv Rect cv Point 0 0 cv Point 0 0 欢迎测试 提BUG brief 获得两个矩形的交集 param rect1 rec

随机推荐