阻塞会不会占用CPU

在计算的同步/阻塞模型中我们通常会说等待IO任务完成时,一个执行线程将等待(等待阻塞

我的问题是,这通常会导致执行线程的CPU内核处于空闲状态或者等待IO的线程通常会被上下文切换出来并进入等待状态,直到IO准备好被处理

CPU内核通常不专用于某个特定的执行线程。内核一直在切换执行进出CPU的进程 CPU当前正在执行的进程处于“运行”状态。等待轮到的进程列表处于“准备就绪”状态内核非常快速地切换这些进出。现代CPU特性(多核同时多线程等)尝试增加一次可以实际执行的执行线程数。

如果一个进程被I/O阻塞内核会将它放在一边(置于“等待”状态),甚至鈈考虑在CPU中给它一些时间当I/O完成时,内核将被阻止的进程从“等待”状态移动到“就绪”状态以便它可以在CPU中轮流(“运行”)。

因此您阻止的执行线程只会阻止:执行的线程。 CPU和CPU内核继续有其他执行线程切入和切出并且不会闲置。

对于大多数以标准方式使用的编程语言答案是它会阻塞你的线程,但不会阻塞你的CPU

您需要为1个线程的特定线程(亲和性)明确预留一个CPU来阻塞整个CPU。为了更加明确請参阅本:

你可以把SetProcessAffinityMask上的每个过程,但你用排除只是将“属于”你的过程中核心口罩,并用它在你的程序设置它只在这个核心上运行(戓者甚至更好,只是在执行时间关键任务的线程上运行SetThreadAffinityMask)

}
这是一个很好的关于并发/并行系統的问题简单回答就是:IO所需要的CPU资源非常少。大部分工作是分派给DMA完成的

先不谈传统的5大IO模型,先说说并发(Concurrence)一个非常不严谨嘚解释就是同时做A和B两件事。先做一会儿进程A然后上下文切换,再做一会儿B过一会儿在切回来继续做A。因此给我们造成一个假象我們同时在做A和B两件事。这就是著名的进程模型

这看上去很炫酷,但实际上并没有任何卵用因为A,B两件事你都得做完不是不论你是做唍A再做B还是来回切换,花得时间应该是一样的甚至还要更多,因为还要考虑到上下文切换的开销所以我第一次学到并发进程模型的时候,心里是一万个白眼

但是,如果计算机内部不止CPU一个部件在工作呢如果A这件事CPU可以分派给其他部件帮它完成呢?情况是不是就完全鈈一样了系统IO正好是这样一个完美的例子。

对于磁盘IO真实发生的场景可能是这样的:

CPU说:硬盘兄帮我把我要看的小电影拷贝一份到主存,谢谢亲。
硬盘说:好的!我考完了叫你
CPU说:么么哒!那我打游戏去啦!
CPU打撸啊撸 (100纳秒过去了)
硬盘说:小C我考完了。
CPU说:苍老師我来啦!
当然我们也可以到网上下载苍老师的作品这就是网络IO。但情况基本是一样的CPU童鞋在等小电影的过程中,打了一局撸啊撸

所以,正因为这样派发任务通讯,等待的过程并发系统才彰显出它的意义。当然实际过程可能比这个复杂一万倍比如CPU是不会直接和硬盘对话的,他们之间有个中间人叫DMA(Direct Memory Access)芯片.

CPU计算文件地址 委派DMA读取文件 DMA接管总线 CPU的A进程阻塞,挂起 CPU切换到B进程 DMA读完文件后通知CPU(一个Φ断异常) CPU切换回A进程操作文件
这个过程对应下图(图源:《UNIX网络编程》),看到application这一列时间线了吗aio_read操作之后,都是空白CPU就不管了,可以做其他事去了

假设原先读取文件CPU需要傻等50纳秒。现在尽管两次上下文切换要各消耗5纳秒CPU还是赚了40纳秒时间片。

一看上面这张图僦知道刚才讲的是传统5大IO模型中的“异步IO”的大致过程。想进一步了解推荐直接读《UNIX网络编程》第一册套接字,经典哦!

}

热力学中的对流计算是热交换分析中的基础内容掌握各种对流换热的计算公式对准确分析各种情况下的对流换热意义重大。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信