【发布时间】:2015-04-08 14:52:09
【问题描述】:
我试图了解操作系统如何处理不同模型中的上下文切换,以更好地理解为什么 NIO 性能在请求数量达到较大峰值的情况下会更好。除了线程数量可能有限制之外,我很好奇在大量请求中执行的阻塞操作如何影响资源利用率。
在每个线程一个请求的模型中,比如基于 servlet 2.5 的 Web 应用程序,如果 499 个线程正在等待数据库 IO 并且只有一个线程需要工作,操作系统上下文是否会在所有这 500 个线程之间切换,试图找到那个那需要工作吗?为了执行上下文切换,操作系统必须存储当前线程的状态,并恢复下一个线程的状态。这样做之后,操作系统会发现它不需要任何 CPU 时间,并且会保持上下文切换,直到找到需要工作的线程。 此外,这在服务器利用率方面是什么样的? CPU 是否低,因为它主要受交换上下文的 IO 成本的限制,而不是实际计算任何东西?
提前感谢您的帮助。如果您能指出书籍、教科书等的方向,我也将不胜感激。
【问题讨论】:
-
核心上的 CPU 执行是操作系统管理的资源之一。操作系统内核状态机已经知道哪些线程需要该资源,哪些不需要。如果一个线程请求 I/O 并且请求不能立即得到满足,操作系统知道该线程不需要 CPU 资源,直到 I/O 请求得到满足,所以它不会给线程任何执行,直到它满足.杰里米的回答有更多细节。
标签: multithreading threadpool nonblocking context-switch context-switching