Linux 等待队列
2013-12-19 20:51
253 查看
在阅读Tun驱动时看到,有一些类似 add_wait_queue
的函数,这些函数正是执行等待队列的相关操作,要说等待队列还得从内核进程调度说起,内核调度系统内进程,分配时间片,但是有些进程如从网卡中读数据,在
网卡有数据到达之前进程处于阻塞状态,如果此时给相应进程分配时间片做调度,无疑是浪费系统资源,所以系统内每个进程都有自己的状态标志
task->state,这些状态定义于文件 include/linux/sched.h
内核只会调用标志是 TASK_RUNNING
的进程,如果需要等待资源,可以设置自己的进程标志为 TASK_INTERRUPTIBLE (可中断)或者
TASK_UNINTERRUPTIBLE (不可中断),然后调用
schedule();放弃CPU,此进程就不会被内核调度了,但随之而来的问题是,如果进程所需资源可以使用,如何唤醒进程呢,这就要依赖于等待队列
了,进程在放弃控制权之前,把自己加入一个队列中,当所需条件满足,其他进程便可wakeup该队列,修改进程状态为
TASK_RUNNING,等待进程便可顺利往下执行了。
与等待队列相关的操作有如下几种:
的函数,这些函数正是执行等待队列的相关操作,要说等待队列还得从内核进程调度说起,内核调度系统内进程,分配时间片,但是有些进程如从网卡中读数据,在
网卡有数据到达之前进程处于阻塞状态,如果此时给相应进程分配时间片做调度,无疑是浪费系统资源,所以系统内每个进程都有自己的状态标志
task->state,这些状态定义于文件 include/linux/sched.h
#define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 ...
内核只会调用标志是 TASK_RUNNING
的进程,如果需要等待资源,可以设置自己的进程标志为 TASK_INTERRUPTIBLE (可中断)或者
TASK_UNINTERRUPTIBLE (不可中断),然后调用
schedule();放弃CPU,此进程就不会被内核调度了,但随之而来的问题是,如果进程所需资源可以使用,如何唤醒进程呢,这就要依赖于等待队列
了,进程在放弃控制权之前,把自己加入一个队列中,当所需条件满足,其他进程便可wakeup该队列,修改进程状态为
TASK_RUNNING,等待进程便可顺利往下执行了。
与等待队列相关的操作有如下几种:
wait_queue_head_t simple_queue; init_waitqueue_head(&simple_queue); DECLARE_WAITQUEUE (name, tsk); void fastcall add_wait_queue(wait_queue_head_t * q, wait_queue_t * wait); void fastcall remove_wait_queue(wait_queue_head_t * q, wait_queue_t * wait); void wake_up(wait_queue_head_t * queue); void wake_up_interruptible(wait_queue_head_t * queue);
相关文章推荐
- Linux 等待队列
- linux kernel poll & 等待队列
- 内核的等待队列 (转)
- linux 工作队列(转载)
- Linux使用wake_up_interruptible()唤醒注册到等待队列上的进程
- Linux等待队列wait_queue_head_t和wait_queue_t
- Linux中等待队列机制分析
- Linux输入子系统 input_dev 概述
- linux进程的休眠(等待队列)
- linux启动优化:mdev -s自从…
- Linux 下Android 开发环境搭建
- LINUX AS4 系统下安装oracle 10g终…
- Linux中gcc g++常用编译选项以及ma…
- arm-linux-gcc 4.3.3 Illegal inst…
- 【原创】Linux-Ubuntu 12.04&…
- linux profile of env
- 【原创】linux ubuntu12.04&n…
- 【原创】 linux vi-删除空行
- Linux Platform Device and Driver
- 【原创】linux zip 只压…