linux内核中等待队列和poll轮训
提前知识
等待队列
阻塞与非阻塞的概念与区别
阻塞与非阻塞:
所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。
所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。可是使用Select就可以完成非阻塞方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。
linux中阻塞和非阻塞的区别
总结异步和同步概念与区别 (五大io模型)
在通讯中,
同步是指发送端和接收端一直在等待相互的信号,如果没有连接成功就一直发送,造成阻塞状态
异步是指发送端和接受端即使没有接收到相互的信号,也可以先挂起线程资源,做其他的事情,等到调用的时候再激活线程资源,这是非阻塞状态
五大io模型
阻塞IO(BIO)
非阻塞IO
IO多路复用
信号驱动IO
异步IO
休眠机制:
使用过程
1.创建等待队列头
#define DECLARE_WAIT_QUEUE_HEAD(name) \
wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
动态定以并初始化:
wait_queue_head_t name;
init_waitqueue_head(q)
默认情况下会把当前进程作为等待任务放到等待队列中
2.在需要休眠的地方调用休眠操作
wait_event 、 wait_event_timeout wait_event_interruptible(首选)
3.在满足条件的地方唤醒等待队列
wake_up 、wake_up_interruptible