五种I/O模型: 

1)阻塞I/O 
2)非阻塞I/O 
3)I/O复用(select和poll) 
4)信号驱动I/O(SIGIO) 
5)异步I/O 
前四中是同步,最后一种是异步。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

阻塞I/O模型: 
简介:进程会一直阻塞,直到数据拷贝完成 
应用程序调用一个I/O函数,导致应用程序阻塞,等待数据准备好,如果数据没有准备好,一直等待。。数据准备好,从内核拷贝到用户空间,I/O函数返回成功

 

非阻塞I/O模型: 
简介:我们把一个套接口设置为非阻塞就是告诉内存,当所请求的I/O操作无法完成时,不要惊进程睡眠,而是返回一个错误,I/O函数会不断的测试数据是否准备好,没有准备好,继续测试,直到数据准备好为止。在测试的过程中会占用大量的CPU时间。 

 

I/O复用模型:
简介:主要是select和epoll;对于一个I/O端口,两次调用,两次返回,比阻塞I/O并没有什么优势,只是能实现同时对多个I/O端口进行监听。

I/O复用模型会调用select,poll函数,这几个函数也会使进程阻塞,但是和阻塞I/O不同的,这个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
附:

select:不是线程安全的;select 只能监视1024个链接

 poll :去掉了1024个链接的限制;poll仍然不是线程安全的

  • epoll :现在是线程安全的; 

  • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据

 

信号驱动I/O 
简介:两次调用,两次返回 
首先允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。等数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

 

异步I/O模型: 
简介:数据拷贝的时候进程无需阻塞 
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态,通知和回调通知调用者输入输出操作。 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄