多个ServerBootstrap可以实现一套计算资源,不同的处理逻辑
IO密集型和计算密集型
IO密集型就是和kernel打交道很多,会有比较多的系统调用。
计算密集型则相反,更多的是在单纯用CPU做计算,而不怎么与内核打交道。
正常来说,网卡到程序的过程中一定伴随着中断操作的干预,而当网卡数据来临非常频繁时,底层会进行优化,内核会关闭中断,然后直接让CPU疯狂从网卡的buffer中取出数据到内核的buffer中,且这个过程是底层系统硬件实现的。 但即使是这样,如果我们程序不尽快取走内核buffer中的数据,造成积压,还是会使得数据消费不过来,也就由此有划分了IO线程和Executor线程,不让两者掺杂,尽量让两者并行起来。
Selector操作在java中的实际含义
selector.select()是系统调用,将内核中的就绪状态取到用户内存(JVM的直接内存)中,
selector.selectedkeys()则是将直接内存的状态集合拷贝一份到JVM堆空间中。
并且每一个状态取出后,需要使用remove,把它从JVM直接内存中移除掉,否则下一次selectedkeys还会将此状态取出(而此状态实际上已经没数据了)