目录
- 阻塞与非阻塞、同步与异步
- Linux上的五种IO模型
- 阻塞blocking
- 非阻塞non-blocking
- io复用
- 信号驱动
- 异步(asynchronous)
阻塞与非阻塞、同步与异步
同步就是recv去读取数据,异步是内核把buf准备好了会发信号通知。
在处理IO的时候,阻塞与非阻塞都是同步IO,只有使用了特殊的API才是异步IO。
aio_read()、aio_write()
同步的话就是客户端主动一点去接收数据,异步的话就比较被动,等着对方通知你来接收数据。
Linux上的五种IO模型
阻塞blocking
调用某个函数,等待这个函数返回,期间什么也不做,不停地去检查这个函数有没有返回,必须等返回才能进行下一步动作。(文件描述符的属性)
比如read
非阻塞non-blocking
容易出现EAGAIN,就是时间还未发生,根据errno来决定。判断EAGAIN来反复调用read。这也是同步IO。用户自己去read。相比于阻塞,可以做一些其他的事情。
io复用
select/poll/epoll实现IO复用模型,等待文件描述符更新再去读取
信号驱动
IO事件就绪,进程收到SIGIO信号,然后处理IO事件。在通知SIGIO阶段是异步的,可以去做自己的事情。到第二个阶段,用read读数据时就是同步的。
异步(asynchronous)
就是读取都帮读取完了,不用read。直接通知客户端处理数据。
比较复杂,而且出错了难以找错误,所以项目中一般不用。复用比较多。