user-0 提问: windows下，进程是不是有个“cpu控制权”的概念？

回复:
user: user-1
content: 引用 11 楼 Idle_ 的回复:[quote=引用 10 楼 bsnry 的回复:] 对了，顺便问一句：  iocp相关的话题，系统创建了不同的数据结构，  其中一个是 已释放线程列表， 也就是正在执行的线程的表。  核心编程说：  完成端口的目标是根据在创建完成端口时候指定的并发线程数量，尽可能的将线程保持在已释放的线程列表中。 如果一个已释放的线程由于任何原因而进入等待状态，那么已释放的线程列表会缩减，完成端口会释放另一个正在等待的线程。  如果一个已暂停的线程被唤醒，那么它就会离开已暂停的线程列表，进入 已释放的线程列表。  这意味着：此时以及已释放线程列表中的线程数量将大于最大允许的并发线程数量。  第10章节 同步设备与异步设别i/o  page 313的最下面的一段文字。   请问 为什么已释放的线程列表中的线程数目将大于最大允许的并发线程数量？  释放的目的，无非就是让这些线程去处理其他。做其他工作。  好了，为了这个目的，释放过多的线程，比如超出  cpu数目+超线程数目  你释放就无意义了。是吧。  对， 说对了  错了，相当有意义。 注意一点， 用户层线程切换和内核线程切换是两个概念。在已释放线程队列中的线程可以随时在内核中被attach并运行（为了获得线程所在的虚拟地址空间或执行内核APC），和cpu数目没关系，它还是使用当前正运行相应内核代码的cpu。 [/quote]  推荐这方面 书籍

user: user-2
content: 引用 10 楼 bsnry 的回复:对了，顺便问一句：  iocp相关的话题，系统创建了不同的数据结构，  其中一个是 已释放线程列表， 也就是正在执行的线程的表。  核心编程说：  完成端口的目标是根据在创建完成端口时候指定的并发线程数量，尽可能的将线程保持在已释放的线程列表中。 如果一个已释放的线程由于任何原因而进入等待状态，那么已释放的线程列表会缩减，完成端口会释放另一个正在等待的线程。  如果一个已暂停的线程被唤醒，那么它就会离开已暂停的线程列表，进入 已释放的线程列表。  这意味着：此时以及已释放线程列表中的线程数量将大于最大允许的并发线程数量。  第10章节 同步设备与异步设别i/o  page 313的最下面的一段文字。   请问 为什么已释放的线程列表中的线程数目将大于最大允许的并发线程数量？  释放的目的，无非就是让这些线程去处理其他。做其他工作。  好了，为了这个目的，释放过多的线程，比如超出  cpu数目+超线程数目  你释放就无意义了。是吧。  对， 说对了  错了，相当有意义。 注意一点， 用户层线程切换和内核线程切换是两个概念。在已释放线程队列中的线程可以随时在内核中被attach并运行（为了获得线程所在的虚拟地址空间或执行内核APC），和cpu数目没关系，它还是使用当前正运行相应内核代码的cpu。

user: user-1
content: 对了，顺便问一句：  iocp相关的话题，系统创建了不同的数据结构，  其中一个是 已释放线程列表， 也就是正在执行的线程的表。  核心编程说：  完成端口的目标是根据在创建完成端口时候指定的并发线程数量，尽可能的将线程保持在已释放的线程列表中。 如果一个已释放的线程由于任何原因而进入等待状态，那么已释放的线程列表会缩减，完成端口会释放另一个正在等待的线程。  如果一个已暂停的线程被唤醒，那么它就会离开已暂停的线程列表，进入 已释放的线程列表。  这意味着：此时以及已释放线程列表中的线程数量将大于最大允许的并发线程数量。  第10章节 同步设备与异步设别i/o  page 313的最下面的一段文字。   请问 为什么已释放的线程列表中的线程数目将大于最大允许的并发线程数量？  释放的目的，无非就是让这些线程去处理其他。做其他工作。  好了，为了这个目的，释放过多的线程，比如超出  cpu数目+超线程数目  你释放就无意义了。是吧。  对， 说对了

user: user-0
content: 引用 6 楼 u012879787 的回复:[quote=引用 4 楼 mujiok2003 的回复:] 不避免，而是减少。 具体的技术就是一个lifo的线程调度方法。 因为时间片用完而换出是没有办法避免的。  引用Threads that block their execution on an I/O completion port are released in last-in-first-out (LIFO) order, and the next completion packet is pulled from the I/O completion port's FIFO queue for that thread. This means that, when a completion packet is released to a thread, the system releases the last (most recent) thread associated with that port, passing it the completion information for the oldest I/O completion.  谢谢   对了，顺便问一句：  iocp相关的话题，系统创建了不同的数据结构，  其中一个是 已释放线程列表， 也就是正在执行的线程的表。  核心编程说：  完成端口的目标是根据在创建完成端口时候指定的并发线程数量，尽可能的将线程保持在已释放的线程列表中。 如果一个已释放的线程由于任何原因而进入等待状态，那么已释放的线程列表会缩减，完成端口会释放另一个正在等待的线程。  如果一个已暂停的线程被唤醒，那么它就会离开已暂停的线程列表，进入 已释放的线程列表。  这意味着：此时以及已释放线程列表中的线程数量将大于最大允许的并发线程数量。  第10章节 同步设备与异步设别i/o  page 313的最下面的一段文字。   请问 为什么已释放的线程列表中的线程数目将大于最大允许的并发线程数量？  释放的目的，无非就是让这些线程去处理其他。做其他工作。  好了，为了这个目的，释放过多的线程，比如超出  cpu数目+超线程数目  你释放就无意义了。是吧。    [/quote]  顶起来，帮忙看看

user: user-3
content: 引用 7 楼 u012879787 的回复:[quote=引用 5 楼 jerry_dqh 的回复:] linux好办，使用函数sched_setaffinity可以调协cpu的亲和度，绑定某个线程至某个cpu,同时设置cpu的排他特性，对于多核的情况较常用这些方法  对于windows肯定也有对应的api,简单搜索了一下，这函数 SetThreadAffinityMask可能也可以，具体的我没有windows api经验，不过思路应该差不多。  cpu控制权这个概念好像不太准啊  呵呵，高手，cpu 的亲和性，这一节，我跳过了没有研究，没有看它。  觉得没有必要学。  请问： 让你的进程对cpu有了控制权，  有啥作用？  没有作用，就没有必要考虑cpu控制权吧。    [/quote] 作用当然有，主要是对于性能有些提高 ，普通的应用程序一般用不到，对于性能有些极至要求的程序需要用到，比如有些大型的游戏，电信级的应用，嵌入式应用程序等等地方用得比较多，而且必须使用。

user: user-0
content: 引用 5 楼 jerry_dqh 的回复:linux好办，使用函数sched_setaffinity可以调协cpu的亲和度，绑定某个线程至某个cpu,同时设置cpu的排他特性，对于多核的情况较常用这些方法  对于windows肯定也有对应的api,简单搜索了一下，这函数 SetThreadAffinityMask可能也可以，具体的我没有windows api经验，不过思路应该差不多。  cpu控制权这个概念好像不太准啊  呵呵，高手，cpu 的亲和性，这一节，我跳过了没有研究，没有看它。  觉得没有必要学。  请问： 让你的进程对cpu有了控制权，  有啥作用？  没有作用，就没有必要考虑cpu控制权吧。

user: user-0
content: 引用 4 楼 mujiok2003 的回复:不避免，而是减少。 具体的技术就是一个lifo的线程调度方法。 因为时间片用完而换出是没有办法避免的。  引用Threads that block their execution on an I/O completion port are released in last-in-first-out (LIFO) order, and the next completion packet is pulled from the I/O completion port's FIFO queue for that thread. This means that, when a completion packet is released to a thread, the system releases the last (most recent) thread associated with that port, passing it the completion information for the oldest I/O completion.  谢谢   对了，顺便问一句：  iocp相关的话题，系统创建了不同的数据结构，  其中一个是 已释放线程列表， 也就是正在执行的线程的表。  核心编程说：  完成端口的目标是根据在创建完成端口时候指定的并发线程数量，尽可能的将线程保持在已释放的线程列表中。 如果一个已释放的线程由于任何原因而进入等待状态，那么已释放的线程列表会缩减，完成端口会释放另一个正在等待的线程。  如果一个已暂停的线程被唤醒，那么它就会离开已暂停的线程列表，进入 已释放的线程列表。  这意味着：此时以及已释放线程列表中的线程数量将大于最大允许的并发线程数量。  第10章节 同步设备与异步设别i/o  page 313的最下面的一段文字。   请问 为什么已释放的线程列表中的线程数目将大于最大允许的并发线程数量？  释放的目的，无非就是让这些线程去处理其他。做其他工作。  好了，为了这个目的，释放过多的线程，比如超出  cpu数目+超线程数目  你释放就无意义了。是吧。

user: user-3
content: linux好办，使用函数sched_setaffinity可以调协cpu的亲和度，绑定某个线程至某个cpu,同时设置cpu的排他特性，对于多核的情况较常用这些方法  对于windows肯定也有对应的api,简单搜索了一下，这函数 SetThreadAffinityMask可能也可以，具体的我没有windows api经验，不过思路应该差不多。  cpu控制权这个概念好像不太准啊

user: user-4
content: 不避免，而是减少。 具体的技术就是一个lifo的线程调度方法。 因为时间片用完而换出是没有办法避免的。  引用Threads that block their execution on an I/O completion port are released in last-in-first-out (LIFO) order, and the next completion packet is pulled from the I/O completion port's FIFO queue for that thread. This means that, when a completion packet is released to a thread, the system releases the last (most recent) thread associated with that port, passing it the completion information for the oldest I/O completion.

user: user-0
content: 这2本书你看过没？  我看过一本，根本没有进程控制权的这个概念

user: user-5
content: 《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》