目录
1. IO 模型
2. 阻塞式 IO
3. 非阻塞式 IO
1. IO 模型
Linux 下可用的 IO 模型有 5 种, 分别是:
阻塞式 IO
非阻塞式 IO
IO 复用
信号驱动式 IO(SIGIO)
异步 IO(Posix 的 aio_系列函数)
其中, 除了异步 IO, 其余都属于同步 IO 模型.
在这 5 种模型中, 我们目前只关注前 3 种, 并且把 IO 复用放在网络编程专题中讲, 本文只简单介绍阻塞式 IO 和非阻塞式 IO 的概念与区别.
2. 阻塞式 IO
阻塞式 IO 是 Linux 中最基本, 最常用的 IO 模型, 指的是可能会使进程永远阻塞的函数, 一般表现为:
进程或线程调用某个函数, 该函数需要满足特定条件才能向下执行
如果条件不满足, 则会使调用进程或线程阻塞, 让出 CPU 控制权, 并一直持续到条件满足为止
在 Linux 中, 阻塞式 IO 一般作为默认属性出现, 如 mq_receive,sem_wait,sem_post 等
在默认情况下, 所有的套接字都是阻塞的, 我们以 UDP 套接字为例来展示阻塞式 IO 模型, 如下图所示.
进程调用 recvfrom 接收数据, 但由于内核还未准备好, 进程就会阻塞; 直到内核准备好数据, recvfrom 完成数据复制工作, 进程才能解除阻塞状态.
3. 非阻塞式 IO
顾名思义, 非阻塞式 IO 不会使调用进程或线程永远阻塞, 具体表现为: 如果 IO 操作不能完成, 则立即出错返回, 调用进程或线程继续向下执行.
对于一个给定的描述符, 有两种将其指定为非阻塞式 IO 的方法:
调用 open 创建或打开文件时指定 O_NONBLOCK 标志
对于一个已经打开的描述符, 调用 fcntl 改变其属性, 为其设置 O_NONBLOCK 标志
- #include <fcntl.h>
- int fcntl(int fd, int cmd, ... /* int arg */);
将 cmd 设为 F_SETFL,arg 设为 O_NONBLOCK, 就可以为 fd 设置非阻塞标志.
来源: http://www.bubuko.com/infodetail-3203958.html