从零开始学Netty(一)常见的IO模型

什么是Netty?

Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。

(Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.)

这是github上官方给出的定义。这句话对于初识netty的人来说,确实晦涩难懂。我希望当你看完这个系列文章 后会对这句话有一个新的认识。

同步,异步,阻塞,非阻塞的概念

同步与异步:

同步与异步是针对应用程序与内核的交互而言。从内核中读取数据,如果内核中数据还没有准备好,如果是同步操作,它会一直等待,直到操作完成。如果是异步操作,那么它会去做别的事情,等待数据准备好,内核通知它,它再去读取数据。

阻塞与非阻塞:

应用进程请求IO操作时,如果数据未准备好,请求立即返回就是非阻塞,不立即返回就是阻塞。(非阻塞即发起准备数据命令后立即返回去执行后面的逻辑,若线程阻塞等待数据准备的就是阻塞)

阻塞模型(BIO)

bio

BIO的特点是在准备数据的阶段和把数据从内核复制到用户空间两个阶段都是阻塞的。是同步阻塞的IO模式,因为两个阶段都阻塞。因为模型简单,我们在刚学习网络编程时的写的简单通信软件一般都采用这个模型。但是在实际网络通信中,这个模型并不适用。下一篇就来告诉大家为什么这个模型不适合实际的网络开发。

非阻塞模型(NIO)

nio

在应用程序发出数据请求时,当内核没有准备好的时,用户线程不会阻塞,而是立刻收到操作系统未准备好数据的消息,然后用户线程接着处理自己其他的代码,过一阵子之后再次发起询问(一般用循环来实现),直到内核准备好数据后将数据从内核拷贝到用户空间,这个阶段仍然是阻塞的。

多路复用IO模型(IO Multiplex)

Multiplex
这个模型是操作系统提供了select的功能,用户可以在select上注册自己感兴趣的事件,然后用户调用select方法时会阻塞,当这些事件出现时会返回,然后用户就可以根据具体的事件来实现自己的逻辑了。比如用户在select注册了读事件,然后调用select()方法,此时调用的线程就会被select阻塞,直到内核准备好要读的内容,此时select()就会返回,用户就能拿到读事件,此时再去内核将数据拷贝到用户空间。

这个模型也是java中NIO的实现模型。

信号驱动IO(Signal driven IO)Signal driven IO

使用信号驱动I/O时,当网络套接字可读后,内核通过发送SIGIO信号通知应用进程,于是应用可以开始读取数据。有时也称此方式为异步I/O。但是严格讲,该方式并不能算真正的异步I/O,因为实际读取数据到应用进程缓存的工作仍然是由应用自己负责的。

异步IO模型(AIO)

aio

用户进程发起数据请求后,立刻收到内核的返回去执行自己的其他代码。当内核准备好数据后会将数据拷贝到用户内存中,当这些都做好后会给用户进程发送一个信号,然后再由用户进行操作。

小结

上面列举了五种io模型,现在有些看不明白也没关系,下面会慢慢带大家深入理解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值