对于Linux,当前主流的网络I/O还是同步I/O,对于处理高并发,采用的方案就是I/O复用,多线程,多进程。具体选择要根据业务场景的特点来选择。
同步、异步和阻塞、非阻塞针对的是两个不同的维度:
- 同步的关键是有序,强调的有序的任务序列,下一步操作依赖这一步。
- 异步的关键是处理调用的对象在处理完成后主动通知,可通过回调,通知,状态变更等,依赖具体的实现机制。这里的机制很关键,CPU调度的最小单位是线程,有栈和寄存器才能完成调用。回调函数的执行线程,采用通知的话,原来调用者也需要有专门的消息处理线程,内核实现还是库实现,都是不同的机制。
- 阻塞的关键是线程挂起,线程调用的函数不返回被操作系统挂起,常阻塞到等数据。
- 非阻塞的关键是调用立刻返回,有数据就返回ok,没数据就不ok;非阻塞要么伴随着调用者轮询,要么有被调者的异步通知,才可能完成功能。
推荐两本经典书籍:
Linux下的五种I/O模型
- 阻塞I/O (blocking I/O)
- 非阻塞I/O (nonblocking I/O)
- I/O多路复用(epoll) (I/O multiplexing)
- 信号驱动I/O (signal driven I/O (SIGIO))
- 异步I/O (asynchronous I/O (the POSIX aio_functions))
前四种都是同步,只有最后一种才是异步IO。
参考:
怎样理解阻塞非阻塞与同步异步的区别?
IO 多路复用是什么意思?
Linux 开发,使用多线程还是用 IO 复用 select/epoll?
linux AIO (异步IO) 那点事儿
浅析Linux Native AIO的实现
Linux kernel AIO这个奇葩
linux下epoll如何实现高效处理百万句柄的
epoll详解
epoll 或者 kqueue 的原理是什么?
socket阻塞与非阻塞,同步与异步、I/O模型