一个设备驱动, 在许多情况下, 不需要它自己的工作队列. 如果你只偶尔提交任务给队列, 简单地使用内核提供的共享的, 缺省的队列可能更有效. 如果你使用这个队列, 但是, 你 必须明白你将和别的在共享它. 从另一个方面说, 这意味着你不应当长时间独占队列(无 长睡眠), 并且可能要更长时间它们轮到处理器.

jiq ("just in queue") 模块输出 2 个文件来演示共享队列的使用. 它们使用一个单个 work_struct structure, 这个结构这样建立:

static struct work_struct jiq_work;

/* this line is in jiq_init() */ INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data);

当一个进程读 /proc/jiqwq, 这个模块不带延迟地初始化一系列通过共享的工作队列的路 线.

int schedule_work(struct work_struct *work);

注意, 当使用共享队列时使用了一个不同的函数; 它只要求 work_struct 结构作为一个 参数. 在 jiq 中的实际代码看来如此:

prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE); schedule_work(&jiq_work);

schedule(); finish_wait(&jiq_wait, &wait);

这个实际的工作函数打印出一行就象 jit 模块所作的, 接着, 如果需要, 重新提交这个
work_structcture 到工作队列中. 在这是 jiq_print_wq 全部:

static void jiq_print_wq(void *ptr)

{

struct clientdata *data = (struct clientdata *) ptr;

if (! jiq_print (ptr))
return;

if (data->delay)

schedule_delayed_work(&jiq_work, data->delay);

else

}

schedule_work(&jiq_work);

如果用户在读被延后的设备 (/proc/jiqwqdelay), 这个工作函数重新提交它自己在延后 的模式,
使用 schedule_delayed_work:

int schedule_delayed_work(struct work_struct *work, unsigned long
delay); 如果你看从这 2 个设备的输出, 它看来如:

% cat /proc/jiqwq

time  delta
preempt  pid cpu command

1113043

0

0

7

1

events/1

1113043

0

0

7

1

events/1

1113043

0

0

7

1

events/1

1113043

0

0

7

1

events/1

1113043

0

0

7

1

events/1

% cat /proc/jiqwqdelay

time  delta preempt  pid cpu command 1122066 1      0  6  0 events/0

1122067  1  0  6  0
events/0

1122068

1

0

6

0

events/0

1122069

1

0

6

0

events/0

1122070

1

0

6

0

events/0

当
/proc/jiqwq 被读, 在每行的打印之间没有明显的延迟. 相反, 当 /proc/jiqwqdealy 被读时, 在每行之间有恰好一个 jiffy 的延时.
在每一种情况, 我们看到同样的进程名 子被打印; 它是实现共享队列的内核线程的名子. CPU 号被打印在斜线后面; 我们从不知 道当读 /proc 文件时哪个
CPU 会在运行, 但是这个工作函数之后将一直运行在同一个处 理器.

如果你需要取消一个已提交给工作队列的工作入口, 你可以使用 cancel_delayed_work, 如上面所述.
刷新共享队列需要一个不同的函数, 但是:

void
flush_scheduled_work(void);

因为你不知道别人谁可能使用这个队列, 你从不真正知道 flush_schduled_work 返回可 能需要多长时间.

linux 共享队列的更多相关文章

  1. 【转载】linux 工作队列上睡眠的认识--不要在默认共享队列上睡眠

    最近项目组做xen底层,我已经被完爆无数遍了,关键在于对内核.驱动这块不熟悉,导致分析xen代码非常吃力.于是准备细细的将 几本 linux 书籍慢慢啃啃. 正好看到LINUX内核设计与实现,对于内核 ...

  2. Linux 程序设计1:深入浅出 Linux 共享内存

    笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 ...

  3. Linux共享内存(二)

    Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...

  4. linux共享库

    linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...

  5. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  6. linux环境 :Linux 共享库LIBRARY_PATH, LD_LIBRARY_PATH 与ld.so.conf

    参考: 1. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径.(该路径在默 ...

  7. windows怎么与虚拟机linux共享

    虚拟机linux与widows主机的进行文件共享 使用虚拟机的共享目录功能 使用vmware(vmware workstation 5)下shared folders功能实现vmware中host与g ...

  8. linux消息队列编程实例

    转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...

  9. linux 共享内存shm_open实现进程间大数据交互

    linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...

随机推荐

  1. 【转】MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  2. 【JZOJ4788】【NOIP2016提高A组模拟9.17】序列

    题目描述 输入 输出 样例输入 1 5 2 1 3 0 3 2 2 0 1 0 样例输出 1 数据范围 解法 考虑没有模的情况,问题就仅仅只是简单的差分问题(广告铺设): 设r[i]是第i位需要加的次 ...

  3. Directx11教程(47) alpha blend(4)-雾的实现

    原文:Directx11教程(47) alpha blend(4)-雾的实现      除了用来实现透明效果之外,我们还可以用alpha blend来实现雾(fog)的效果.通过逐渐清晰的雾气效果,可 ...

  4. 总结 ESP8266 RTOS 开发环境搭建

    总结 ESP8266 RTOS 开发环境搭建 仔细看官方文档. 必须一步一步操作. 不要想当然,以为 make 就可以. 忽略编译警告,除非是错误. 工具链必须使用官方提供的. 多看看 Issues ...

  5. day39-Spring 12-Spring的JDBC模板:快速入门

    Spring AOP的关键是它的底层的原理和思想,配置和使用并不是十分困难.AOP本身就是一个思想,是面向对象的延伸,不是用来替换面向对象的,而是用来解决面向对象中的一些问题的.在最初的时候提出过一个 ...

  6. myeclipse的最有用的设置

    1 取消Myeclipse的自动文件验证(卡傻的原因)   Windows –> Perferences –>Myeclipse –> Validation,保留manual(手动) ...

  7. SQL if语句简要

    if语句 可以作为表达式用 可以在存储过程中作为流程控制语句用 表达式 IF(条件,条件true,条件false) 示例 sex字段m,f 互换 update salary set sex = if( ...

  8. 使用spring jpa 时,利用nativeQuery,获取数据,无需新建实体,按照别名返回Json数据

    刚开始是这样写的 @Query(value = "SELECT ll.user_id id ,u.catong_img catong_img,ll.locationId location_i ...

  9. MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

    MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() ...

  10. Java练习 SDUT-1580_闰年

    闰年 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 时间过得真快啊,又要过年了,同时,我们的人生也增长了一年的阅历,又 ...