网络IO模型--事件模型

 编写高性能的网络应用程序,尤其是服务器端程序或进行web服务器的调优,需要深入理解网络IO模型。为了更好的理解IO模型,先介绍几个术语

1、术语

        1)同步、异步:这里的同步、异步说法很诡异的,不用在上面纠结,只需要知道有那几种IO模型就可以了,同步、异步就当成是组成IO模型的名称的一部分好了。

        2)阻塞、非阻塞:指IO就绪前调用IO操作的线程是否阻塞。 
        3)文件描述符fd:Linux的内核将所有外部设备都可以看做一个文件来操作,因此网络流的读写也作为文件来操作的。
        4)IO调用:包括IO就绪阶段和数据复制阶段(数据从内核复制到用户空间,数据复制是调用IO控制器完成的,调用线程期间必须阻塞)。


2、IO模型
        POSIX定义的IO模型的规定就两种 
             ■同步IO模型:引起线程的阻塞直到IO操作完成 
             ■异步IO模型:IO操作不会引起线程阻塞 
        但我们在网上看到的UNIX的IO模型的介绍一般有5种,其实,这些都是根据编程模型不同而衍生出来的。下面分别介绍一下这5种IO模型 
        1)同步阻塞IO
           线程阻塞,直到IO就绪,才调用IO操作。java中的普通socket读写就是这种模式了,read方法会一直堵塞,直到有数据才返回。 
        2)同步非阻塞IO
           进行IO调用的时候,如果IO没就绪,则直接返回错误码,而不是阻塞线程。应用程序可循环调用直到IO操作完成。
        3)IO复用(多路IO就绪通知)
           内核提供系统调用,检查有哪些fd已经就绪,已就绪的df,则进行数据复制。这种方式,根据不同的操作系统有不同的实现,linux提供了三种实现。 
           a、select调用方式,将多个fd丢给select系统调用,select对每个fd,进行判断,发现哪些fd就绪,则修改fd的状态,最后把包含所有fd的数组返回给应用程序,应用程序判断每个fd,对就绪的fd进行数据复制。 
           b、poll调用方式,基本上和select方式一样,不同在于select最多只支持1024个文件描述符,poll则没有限制。 
           c、epoll调用方式,和poll不同之处在于epoll采用了内存映射技术,并且epoll不是返回fd数组,而是返回一个就绪fd数量值,另外在一个数组中保存了就绪的fd(不像select和poll是所有fd),因此在性能上会好很多,java的nio就是采用这种模式实现的。 
        4)sigio(信号驱动)方式,IO就绪时,通过信号通知应用程序来复制数据,速度是很快的,但是只会通知一次,如果应用程序不处理,或系统的错误(比如通知的事件队列满了或者轮到该通知事件通知的时候文件已经关闭了),就会发生事件丢失。而select、poll、epoll等系统调用,每次调用都会得到就绪的fd数组,不会发生丢失。 
        5)异步IO(AIO)方式,告诉操作系统要做IO操作,df就绪及数据复制都由操作系统完成,完成后通知应用程序。java 7实现了这种方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值