linux下的5种IO模型

 

Linux高级IO
五种IO模型

    阻塞IO:内核在准备好数据之前,系统调用会一直等待,直到内核准备好数据,再将数据报从内核拷贝到用户空间,系统调用 才会成功返回。所有的套接字默认都是阻塞方式,如:recvfrom /sendto
    非阻塞IO:若内核未准备好数据,系统调用会直接返回,并返回EWOULDBLOCK错误码。这就需要程序员反复尝试读写文件描述符,也称这种方式为“轮询”,不足之处正在于浪费cpu,因为大多数时间是无数据可读的,但仍花费时间不断执行read进行系统调用,多任务系统中应该避免使用。
    信号驱动IO:用信号处理函数sigaction对SIGIO信号进行处理,一旦内核准备好了数据,SIGIO信号会通知应用进程进行IO操作。这种方式一旦信号被触发,进程中的所有线程都要被挂起,对于服务器进程来说不友好,当信号到来,所有处理客户端请求的线程都要被挂起,都在等待数据从内核拷贝到用户空间,显然不可以。
    IO多路转接:先构造一张有关文件描述符的列表,然后调用一个函数,当这些文件描述符中有一个处于就绪状态,该函数就返回,返回时告诉进程哪些文件描述符准备好了。其本质是它可以等待多个文件描述符的就绪状态。这种方式现已被广泛使用。是一种有效提高时间利用率的手段(类似医生看病)。select,poll,epoll这三个函数能够实现IO多路复用。IO多路复用适用于非常多的客户端来访问服务器,但只有几个处于活跃状态(QQ服务器)
    异步IO:内核拷贝完数据后,才会通知应用进程,

任何IO过程都包括两个步骤:1.等待;2.拷贝数据;一般来说,等待的时间都会远远大于拷贝数据的时间,要优化IO时间,提高性能,就要从数据等待的时间入手。凡是提到给一个程序进行性能优化,应该先寻找性能瓶颈。这里我们要优化等待时间,可将系统调用函数设置成非阻塞,若无数据直接返回,省去了等待数据的时间,两次调用之间程序可以做其他事情,时间并没有被浪费。信号驱动IO也是如此,在数据未准备好时,可以一直做其他事情。直到数据就绪,才会触发信号进行IO操作。

    同步和异步:描述的是调用者和被调用者之间的行为

        同步是指由调用者主动等待调用的结果。当调用者发起一个调用,未得到结果之前调用一直不返回,直到得到返回值,调用才会返回。就好比我们去吃饭,点餐后一直在前台等待,直到饭做好后我们才端走去吃。
        异步是指调用者发出调用之后未收到返回结果就直接返回了,它的返回结果是被调用者通过状态、通知来将结果反馈给调用者。再如我们出去吃饭,点餐后我们就找个地坐下,当饭好了之后,服务员会为我们端过来。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值