Linux 等待队列

本文深入探讨Linux内核中等待队列的概念及其作用,解释了如何通过设置进程状态来实现进程的可中断等待和不可中断等待,并详细说明了与等待队列相关的操作函数,帮助开发者更高效地理解和利用这一关键机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在阅读Tun驱动时看到,有一些类似 add_wait_queue 的函数,这些函数正是执行等待队列的相关操作,要说等待队列还得从内核进程调度说起,内核调度系统内进程,分配时间片,但是有些进程如从网卡中读数据,在 网卡有数据到达之前进程处于阻塞状态,如果此时给相应进程分配时间片做调度,无疑是浪费系统资源,所以系统内每个进程都有自己的状态标志 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值