gpt4 book ai didi

java - CPU 是否会在因 IO 读/写而阻塞的 Java 线程上浪费时间?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:21 25 4
gpt4 key购买 nike

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

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

如果不是,除了“每个线程的堆栈”之外,是否有任何东西使得“每个线程的请求”在重负载下的性能不如“共享线程的非阻塞 IO”?

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?

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

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

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

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

关于java - CPU 是否会在因 IO 读/写而阻塞的 Java 线程上浪费时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com