如果在向IO写入数据时线程被阻塞,那么在IO操作完成之前,CPU是否需要随时给出该线程?
如果是这样,为什么CPU放弃?
如果没有,是否有任何东西"堆叠每个线程"这使得"请求每个线程"不要像#34;使用共享线程阻止IO一样好"在重载下?
PS:我已经在这个主题上阅读了大量的SO问题。我找不到解决这个具体方面的答案
答案 0 :(得分:1)
如果在向IO写入数据时阻塞了某个线程,那么CPU是否需要 在IO操作完成之前随时给这个线程?
不,操作系统只会将等待再次运行的线程出列并继续运行。
如果没有,那么除了“每个线程的堆栈”之外还有什么东西吗? “每个线程的请求”不能像“非阻塞IO一样好” 共享线程“负载很重?”
将一个等待线程出列并恢复它可能对一个线程来说很便宜,但是当你拥有数千个线程时它并不便宜。不要忘记操作系统必须计算要恢复的线程(根据优先级),在哪里恢复它(根据可用的CPU和亲和性)并且CPU本身可能必须将线程使用的内存加载到缓存行,这是一个真正的婊子。
更不用说进入休眠状态的线程必须从高速缓存行将其数据刷新到RAM本身,这是一个非常昂贵的操作(高速缓存行是有原因的,大的)。
是的,成千上万个线程消耗的内存会占用大量内存,从而减慢整个系统的速度。
现在,它不像HTTP服务器只能在线程和阻塞IO上运行良好,但由于今天使用异步操作(使用future,async / await,callbacks)非常容易,我们只是喜欢异步IO对于实际需要速度的服务器。