queue_delayed_work
时间: 2023-09-06 19:13:41 浏览: 134
queue_delayed_work() 是一个 Linux 内核中的函数,用于将一个工作(work)延迟到指定的时间(jiffies)执行。它的函数原型如下:
```
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work,
unsigned long delay);
```
其中,wq 是要将 work 排入的工作队列(workqueue),work 是要排入的工作,delay 是工作要延迟的 jiffies 数量。当 delay 大于 0 时,工作将被安排在当前 jiffies + delay 时刻执行。
延迟工作队列是 Linux 内核提供的一种机制,可以在内核中异步执行一些比较耗时的操作,以避免阻塞进程或耗费过多的 CPU 时间。它通常用于一些需要周期性执行的操作,比如网络数据包的处理、定时器的触发等等。
相关问题
schedule_delayed_work和queue_delayed_work
`schedule_delayed_work`和`queue_delayed_work`都是Linux内核中的函数,用于安排延迟执行的工作。
`schedule_delayed_work`是将一个已经初始化的工作放入工作队列中,并指定一个延迟时间,到达延迟时间时工作将被执行。这个函数的原型为:
```c
int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
```
其中,`work`是一个指向已经初始化的`delayed_work`结构体的指针,`delay`是延迟时间,单位为Jiffies。Jiffies是内核中的一个时间单位,通常是1毫秒。
`queue_delayed_work`也是将一个已经初始化的工作放入工作队列中,但是不指定延迟时间,而是指定一个时间戳,工作将在到达这个时间戳时被执行。这个函数的原型为:
```c
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay);
```
其中,`wq`是一个指向工作队列的指针,`work`是一个指向已经初始化的`delayed_work`结构体的指针,`delay`是时间戳,指定工作执行的时间,单位为Jiffies。
需要注意的是,这两个函数都是将工作放入工作队列中,而不是立即执行工作。因此,它们并不保证工作一定会在指定的时间执行,而是在到达指定时间后,当内核空闲时才会执行。
queue_delayed_work源码
`queue_delayed_work()` 是 Linux 内核中的一个函数,它的作用是将一个 `work_struct` 结构体中表示的工作延迟一段时间后放入工作队列中,以便稍后执行。
以下是 `queue_delayed_work()` 函数的源码:
```c
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work,
unsigned long delay)
{
unsigned long flags;
int ret = 0;
spin_lock_irqsave(&wq->lock, flags);
if (work_pending(&work->work)) {
/*
* We always return 0 if the work item was already on a
* queue. The idea is that the caller can still rely on
* the work_struct being on a workqueue queue if they
* use flush_workqueue().
*/
ret = 0;
goto out_unlock;
}
/* initialize the delay */
work->timer.expires = jiffies + delay;
/* initialize the function to be called when the timer expires */
work->timer.function = delayed_work_timer_fn;
/* initialize the private data of the timer */
work->timer.data = work;
/* add the timer to the timer list */
add_timer_on(&work->timer, wq->rt);
__queue_work(wq, &work->work, &work->entry);
out_unlock:
spin_unlock_irqrestore(&wq->lock, flags);
return ret;
}
```
该函数的参数包括:
- `wq`:指向工作队列对象的指针;
- `work`:指向 `delayed_work` 结构体的指针;
- `delay`:表示要延迟的时间。
该函数的主要步骤包括:
1. 锁定工作队列的自旋锁;
2. 检查工作是否已经在队列中,如果是则返回 0;
3. 初始化 `delay` 并将工作添加到工作队列中;
4. 解锁工作队列的自旋锁并返回执行结果。
在添加工作到队列之前,`queue_delayed_work()` 函数会先初始化一个定时器,并将其添加到定时器列表中。当定时器到期时,内核会调用 `delayed_work_timer_fn()` 函数,该函数会将 `delayed_work` 结构体中的工作添加到工作队列中以便稍后执行。
阅读全文