阻塞式IO(BIO)
这个是超级慢的一个IO模型,就是当应用程序要进行系统调用的时候,向内核发送请求调用,这个时候要一直等待IO的状态变化,直到IO的状态符合了应用程序的要求,然后内核进行复制数据,最后返回给应用程序,这个过程是阻塞的,应用程序做不了其他的任何事情。
非阻塞式IO(NIO)
非阻塞式IO指的是应用程序向内核发送系统调用的请求过程中,如果内核没有准备好数据,那么久返回一个无数据,下次应用程序继续发送请求,就这样一直轮询,直到内核监听的IO状态达到了应用程序的要求,那么久开始复制数据然后成功返回。
IO多路复用(NIO+Selector)
Selector也被翻译为多路复用器
应用程序想服务器内核发送请求,数据为准备哈,则服务器一直阻塞,等数据准备好了之后就通知应用程序可以进行调用了,然后应用程序再进行调用,复制数据到成功返回。
这样的好处是内核可以监听多个IO,不止一个IO,任何一个IO的状态变化都会返回给应用程序变化的信息。
部分代码:
// 不停地监听selector
while (true)
{
selector.select();
// 获得被触发的keys
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey key : selectionKeys)
{
handles(key);
}
// 清空已经执行的key,不然会和下次监听的事件混合在一起
selectionKeys.clear();
异步IO模型
应用程序在第一次进行系统调用的时候,如果数据没有准备好了的话,那么内核返回无数据,在内核的内部会一直监听IO的变化,如果条件符合应用程序上次的请求调用,那么内核会自动的帮应用程序进行数据复制,等到数据复制成功了之后,会直接给应用程序发信号说:上次你要的请求的数据我已经给你复制好了,来拿吧!这个就是纯异步IO模型。