java网络编程_IO模型

理解java的BIO、NIO、AIO的原理:

一、UNIX编程中的五种IO模型:

 1. 阻塞IO
     外卖小哥去商家取外卖,到了麻辣烫店,商家还没做好,
     外卖小哥虽然还有其他单子要送,但是不得不焦急地等着商家;
 2. 非阻塞IO
     外卖小哥去商家取外卖,到了麻辣烫店,商家还没做好,
     外卖小哥出去休息会儿后来看还是没做好,又出去休息会儿后再看还是没好,
     商家看到小哥很着急,加速打包,等小哥再来时,终于成功取餐;
 3. 多路复用IO
     外卖小哥去商家取外卖,突然想到上次到麻辣烫店等了很久,
     于是打电话给商家:“做好了给回个电话好吗“”,商家:“好的”;
     不一会儿商家做好了打电话给外卖小哥,外卖小哥过来后直接取餐不用再等那么久了;
 4. 信号驱动IO
     外卖小哥去商家取外卖,不想每次打电话浪费话费了,
     商家过会做好了,也通知平台餐已做好;
     平台收到后立即通知外卖小哥,小哥随即出发取到了麻辣烫;
 5. 异步IO
     外卖小哥去商家取外卖,突然被老板叫去训话,但是刚接的单不能耽搁了,
     于是让同事帮忙取一下,自己训完话就去送;同事小美等餐好了后,取回来告诉了外卖小哥:“我帮你取回来了”’;
     小哥正好训完话,一番感谢后,随即出发送餐去了;

异步与同步的区别:

单个进程与多个进程;(外卖小哥自己等与找人代劳)

阻塞与非阻塞的区别:

单线程等待与多线程并发;(外卖小哥在商家等与餐好了再去)

二、java网络编程IO模型

1. BIO原理

同步并阻塞,服务器实现模式为一个连接一个线程,
如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
缺点:客户端增多,新建线程增多,性能下降,甚至死掉;

2. NIO原理

同步非阻塞,服务器实现模式为一个请求一个线程,
即客户端发送的连接请求都会注册到多路复用器Selector上,
多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。(基于Reactor)
1 服务端:打开ServerSocketChannel,设置连接为非阻塞模式,绑定端口,
    打开通道管理器Selector,并把channel注册到Selector上,selector循环监听客户端连接;
2 客户端:打开SocketChannel,设置连接为非阻塞模式,绑定IP和端口,
    打开通道管理器Selector,并把channel注册到Selector上,selector循环监听服务端连接;
3 服务端:selector监听到连接请求,完成连接,可以write发消息到客户端;
    注册读监听,可以监听下次客户端发来的消息;
4 客户端:selector监听到连接请求,完成连接,可以write发消息到服务端;
    注册读监听,可以监听下次服务端发来的消息;

3. AIO原理

异步非阻塞,服务器实现模式为一个有效请求一个线程,
与NIO的区别是:客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理;

猜你喜欢

转载自blog.csdn.net/Bristor/article/details/82051302