线程在IO操作未完成的时候也会发生线程Context切换吗

CFS调度器,在执行IO时挂起,在IO完成时换醒,这两个都是上下文切换,采用红黑树做wait_queue 时间为 O(log m) ,m为同优先级上下文数问题是并发量大时,web应用不是读网络就是写,是有大量IO的(并发量大时),也就是会有大量上下文切换,每次开销都是O(log m)所以才会提出Fiber或Coroutine,把切换开销留在用户态,自己在程序内调度请搜 C10K问题下为什么传统线程模型不再适用
■网友
你把操作系统的调度想的太牛逼了 先去看下现代操作系统(原书第3版) 高清PDF扫描版 电子书 下载这本书的前两章
■网友
IO操作没完成的话,线程不会再被调度。但是,很多线程确实会带来额外的开销。如果应用是计算密集的,可能在一部分计算没有完成的时候,就切换到另一个线程了。这种情况最好是让它一直算完。算到一半,切换出去,过一会儿再切回来,就白白浪费了两次切换的开销。CFS的话,时间片的长度不固定,系统里的活跃线程数越多,切换的就越快。这也会提高切换的开销。另外,更多线程,会消耗更多内存;而消耗内存,就是挑战Cache和内存的容量。Cache未命中,访问主存的话,要几百个周期;内存不够,磁盘交换,上亿周期……不过,对于网络服务器来说,一般都是IO密集的。只要别引起磁盘交换,浪费一点,问题也不大。
■网友
【线程在IO操作未完成的时候也会发生线程Context切换吗】 发生阻塞io时, 线程由执行, 到挂起, 再到中断唤醒, 再被调度器安排执行, 开销是很大的, 同时更容易导致cache失效, 你说的那个模型在并发下, 同时存在成千上万的线程, 开销可想而知。


    推荐阅读