首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPU是否会浪费时间在为IO读写而阻塞的java线程上?

CPU是否会浪费时间在为IO读写而阻塞的java线程上?
EN

Stack Overflow用户
提问于 2018-05-29 11:46:08
回答 1查看 1.1K关注 0票数 5

如果一个线程在向IO写入数据时被阻塞,CPU是否需要在此IO操作完成之前随时给予该线程?

如果是的话,为什么CPU要放弃呢?

如果没有,除了“每个线程堆栈”之外,还有什么东西使得“每个线程的请求”在重载下不像“共享线程的非阻塞IO”那样好呢?

PS:我读过很多关于这个话题的问题&我找不到一个能解决这个问题的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-29 11:51:58

如果一个线程在向IO写入数据时被阻塞,CPU是否需要在此IO操作完成之前随时给予该线程?

不,操作系统只会排掉一个等待再次运行并继续运行的线程的队列。

如果没有,除了“每个线程堆栈”之外,还有什么东西使得“每个线程的请求”在重载下不像“共享线程的非阻塞IO”那样好呢?

删除等待线程并恢复它对于一个线程来说可能很便宜,但是当您有数千个线程时,它并不便宜。不要忘记,操作系统必须计算要恢复哪个线程(根据优先级),在哪里恢复它(根据可用的CPU和关联),CPU本身可能需要将线程使用的内存加载到缓存行中,这真是太麻烦了。

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

是的,成千上万的线程消耗的内存可以占用大量的内存,从而减缓整个系统的运行速度。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50583595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档