Linux内核中的等待队列--init_waitqueue_head等
来源:互联网 发布:乳源县网络问政答复 编辑:程序博客网 时间:2024/05/22 06:51
在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。由于我们只需要对队列进行添加和删除操作,并不会修改其中的对象(等待队列项),因此,我们只需要提供一把保护整个基础设施和所有对象的锁,这把锁保存在等待队列头中,为wq_lock_t类型。在实现中,可以支持读写锁(rwlock)或自旋锁(spinlock)两种类型,通过一个宏定义来切换。如果使用读写锁,将wq_lock_t定义为rwlock_t类型;如果是自旋锁,将wq_lock_t定义为spinlock_t类型。无论哪种情况,分别相应设置wq_read_lock、wq_read_unlock、wq_read_lock_irqsave、wq_read_unlock_irqrestore、wq_write_lock_irq、wq_write_unlock、wq_write_lock_irqsave和wq_write_unlock_irqrestore等宏。
等待队列头
struct __wait_queue_head {
};
typedef struct __wait_queue_head wait_queue_head_t;
等待队列项
struct __wait_queue {
#define WQ_FLAG_EXCLUSIVE
};
typedef struct __wait_queue wait_queue_t;
#define DECLARE_WAITQUEUE(name, tsk)
#define __WAITQUEUE_INITIALIZER(name, tsk) {
#define DECLARE_WAIT_QUEUE_HEAD(name) \
#define __WAIT_QUEUE_HEAD_INITIALIZER(name) {
static inline void init_waitqueue_head(wait_queue_head_t *q)
该函数初始化一个已经存在的等待队列头,它将整个队列设置为"未上锁"状态,并将链表指针prev和next指向它自身。
{
}
static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p)
{
}
static inline int waitqueue_active(wait_queue_head_t *q)
{
}
static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
{
}
static inline void __add_wait_queue_tail(wait_queue_head_t *head, wait_queue_t *new)
{
}
static inline void __remove_wait_queue(wait_queue_head_t *head, wait_queue_t *old)
{
}
睡眠和唤醒操作
对等待队列的操作包括睡眠和唤醒(相关函数保存在源代码树的/kernel/sched.c和include/linux/sched.h中)。思想是更改当前进程(CURRENT)的任务状态,并要求重新调度,因为这时这个进程的状态已经改变,不再在调度表的就绪队列中,因此无法再获得执行机会,进入"睡眠"状态,直至被"唤醒",即其任务状态重新被修改回就绪态。
常用的睡眠操作有interruptible_sleep_on和sleep_on。两个函数类似,只不过前者将进程的状态从就绪态(TASK_RUNNING)设置为TASK_INTERRUPTIBLE,允许通过发送signal唤醒它(即可中断的睡眠状态);而后者将进程的状态设置为TASK_UNINTERRUPTIBLE,在这种状态下,不接收任何singal。
对应的唤醒操作包括wake_up_interruptible和wake_up。wake_up函数不仅可以唤醒状态为TASK_UNINTERRUPTIBLE的进程,而且可以唤醒状态为TASK_INTERRUPTIBLE的进程。wake_up_interruptible只负责唤醒状态为TASK_INTERRUPTIBLE的进程。这两个宏的定义如下:
#define wake_up(x)
#define wake_up_interruptible(x)
__wake_up
- Linux内核中的等待队列--init_waitqueue_head等
- Linux内核中的等待队列--init_waitqueue_head等
- Linux内核中的等待队列--init_waitqueue_head等
- Linux内核中的等待队列--init_waitqueue_head等
- Linux内核中的等待队列--init_waitqueue_head
- 等待队列头init_waitqueue_head
- Linux内核中的等待队列
- Linux内核中的等待队列
- Linux内核中的等待队列详细讲解
- 内核中的等待队列
- 内核中的等待队列
- LINUX内核-等待队列
- linux 内核等待队列
- Linux内核等待队列
- Linux内核等待队列
- Linux 内核等待队列
- Linux内核的等待队列
- Linux内核的等待队列
- 如何将多个excel中的数据导入一个excel中?多个EXCEL中格式一致
- WEB项目中使用Log4net ABC
- 拨号上网遇到“错误789”提示
- WPF多表关联数据绑定
- 摩托MB525+ MB525信号门问题-充电问题已解决
- Linux内核中的等待队列--init_waitqueue_head等
- 从无法访问google code所联想到的
- 有些人很多机会相见的,却总找借口推脱,想见的时候已经没机会了。
- XmlAttribute
- 实习笔记 -- JAVA 中 implements 与 extends 的区别
- 两台win 7系统电脑 一台双网卡 共享上网
- 关注电子工程师的身体健康与职业规划
- CSS 基础
- Cocos2d 中 Box2D 使用笔记