Linux IO

目录

同步和异步:

阻塞和非阻塞:

Linux的IO模型有五种:


同步和异步:

同步和异步是针对应用程序和内核的交互而言的。同步过程中,进程出发IO操作并等待或者轮询去查看IO是否完成。异步过程中进程触发IO操作后直接返回,做自己的事情,IO交给内核处理,完成后内核通知进程IO操作已经完成。

阻塞和非阻塞:

不能立即返回结果就是阻塞。

Linux的IO模型有五种:

  • 阻塞IO
  • 非阻塞IO
  • 信号驱动式IO(不常用)
  • 多路复用IO
  • 异步IO

一次网络IO(Read)分为两个步骤:1、等待数据准备 2、将数据从内核拷贝到进程中。

阻塞IO:当用户调用IO读数据时,内核进入第一个阶段,准备数据,此时可能数据还没完全准备好,用户进程就需要一直等待直到内核给出数据。

非阻塞IO:用户发出IO读操作后,如果内核没准备好数据,就直接返回error,不会阻塞用户进程,从用户的角度而言,发出的操作立即得到了响应,不需要等待,但结果是error时它直到数据还没有准备好,于是它再次发起请求,直到某一次内核准备好数据返回结果,将数据拷贝到用户内存,这个过程,进程没有阻塞,但一直在主动的询问。

多路复用IO:也叫事件驱动IO,select/epoll即是此IO,好处是单个Process就可同时处理多个网络IO,他的原理就是select、epoll函数会不断的轮询所负责的所有socket,当某个socket有数据到达时,就通知用户。用户调用了select,进程会被阻塞,同时内核监视所有socket,当有一个准备好数据,则立即返回,然后用户在调用read。阻塞IO的话是用户直接调用read。使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

异步IO:用户发起Read后,就去做其他事情,内核异步请求后,立刻返回,不会阻塞用户进程,然后等待数据准备完成,拷贝至用户内存,之后发送给用户进程一个singal,通知操作完成。

阻塞IO、非阻塞IO、多路复用IO都属于同步IO。之所以非阻塞IO也是同步IO,是因为在非阻塞IO中,真正的IO操作是内核准备好数据后拷贝到用户内存的过程,整个过程进程被阻塞。

select/epoll/poll

IO多路复用可以监听多个描述符,一旦某个描述符就绪,就通知程序进行相应的操作。

 

 

参考: https://www.cnblogs.com/Anker/p/3254269.html

http://www.cnblogs.com/Anker/p/3265058.html

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值