socket有几个队列_带您进入内核开发的大门 | 内核中的等待队列

本文详细介绍了内核等待队列的概念,包括其作为线程管理机制的作用,以及wait_queue_head_t结构体、wait_event函数和wake_up函数的基本用法。通过示例程序展示了等待队列的工作原理,强调了等待队列在资源状态管理和线程同步中的重要性。

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

7529bc97ba6b0e14f8ec276aeab1355e.png
配套的代码可以从本号的github下载: https:// github.com/shuningzhang /linux_kernel 内核相关电子书可以在这里下载: https:// u19702000.ctfile.com/di r/19702000-33344559-0b7371/

等待队列是一种基于资源状态的线程管理的机制,它可以使线程在资源不满足的情况下处于休眠状态,让出CPU资源,而资源状态满足时唤醒线程,使其继续进行业务的处理。 等待队列(wait queue)用于使线程等待某一特定的事件发生而无需频繁的轮询,进程在等待期间睡眠,在某件事发生时由内核自动唤醒。它是以双循环链表为基础数据结构,与进程的休眠唤醒机制紧密相联,是实现异步事件通知、跨进程通信、同步资源访问等技术的底层技术支撑。

a9b733d9e3a9e9ab7c10702796f1cd74.png

基本接口

wait_queue_head_t 使用等待队列时,最基本的数据结构是struct wait_queue_head_t,也就是等待队列头,这个可以理解为等待队列的实体。队列头中包含一个双向链表,用于记录在该等待队列中处于等待状态的线程等信息。该结构体的定义如下:

struct __wait_queue_head {
    
    spinlock_t        lock;  //用于互斥访问的自旋锁
    struct list_head    task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;

可以通过宏定义 DECLARE_WAIT_QUEUE_HEAD直接定义一个队列头变量,并完成初始化,该宏定义如下:

#define DECLARE_WAIT_QUEUE_HEAD(name) 
    struct wait_queue_head name = __WAIT_QUEUE_HEAD_INITIALIZER(name)

#define __WAIT_QUEUE_HEAD_INITIALIZER(name) {                    
    .lock        = __SPIN_LOCK_UNLOCKED(name.lock),            
    .head        = { &(name).head, &(name).head } }

或者是通过结构体wait_queue_head_t定义后,调用函数init_waitqueue_head进行初始化。虽然方式不同,但基本原理是一样的,主要是对结构体内自旋锁和链表的初始化。

wait_event 函数wait_event用于在某个线程中调用,当调用该函数时,如果参数中的条件不满足,则该线程会进入休眠状态。下面代码是该函数的定义:

#define wait_event(wq, condition)                    
do {                                    
    if (condition)                            
        break;                            
    __wait_event(wq, condition);                    
} while (0)

#define __wait_event(wq, condition)                    
    (void)___wait_event(wq, condition, TASK_UNI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值