Linux中的工作队列

  • 时间:
  • 浏览:1
  • 来源:大发5分快3_大发5分快3官网

struct work_struct {

4

work_struct的哪几种变量里,func和data是用户使用的,或多或少是内控 变量,大伙能还可不还可不能不能不想太过关心。

struct work_struct my_work;

1

6

queue_work(my_wq, &(my_name.my_work));

5

10

void flush_scheduled_work(void);

    printk(KERN_INFO “Hello world, my name is %s!\n”, my_name->name);

}

    struct list_head entry;

9

19

int queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay);

工作队列是2.6内核后来刚开始 引入的机制,在2.6.20事先,工作队列的数据行态处于了或多或少变化,或多或少本文分成有一三个白 每项对2.6.20事先和事先的版本分别做介绍。

entry大伙不去过问,你你这个和事先的版本全部相同。data的类型是atomic_long_t,你你这个类型从字面上看能还可不还可不能不能知道是一有一三个白 原子类型。第一次看得人你你这个变量时,很容易误认为和事先的data是同样的用法,只不过类型变了而已,其实不然,这里的data是事先版本的pending和wq_data的复合体,起到了事先的pending和wq_data的作用。

    char *name;

2

自2.6.20起,工作队列的数据行态处于了或多或少变化,使用时能还可不还可不能不能了沿用旧的方法。

数据行态:

以上均是采用缺省工作者守护进程来实现工作队列,其优点是简单易用,缺点是或多或少缺省工作队列负载太重,执行强度会很低,这就能还可不还可不能不能了大伙创建此人 的工作者守护进程和工作队列。

7

下面一段代码能还可不还可不能不能看作一有一三个白 简单的实作:

8

2

    struct work_struct my_work;

struct delayed_work {

    work_func_t func;

16

2

void my_func(void *data)

正确处理第一有一三个白 哪几种的什么的问题,能还可不还可不能不能了换有一种思路。2.6.20版本事先使用工作队列能还可不还可不能不能了把work_struct定义在用户的数据行态中,或多或少通过container_of来得到用户数据。具体用法能还可不还可不能不能参考稍后的实作。

int schedule_delayed_work(struct delayed_work *work, unsigned long delay);

6

4

与2.6.19事先的版本相比,work_struct瘦身不少。粗粗一看,entry和事先的版本相同,func和data处于了变化,另外并无或多或少的变量。

{

9

4

4、刷新指定工作队列。

7

int cancel_delayed_work(struct work_struct *work);

}

3

13

6

API:

void destroy_workqueue(struct workqueue_struct *wq);

数据行态:

1

5、释放创建的工作队列。

INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func);

1

3

1

4

5

8

void flush_workqueue(struct workqueue_struct *wq);

    struct timer_list timer;

    atomic_long_t data;

2

    struct list_head entry;

1

4

int queue_work(struct workqueue_struct *wq, struct work_struct *work);

3

int schedule_work(struct work_struct *work);

    printk(KERN_INFO “Hello world, my name is %s!\n”, name);

看得人这里,会有有一三个白 哪几种的什么的问题,第一,怎么可不能不能把用户的数据作为参数传递给func呢?事先有void *data来作为参数,现在好像全部越来越方法做到;第二,怎么可不能不能实现延迟工作?目前版本的work_struct并越来越定义timer。

    unsigned long pending;

1

5

工作队列(work queue)是Linux kernel中将工作推后执行的有一种机制。你你这个机制和BH或Tasklets不同之处于于工作队列是把推后的工作交由一有一三个白 内核守护进程去执行,或多或少工作队列的优势就在于它允许重新调度甚至睡眠。

    struct work_struct work;

3

};

4

};

void flush_scheduled_work(void);

func作为函数指针,由用户实现;

wq_data一般用来指向工作者守护进程(工作者守护进程参考下文);

5

5、flush_scheduled_work并不归还任何延迟执行的工作,或多或少,或多或少要归还延迟工作,应该调用cancel_delayed_work。

INIT_WORK(struct work_struct *work, work_func_t func);

3

    void *data;

3、延迟执行工作,与schedule_work之类。

    char *name = (char *)data;

typedef void (*work_func_t)(struct work_struct *work);

    struct timer_list timer;

1

destroy_workqueue(my_wq);

2

};

int schedule_work(struct work_struct *work);

};

其中,1、2、4、7和事先略有区别,或多或少用法全部一样。

5

2、之类于schedule_work,区别在于queue_work把给定工作提交给创建的工作队列wq而都在缺省队列。

pending是用来记录工作与非 或多或少挂在队列上;

int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay);

11

对于第一个哪几种的什么的问题,新的工作队列把timer拿掉的用意是使得work_struct更加单纯。首先回忆一下事先版本,能还可不还可不能不能了在能还可不还可不能不能了延迟执行工作时才会用到timer,普通情况报告下timer是越来越意义的,全都事先的做法在一定程度上或多或少浪费资源。全都新版本中,将timer从work_struct中拿掉,或多或少又定义了一有一三个白 新的行态delayed_work用于正确处理延迟执行:

struct my_struct_t {

struct workqueue_struct *my_wq = create_workqueue(“my wq”);

struct work_struct {

{

timer是推后执行的定时器。

void flush_workqueue(struct workqueue_struct *wq);

4、刷新缺省工作队列。此函数会突然 等待的图片 ,直到队列中的所有工作都被执行。

13

    struct my_struct_t *my_name = container_of(work, struct my_struct_t, my_work);

2

1、初始化指定工作,目的是把用户指定的函数_func及_func能还可不还可不能不能了的参数_data赋给work_struct的func及data变量。

API:

1

6

4

下面把API罗列一下,每个函数的解释可参考事先版本的介绍或多或少事先的实作:

int queue_work(struct workqueue_struct *wq, struct work_struct *work);

destroy_workqueue(my_wq);

10

INIT_WORK(_work, _func, _data);

18

2

struct workqueue_struct *my_wq = create_workqueue(“my wq”);

struct workqueue_struct *create_workqueue(const char *name);

实作:

entry是循环链表行态;

17

2

3

20

9

int cancel_delayed_work(struct delayed_work *work);

11

void destroy_workqueue(struct workqueue_struct *wq);

3

5

5

4

6

void my_func(struct work_struct *work)

int schedule_delayed_work(struct work_struct *work, unsigned long delay);

struct workqueue_struct *create_workqueue(const char *name);

    void *wq_data;

my_name.name = “Jack”;

func的参数是一有一三个白 work_struct指针,指向的数据全都我定义func的work_struct。

queue_work(my_wq, &my_work);

3、延迟执行工作。

INIT_WORK(&(my_name.my_work), my_func);

7

INIT_WORK(&my_work, my_func, “Jack”);

14

15

8

data用来存储用户的私人数据,此数据即是func的参数;

10

12

struct my_struct_t my_name;

1、创建新的工作队列和相应的工作者守护进程,name用于该内核守护进程的命名。

    void (*func)(void *);

12

2、对工作进行调度,即把给定工作的正确处理函数提交给缺省的工作队列和工作者守护进程。工作者守护进程本质上是一有一三个白 普通的内核守护进程,在默认情况报告下,每个CPU均有一有一三个白 类型为“events”的工作者守护进程,当调用schedule_work时,你你这个工作者守护进程会被唤醒去执行工作链表上的所有工作。

11

3

7

8

7