CPU 是否在因 IO read/write 而阻塞的 java 线程上浪费时间?

Does CPU waste time on a java thread thats blocked for IO read/write?

如果一个线程在向 IO 写入数据时被阻塞,CPU 是否需要给这个线程任何时间直到这个 IO 操作完成?

如果是这样,CPU 为什么要放弃?

如果不是,除了 "stack per thread" 之外,是否还有其他因素导致 "request per thread" 在重负载下性能不如 "non blocking IO with shared threads"?

PS:我已经阅读了很多关于这个主题的 SO 问题,但我找不到解决这个特定方面的答案

If a thread is blocked while writing data to IO, does the CPU need to give this thread any time till this IO operation is complete?

不,操作系统只会使等待 运行 的线程再次出列并恢复它。

If not, is there any thing otherthan "stack per thread" that makes "request per thread" not to perform as good as "non blocking IO with shared threads" under heavy load?

将一个等待的线程从队列中取出并恢复它对于一个线程来说可能很便宜,但是当你有成千上万个线程时它就不便宜了。不要忘记操作系统必须计算恢复哪个线程(根据优先级),在哪里恢复它(根据可用的 CPUs 和亲和力)并且 CPU 本身可能必须将线程使用的内存加载到缓存行中,这是一个真正的婊子。

更不用说进入睡眠状态的线程必须将其数据从缓存行刷新到 RAM 中,这是一个非常昂贵的操作(缓存行存在是有原因的,一个很大的原因)。

是的,数千个线程消耗的内存会占用大量内存,从而降低整个系统的速度。

现在,并不是说 HTTP 服务器不能只用线程和阻塞 IO 就不能很好地执行,而是因为今天使用异步操作(使用期货、async/await、回调)非常容易,所以我们对于实际需要速度的服务器,更喜欢异步 IO。