如果一个线程在向IO写入数据时被阻塞,CPU是否需要在此IO操作完成之前随时给予该线程?
如果是的话,为什么CPU要放弃呢?
如果没有,除了“每个线程堆栈”之外,还有什么东西使得“每个线程的请求”在重载下不像“共享线程的非阻塞IO”那样好呢?
PS:我读过很多关于这个话题的问题&我找不到一个能解决这个问题的答案。
发布于 2018-05-29 11:51:58
如果一个线程在向IO写入数据时被阻塞,CPU是否需要在此IO操作完成之前随时给予该线程?
不,操作系统只会排掉一个等待再次运行并继续运行的线程的队列。
如果没有,除了“每个线程堆栈”之外,还有什么东西使得“每个线程的请求”在重载下不像“共享线程的非阻塞IO”那样好呢?
删除等待线程并恢复它对于一个线程来说可能很便宜,但是当您有数千个线程时,它并不便宜。不要忘记,操作系统必须计算要恢复哪个线程(根据优先级),在哪里恢复它(根据可用的CPU和关联),CPU本身可能需要将线程使用的内存加载到缓存行中,这真是太麻烦了。
更不用说,进入休眠状态的线程必须从缓存行将其数据刷新到RAM本身,这是一项非常昂贵的操作(缓存行存在是有原因的,有一个很大的原因)。
是的,成千上万的线程消耗的内存可以占用大量的内存,从而减缓整个系统的运行速度。
现在,这并不像HTTP服务器不能只使用线程和阻塞IO就能很好地执行,但是由于现在使用异步操作(使用期货、异步/等待、回调)非常容易,所以对于实际需要速度的服务器,我们更喜欢异步IO。
https://stackoverflow.com/questions/50583595
复制相似问题