LDD3之并发和竞态-completion(完毕量)的学习和验证

首先说下測试环境:

Linux2.6.32.2

Mini2440开发板

一開始难以理解书上的书面语言,这里《linux中同步样例(完毕量completion)》举了一个公交车上司机和乘客的样例还不错,转过来:

这是一个公交司机和售票员之间的线程调度,用于理解完毕量,完毕量是对信号量的一种补充。主要用于多处理器系统上发生的一种微妙竞争。

在这里两个线程间同步。仅仅有当售票员把门关了后。司机才干开动车,仅仅有当司机停车后,售票员才干开门。

假设还是不可以理解就仅仅能重复的调试程序了,如今就把书上的样例使用起来,编译出来completion.ko后进行例如以下步骤验证

# 1.插入内核模块

insmod completion.ko

# 2.查看申请的次设备号${MINOR}

cat /proc/devices | grep complete

# 3.创建设备节点

mknod /dev/complete c ${MINOR} 0

# 4.首先开启一个终端查看内核信息输出

cat /proc/kmsg

# 5.一个终端读,会睡眠

cat /dev/complete

# 6,还有一个终端写

echo /dev/complete

# 7.查看输出

<7>[22050.937732] process 28852 (cat) going to sleep

<7>[22093.994805] process 28866 (bash) awakening the readers...

<7>[22093.994817] awoken 28852 (cat)

以下来验证LDD3上所说的:

1.wait_for_completion

注意wait_for_completion运行会一个非中断的等待。假设没有人来完毕该任务,则会产生一个不可杀的进程。

验证:

在执行了cat /dev/complete的时候就已经执行了wait_for_completion。并不执行敲代码,看不杀的进程是会不会存在。

通过尝试确实是终止不了。

结论:wait_for_completion等待后假设没人处理任务,那么真的会产生一个不可杀的用户进程,所以这个要小心使用

2.complete和complete_all

1)complete

在运行第3步(最下)后。仅仅有第2步的cat被唤醒,第1个还在睡眠。

结论:和书的一样。

2)complete_all

分了两种情况来測试:

a.init_completion + complete_all

測试失败!和书上的不照!

b.DECLARE_COMPLETION + complete_all

測试成功。

结论:complete仅仅会唤醒一个等待线程,complete_all会唤醒全部等待线程,前提是静态创建

3.INIT_COMPLETION

依据书上描写叙述这个是和complet_all配合使用的。那么就測试一下驱动。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

结论:使用INIT_COMPLETION进行又一次初始化后,完毕量能够多次使用

4.complete_and_exit

1).当内核准备清除该模块时,exit函数会告诉该线程退出并等待completion

这段描写叙述不理解,实验证明一下:

只是看了原型。有点眉目了,这个函数是要加入到exit_xxx函数中的。也就是当没有完毕时。是卸载不了的。可是为了卸载能够调用这个函数进行强制完毕并卸载。

检验一下,直接卸载:

会像图中所看到的,提示“资源不可用!

”。

但如果在complete_cleanup中加入complete_and_exit后,相同是“资源不可用!”说明如果失败。

2).决定应用程序的退出码?

相同如果失败。这里填写的是-1,可是应用程序退出码仍然是0.只是有一点是确实能够取代使用!

3).内核多进程中子进程的退出码

驱动群中群主是这样说的。

结论:因为多进程还没有掌握,这个先遗留下来。以后再来补充

5.wait_for_completion_timeout

结论:不能够被中断,到定时时间无人处理则自行结束

6.wait_for_completion_interruptible

这个并没有在LDD3中出现。可是非常能够就是LDD3中注2中提到的可中断版本号.

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

结论:证实能够被ctrl+c中断,即用户空间的进程能够被杀死

7.wait_for_completion_interruptible_timeout

结论:10s后假设没有completion则自行中断。

8.wait_for_completion_killable

从源代码和实验结果上看不出和wait_for_completion_interruptible有不论什么差别。代码是前者使用的是TASK_INTERRUPTIBLE后者使用的是 TASK_KILLABLE。

理论上:TASK_NTERRUPTIBLE 睡眠,能够被信号唤醒;TASK_KILLABLE睡眠 仅仅能被致命信号唤醒

只是如今没有办法差别哪些是致命信号,哪些不是!

9.wait_for_completion_killable_timeout

相同,从源代码和实验结果上看不出和wait_for_completion_interruptible_timeout有不论什么差别,代码是前者使用的是TASK_INTERRUPTIBLE后者使用的是 TASK_KILLABLE。

10.try_wait_for_completion

其返回值始终为0。不知道怎样操作才用使其返回值为1.

结论:全然不明确它存在的意义

11. completion_done

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

结论:不管有无等待者,推断出来的都是有!

进程或者代码中都有把等待信息去掉都无济于事

LDD3之并发和竞态-completion(完毕量)的学习和验证的更多相关文章

  1. 《Linux 设备驱动程序》读后感。 并发,竞态,死锁。

    1. 概念 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. 来源: 1. Linux ...

  2. Linux内核分析(七)----并发与竞态

    原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主 ...

  3. 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)

    知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...

  4. Linux内核中的并发与竞态概述

    1.前言 众所周知,Linux系统是一个多任务的操作系统,当多个任务同时访问同一片内存区域的时候,这些任务可能会相互覆盖内存中数据,从而造成内存中的数据混乱,问题严重的话,还可能会导致系统崩溃. 2. ...

  5. Linux驱动设计——并发与竞态控制

    并发的概念:多个执行单元同时.并行被执行. 共享资源:硬件资源(IO/外设等),软件上的全局变量.静态变量等. 四种并发控制机制(对共享资源互斥的访问):原子操作.自旋锁(spinlock).信号量( ...

  6. Linux 设备驱动--- 并发 与 竞态 --- atomic_t --- atomic_dec_and_test --- 原子操作

    并发: 多个执行单元同时被执行. 竞态: 并发的执行单元对资源 ( 硬件资源和软件上的全局变量等 ) 的访问导致的竞争状态. 并发的处理: 处理并发的常用技术是加锁或者互斥,即保证在任何时间只有一个执 ...

  7. linux设备驱动程序之并发和竞态(二)

    事实上这blog都是阅读ldd3时的一些总结,巩固自己的学习.也方便后期的使用.大家也能够直接阅读ldd3原文. 锁陷阱         所谓的锁陷阱就是防止死锁.         不明白的规则:   ...

  8. Linux驱动开发4——并发和竞态

    Linux系统处于一个高并发的运行环境,不管是系统调用还是中断都要求可重入,但是有一些系统资源处于临界区,因此,必须保证临界区资源访问的原子性. 对于临界区资源被占用时,发起访问的进程,有三种处理方法 ...

  9. Smart210---学习记录 竞态与并发

    竞态与并发 自旋锁 若一个进程要访问临界资源,测试锁空闲,则进程获得这个锁并继续执行:若测试结果表明锁扔被 占用,进程将在一个小的循环内重复“测试并设置”操作,进行所谓的“自旋”,等待自旋锁持有者释 ...

随机推荐

  1. let---bash中用于计算的工具

  2. 【剑指Offer面试题】九度OJ1384:二维数组中的查找

    下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...

  3. MD5和sha1加密算法--散列加密技术 MD5:128bit的大整数

    在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加 ...

  4. BZOJ3697: 采药人的路径(点分治)

    Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动 ...

  5. 配置mysql的ODBC数据源

    如果你已经安装好了mysql和mysql连接驱动,则可以向下进行了 打开控制面板,以小图标的形式查看,找到管理工具 打开管理工具,找到数据源(odbc),打开 在图片中所圈出的三个标签中随便选一个,点 ...

  6. CODEVS——T1519 过路费

    http://codevs.cn/problem/1519/ 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Desc ...

  7. VPS 的 CentOS6 升级 Python 的方法

    VPS 的 CentOS6 升级 Python 的方法 centos默认安装python2.6.由于python和centos关联紧密,所以不建议卸载,进行编译升级 1.新开的VPS务必系统更新 yu ...

  8. 28. Spring Boot配置方式

    转自:https://blog.csdn.net/webzhuce/article/details/54564019

  9. js无缝滚动原理及详解[转自刹那芳华]

    刚刚接触JS,网上找了一些关于无缝滚动的教程,但都大同小异,对我这种新手来说也只是会用,不知道什么意思,想要自己写个更是一头雾水.于是找了一些资料,详细说明一下JS无缝滚动的原理,相信看过这篇文章之后 ...

  10. 5. Node基础编程

      基于Chrome V8引擎 单线程 使用JavaScript开发后端代码 非阻塞的IO common规范 common一定是通过module.exports={}输出 创建Http Server ...