1.默认情况下,Windows Vista在给线程分配处理器时,使用软关联。意思是如果其他因素都一样,系统将使线程在上一次运行的处理器上运行。让线程始终在同一个处理器上运行有助于重用仍在处理器高速缓存中的数据。

2.有一种称为NUMA的计算机体系结构,结构的计算机由多个系统板组成,每个系统版都有自己的CPU和内存块。任何线程都可以在这些CPU中任何一个上运行。如果CPU需要访问其他系统板上的内存,性能会下降的厉害。为了支持这种体系结构,Windows Vista允许我们设置进程和线程的关联性。也就是说,我们可以控制CPU让哪些CPU运行特定的线程。这称为硬关联。

3.默认情况下,系统可以将任何CPU调度给任何线程使用。如果要限制某些线程只在可用CPU的一个子集上运行,则可以调用SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask),第二个参数代表线程可以在哪些CPU上运行。例如传入0x00000005意味着这个进程中的线程可以在CPU0和CPU2上运行,但是不能在CPU1和CPU3~31上运行。

4.请注意,子进程将继承进程关联性。此外,我们还可以使用作业内核对象来限制一组进程只在一组CPU上运行。

5.可以通过调用SetThreadAffinityMask分别设置各线程的关联性掩码。

6.当一个x86系统启动时,系统将执行代码,检查主机上的哪个CPU存在著名的Pentium浮点bug。系统必须对每个CPU做这项检查。检查的方法是,将一个线程的关联性设置为该CPU,执行可能会出错的除法操作,然后比较结果是否与已知正确的结果相符。随后再采用同样的步骤检查下一个CPU,依次类推。

7.在大多数环境里,改变线程的关联性,将妨碍调度程序的这种能力,下面给出一个例子:

8.要给线程设置一个理想的CPU(也允许系统将它移到另一个空闲的CPU),可以调用SetThreadIdealProcessor(HANDLE hThread, DWORD dwIdealProcessor),dwIdealProcessor不是位掩码,它是一个0到31/63之间的整数,表示线程希望设置的CPU。可以传入MAXIMUN_PROCESSORS值(在WinNT.h中定义,32位操作系统中定义为32,64位操作系统中定义为64),表示线程没有理想的CPU。

9.当Windows Vista在x86计算机上启动时,我们可以限制系统将使用的CPU数量(修改启动配置数据 BCD)。

Windows Internals 笔记——关联性的更多相关文章

  1. Windows Internals 笔记——线程优先级

    1.每个线程都被赋予0(最低)~31(最高)的优先级数.当系统确定给哪个线程分配CPU时,它会首先查看优先级为31的线程,并以循环的方式进行调度.如果有优先级为31的线程可供调度,那么系统就会将CPU ...

  2. Windows Internals 笔记——线程调度

    1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态.大约每隔20ms,Windows都会查看所有当前存在的线程内核对象.Windows在可调度的线程内核对象中选择一个,并将上次 ...

  3. Windows Internals 笔记——线程

    1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...

  4. Windows Internals 笔记——进程的权限

    1.大多数用户都用一个管理员账户来登录Windows,在Vista之前,这样的登录会创建一个安全令牌.每当有代码试图使用一个受保护的安全资源时,操作系统就会出示这个令牌.从包括Windows资源管理器 ...

  5. Windows Internals 笔记——作业

    1.Windows提供了一个作业内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么.创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制. 2.如果进 ...

  6. Windows Internals 笔记——CreateProcess

    1.一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1.然后系统为新进程的主线程创建一个线程内核对象(使其计数为1). 2.CreateProcess在进程完全初 ...

  7. Windows Internals 笔记——进程

    1.一般将进程定义成一个正在运行的程序的一个实例,由以下两部分构成: 一个内核对象,操作系统用它来管理进程,内核对象也是系统保存进程统计信息的地方. 一个地址空间,其中包含所有可执行文件或DLL模块的 ...

  8. Windows Internals 笔记——内核对象

    1.每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息. 2.调用一个会创建内核对象的函数后,函数会返回一个句柄,它标 ...

  9. Windows Internals 笔记——字符和字符串处理

    1.自Windows NT起,Windows的所有版本都完全用Unicode来构建,调用Windows函数时,如果向它传入一个ANSI字符串,那么函数首先会把字符串转换为Unicode,再把结果传给操 ...

随机推荐

  1. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  2. 使用sshpass同时更新一台ubuntu和一台CentOS

    1.在ubuntu上安装sshpass sudo apt install sshpass 2.分别在两台的root路径下放上升级脚本: cent:/root/upgrade.sh #!/bin/bas ...

  3. BackGround

  4. YUI Compressor

    简介 根据雅虎卓越性能团队的说法,40%到60%的雅虎用户拥有空闲缓存体验,所有页面浏览量中约有20%是使用空缓存完成的(请参阅Tenni Theurer在YUIBlog上的这篇文章)有关浏览器缓存使 ...

  5. Gym - 101982C Contest Setting (动态规划)

    A group of contest writers have written n problems and want to use k of them in an upcoming contest. ...

  6. 01-oracle学习环境配置

    1.安装oracle与SQL Developer oracle10g安装教程 2.创建表空间以及用户 表空间是存储数据文件的容器,由数据文件组成,数据库的所有系统数据和用户数据都必须存储在数据文件中. ...

  7. postman接口测试笔记

    1.GET 和POST 的区别: GET 使用URL 或Cookie 传参,而POST将数据放在Body 中. GET的URL 在长度上会有限制,而POST没有. POST比GET相对安全,因为在地址 ...

  8. linux下安装kubectl

    查看所有版本: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md 下载指定版本: curl -O https://dl ...

  9. JGUI源码:实现图标按钮及下拉菜单(16)

    效果如下 代码片段如下 <div class="jgui-btn" id="personalbtn" style="float:right;&q ...

  10. JavaScript之iframe页面间通信

    [1] iframe父子页面间通信 1.相互调用对方的方法 |> 子级页面调用父级页面 window.parent.父级页面方法(args) |> 父级页面调用子级页面 document. ...