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

时间:2018-05-29 11:46:09

标签: java multithreading io nonblocking

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

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

如果没有,是否有任何东西"堆叠每个线程"这使得"请求每个线程"不要像#34;使用共享线程阻止IO一样好"在重载下?

PS:我已经在这个主题上阅读了大量的SO问题。我找不到解决这个具体方面的答案

1 个答案:

答案 0 :(得分:1)

  

如果在向IO写入数据时阻塞了某个线程,那么CPU是否需要   在IO操作完成之前随时给这个线程?

不,操作系统只会将等待再次运行的线程出列并继续运行。

  

如果没有,那么除了“每个线程的堆栈”之外还有什么东西吗?   “每个线程的请求”不能像“非阻塞IO一样好”   共享线程“负载很重?”

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

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

是的,成千上万个线程消耗的内存会占用大量内存,从而减慢整个系统的速度。

现在,它不像HTTP服务器只能在线程和阻塞IO上运行良好,但由于今天使用异步操作(使用future,async / await,callbacks)非常容易,我们只是喜欢异步IO对于实际需要速度的服务器。