IO模型
1.同步、异步、阻塞、非阻塞
先说下概念:
阻塞(非阻塞):数据没准备好是否要一直(不)等待
同步(异步):是否当前线程处理
- 咖啡店 -> 服务器
- 咖啡 -> 数据
- 咖啡做好 -> 数据就绪
- 取/送 咖啡 -> 传输数据
排队模式 | 等待叫号模式 | 点外卖模式 |
---|---|---|
BIO(同步阻塞) | NIO(同步非阻塞) | AIO(异步非阻塞) |
-
阻塞非阻塞
-
咖啡没好是排队死等还是其他的
-
阻塞:没有数据传过来时,读会阻塞直到有数据;缓冲区满时,写操作也会阻塞。
非阻塞:遇到这些情况,都是直接返回。
-
-
-
同步异步
- 咖啡好了,谁来取?
- 同步:通知请求线程来读取。
- 异步:服务区处理完通过回调直接将数据读好给请求程序。
2.IO模型
IO分类
阻塞IO
阻塞IO: 如图所示 所有文件操作都是阻塞的 知道获取数据,复制完成为止。
2.非阻塞IO
非阻塞IO:如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来,等到数据准备好后,发起系统调用,此时是同步阻塞的获取数据。
3.IO多路复用
**IO多路复用:**使用到了linux提供的的select/poll/epoll 。进程将一个或者多个fd传递给选择器(select/poll/epoll),选择器帮我们侦测到是否有fd处于就绪状态,
3.IO多路复用
BIO处理模型
每一个请求都创建一个线程进行处理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qk4FXqDn-1606302431821)(/Users/zy1994/Library/Application Support/typora-user-images/image-20201125180419607.png)]
Reactor 单线程模型:
netty实现:
EventLoopGroup eventGroup = new NioEventLoopGroup(1);
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);
Reactor 多线程模式
netty实现:
EventLoopGroup eventGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);
Reactor 主从多线程模式
netty实现
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup);
可以看到Reactor模型也是存在一个过渡的阶段的。
单线程模式就当与自己开的一个小店,既要招待客人,又要上菜。
多线程模式 就是小店挣钱了,找了几个伙计,伙计和自己一起招待客人上菜。已经出具一定的规模。
主从线程模式,就是一个五星级的酒店,有专门的的去招待客人的人,专门上菜的人,完全是各司其职。容纳量当然也更大。