我们致力研究的IO模型都是网络IO
五种IO模型
blocking IO 阻塞IO
nonblocking 非阻塞IO
IO multiplexing IO多路复用
signal driven IO 信号驱动IO(不常用)
asynchronous IO 异步IO
常见的网络阻塞状态
accept recv recvfrom
阻塞IO
非阻塞IO
阻塞 I/O 与非阻塞 I/O 的区别
-
阻塞 I/O:当应用程序调用一个 I/O 操作(如读取或写入)时,如果数据还没有准备好,应用程序会被阻塞(即挂起),直到数据准备好或操作完成。
-
非阻塞 I/O:当应用程序调用一个 I/O 操作时,如果数据还没有准备好,系统会立即返回一个错误或特殊值(如
EAGAIN
或EWOULDBLOCK
),而不是阻塞应用程序。应用程序可以继续执行其他任务,稍后再尝试进行 I/O 操作
非阻塞 I/O 的工作原理
-
系统调用:应用程序通过系统调用(如
read
、write
、recv
、send
等)发起 I/O 操作。 -
立即返回:如果数据还没有准备好,系统调用会立即返回一个错误码(如
EAGAIN
或EWOULDBLOCK
),表示当前不可进行 I/O 操作。 -
轮询:应用程序可以通过轮询(polling)机制不断检查 I/O 操作的状态,直到数据准备好。
-
事件驱动:更高效的方式是使用事件驱动模型(如
select
、poll
、epoll
或kqueue
),应用程序可以注册感兴趣的 I/O 事件,当事件发生时,系统会通知应用程序。