既有 Non-Blocking I/O,为什么还要Readiness Selection ?
Non-Blocking I/O已经可以做到不阻塞、不会导致线程发呆了,为什么还要Readiness Selection? 是因为Non-Blocking I/O仍需要轮询吗?虽然Readiness Selection号称属于系统通知机制,但我们在写代码时还是得通过select()来查看有没有通知,本质上其实还是轮询。 那Readiness Selection倒底有没有好处? 我试着回答一下: 1. 轮询的对象不一样,代价也不一样。 Non-Blocking I/O下,线程需要逐个查看各个Channel;而在Readiness Selection时,线程只需要查看单个selector下有没有事件发生。前一种轮询可能会导致多个system call, 而后一种不会。在后一种情况下,OS高效地帮你做了很多事情,直接利用OS提供的功能,总体代价要小得多。 2. Non-Blocking I/O时,发现有数据后必须马上读数据,而Readiness Selection中,可以选择先放一下. 有时候你的应用的性能可能取决于你有没有“先放一下”的自由,比如说,当前CPU Load太高了,可以先不分配线程来读数据,等系统较空闲时再去处理。