一:先介绍一下四个概念:同步,异步,阻塞,非阻塞。
同步
就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。
异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
塞和同步是完全不同的概念。首先,同步是对于消息的通知机制而言,阻塞是针对等待消息通知时的状态来说的。而且对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,并设置相应的errno。
然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。
二:五种Io模型
1.阻塞式Io
<linux/wait.h> <linux/sched.h>
在对设备进行操作的时候,如果条件不满足,阻塞 —>>> 应用层进程处于休眠状态
1.初始化等待队列头
数据类型:wait_queue_head_t /定义并初始化等待队列头/
#define DECLARE_WAIT_QUEUE_HEAD(name) \
wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
init_waitqueue_head(wait_queue_hea