IO模型

IO模型

1.同步、异步、阻塞、非阻塞

先说下概念:

阻塞(非阻塞):数据没准备好是否要一直(不)等待

同步(异步):是否当前线程处理
在这里插入图片描述

  • 咖啡店 -> 服务器
  • 咖啡 -> 数据
  • 咖啡做好 -> 数据就绪
  • 取/送 咖啡 -> 传输数据
排队模式等待叫号模式点外卖模式
BIO(同步阻塞)NIO(同步非阻塞)AIO(异步非阻塞)
  • 阻塞非阻塞

    • 咖啡没好是排队死等还是其他的

      • 阻塞:没有数据传过来时,读会阻塞直到有数据;缓冲区满时,写操作也会阻塞。

        非阻塞:遇到这些情况,都是直接返回。

  • 同步异步

    • 咖啡好了,谁来取?
    • 同步:通知请求线程来读取。
    • 异步:服务区处理完通过回调直接将数据读好给请求程序。
2.IO模型

IO分类

在这里插入图片描述

阻塞IO

阻塞IO: 如图所示 所有文件操作都是阻塞的 知道获取数据,复制完成为止。

img

2.非阻塞IO
非阻塞IO:如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来,等到数据准备好后,发起系统调用,此时是同步阻塞的获取数据。

img

3.IO多路复用

**IO多路复用:**使用到了linux提供的的select/poll/epoll 。进程将一个或者多个fd传递给选择器(select/poll/epoll),选择器帮我们侦测到是否有fd处于就绪状态,

img

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模型也是存在一个过渡的阶段的。

单线程模式就当与自己开的一个小店,既要招待客人,又要上菜。

多线程模式 就是小店挣钱了,找了几个伙计,伙计和自己一起招待客人上菜。已经出具一定的规模。

主从线程模式,就是一个五星级的酒店,有专门的的去招待客人的人,专门上菜的人,完全是各司其职。容纳量当然也更大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值