代码之家  ›  专栏  ›  技术社区  ›  Ashok Koyi

CPU在Java线程上浪费时间是为了阻止IO读/写吗?

  •  3
  • Ashok Koyi  · 技术社区  · 8 年前

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

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

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

    附言:我已经阅读了大量关于这个主题的SO问题,我找不到解决这个特定方面的答案。

    1 回复  |  直到 8 年前
        1
  •  1
  •   David Haim    8 年前

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

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

    如果没有,除了“每个线程的堆栈”之外,还有什么东西可以使 “每个线程请求”的性能不如“无阻塞IO” 共享线程“在重负载下?

    从等待线程中退出并恢复它对于一个线程来说可能很便宜,但是当您拥有数千个线程时,这并不便宜。别忘了,操作系统必须计算要恢复的线程(根据优先级)、恢复的位置(根据可用的CPU和关联性)以及CPU本身可能必须将线程使用的内存加载到缓存线中,这是一个真正的比特。

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

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

    现在,它不像HTTP服务器在只使用线程和阻塞IO的情况下不能很好地运行,但由于现在使用异步操作(使用预购、异步/等待、回调)非常容易,因此我们只希望异步IO用于实际需要速度的服务器。