阻塞IO、非阻塞IO、同步、异步

Linux I/O模式分为5种

阻塞I/O(blocking I/O)
非阻塞I/O(non-blocking I/O)
I/O多路复用(I/O multiplexing)
信号驱动(signal driven I/O)(不常用)
异步I/O(asynchronous I/O)

1、阻塞I/O(blocking I/O)

在Linux中,默认情况下,所有的socket都是阻塞的。图示如下:
阻塞式I/O图中提到两个阶段,两个阶段都被阻塞了,进程阻塞在那儿什么也干不了:
① 进程等待内核数据准备;
② 内核数据准备完毕,等待数据从内核拷贝到进程中;

  • 例子:一个人用一个电热壶烧水,把电热壶通电后,然后一直盯着它,直到水烧开,才提水离开。这个过程中,这个人就是进程或线程,在等水烧开过程中什么也干不了。
2、非阻塞I/O(nonblocking I/O)

非阻塞 IO的特点是用户进程需要不断主动询问内核数据准备好了没有,图示如下:
非阻塞I/O我们可以看到,所谓的非阻塞I/O,其实在内核将数据从内核空间复制到进程的用户空间时,进程还是被阻塞的。

  • 例子:一个人用一个电热壶烧水,把电热壶通电后,就去看电视,每隔一小会儿就去看水烧开没有,直到看到水冒热气,然后就在那看着水烧开,才提水离开。这个过程中,这个人就是进程或线程,在等水冒热气的过程中兼顾看电视,而在水冒热气之后就等在那儿,什么也干不了,直到水烧开。
3、I/O多路复用(I/O multiplexing)

I/O多路复用也称为event driven I/O,包括select、poll、epoll。单个进程可以同时处理多个网络连接的I/O。
原理是:用户进程阻塞在select、poll,内核会监视所有select或poll负责的socket,当任何一个socket中的数据准备好了,select/poll就会返回。这个时候再调用read,将数据从kernel拷贝到用户进程。图示如下:
I/O复用模型在这里,我们使用了select和recvfrom两个系统调用,相比较正常的阻塞I/O的一个系统调用效率更差,使用select的优势在于它可以同时处理多个连接,而不是对于单个连接处理的更快。
所以当处理的连接数不是很高的话,使用select/poll的web server不一定比使用多线程阻塞I/O的web server性能更好,可能延迟更大。
在I/O多路复用里,对于每一个socket,一般都设置成非阻塞的。整个用户的进程被select函数所阻塞。

  • 例子:一个人用很多个电热壶烧水,把所有电热壶通电后,就等在那儿,直到有一个水壶冒热气,然后就等在那个水壶前直到水烧开。这个过程中,这个人就是进程或线程,先是等在水冒气那儿,然后又等在水烧开那儿,整个过程中其他什么也干不了。
4、异步I/O(I/O multiplexing)

异步I/O的流程如下:
异步I/O异步I/O模型用户进程发起read之后立即返回,去做其他的事情。
内核收到read之后,不会对用户进程产生任何block。而是等待数据准备完成,将数据拷贝到用户内存,然后给用户发送一个signal,告诉read操作完成了。

  • 例子:一个人用一个或多个电热壶烧水(水烧开水壶会响且自动关闭),把电热壶通电后,就去看电视或干其他的,等听到水壶的响声,就去提水离开。这个过程中,这个人就是进程或线程,烧水期间想干啥就干啥,完全不用等待,只需要接听水壶的信号就行。
小结:

1. 阻塞与非阻塞的区别:
调用阻塞I/O会一直阻塞住对应的进程直到操作完成,而非阻塞I/O在内核还在准备数据的情况下立即返回。

2. 同步与异步的区别:

  • 判断同步I/O,异步I/O的关键点在于在真实的I/O操作里(比如recvfrom),进程有没有被阻塞。
  • 在非阻塞中,如果内核的数据没有准备好,这时候固然不会阻塞进程。但是当内核中数据准备好的时候,recvfrom会将数据从内核拷贝到用户内存里,这时候进程是被阻塞的,所以阻塞和非阻塞都是同步的。
  • 而异步I/O,是当进程发起I/O操作之后,立即返回,再也不理睬了,直到收到内核发送的I/O完成的信号。在这个过程中,进程完全没有阻塞。
  • 同步异步的区分点在于:
    用户进程是怎样直到数据准备好了的(自己主动查询得知,还是接受到signal得知);数据在内核中准备完成之后,是谁负责拷贝数据到用用户内存的(自己拷贝还是内核负责)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值