我们已经见到当一个进程调用 wake_up 在等待队列上, 所有的在这个队列上等待的进程 被置为可运行的. 在许多情况下, 这是正确的做法. 但是, 在别的情况下, 可能提前知道 只有一个被唤醒的进程将成功获得需要的资源, 并且其余的将简单地再次睡眠. 每个这样 的进程, 但是, 必须获得处理器, 竞争资源(和任何的管理用的锁), 并且明确地回到睡眠. 如果在等待队列中的进程数目大, 这个"惊群"行为可能严重降低系统的性能.

为应对实际世界中的惊群问题, 内核开发者增加了一个"互斥等待"选项到内核中. 一个互 斥等待的行为非常象一个正常的睡眠, 有 2 个重要的不同:

  • 当一个等待队列入口有 WQ_FLAG_EXCLUSEVE 标志置位, 它被添加到等待队列的尾 部. 没有这个标志的入口项, 相反, 添加到开始.
  • 当 wake_up 被在一个等待队列上调用, 它在唤醒第一个有 WQ_FLAG_EXCLUSIVE 标 志的进程后停止.

最后的结果是进行互斥等待的进程被一次唤醒一个, 以顺序的方式, 并且没有引起惊群问 题. 但内核仍然每次唤醒所有的非互斥等待者.

在驱动中采用互斥等待是要考虑的, 如果满足 2 个条件: 你希望对资源的有效竞争, 并 且唤醒一个进程就足够来完全消耗资源当资源可用时. 互斥等待对 Apacheweb 服务器工 作地很好, 例如; 当一个新连接进入, 确实地系统中的一个 Apache 进程应当被唤醒来处 理它. 我们在 scullpipe 驱动中不使用互斥等待, 但是; 很少见到竞争数据的读者(或者 竞争缓冲空间的写者), 并且我们无法知道一个读者, 一旦被唤醒, 将消耗所有的可用数 据.

使一个进程进入可中断的等待, 是调用 prepare_to_wait_exclusive 的简单事情:

void prepare_to_wait_exclusive(wait_queue_head_t *queue, wait_queue_t *wait, int state);

这个调用, 当用来代替 prepare_to_wait, 设置"互斥"标志在等待队列入口项并且添加这 个进程到等待队列的尾部. 注意没有办法使用 wait_event 和它的变体来进行互斥等待.

转载于:https://www.cnblogs.com/fanweisheng/p/11141875.html

linux进程互斥等待相关推荐

  1. Linux进程互斥——临界资源访问

    经典的进程同步问题--临界资源访问 模拟临界资源访问的示例程序 示例程序代码 运行结果 改造程序,使错误易于观察 代码如下 运行结果 利用信号量机制实现进程互斥功能 示例代码 运行结果 模拟临界资源访 ...

  2. linux进程互斥要点,linux进程之间互斥

    总所周知,在linux中pthread_mutex_t可以用于同一进程内多个线程之间的同步.我们所需要做的工作,仅仅是定义一个全局的pthread_mutex_t类型变量即可.但是对于进程之间的互斥, ...

  3. Linux进程互斥——生产者-消费者

    经典的进程同步问题--生产者-消费者 模拟生产者-消费者的示例程序 示例程序代码 运行结果 改造程序,取消所有的同步机制,记录执行情况并进行分析 代码如下 运行结果 模拟生产者-消费者的示例程序 本示 ...

  4. linux 等待进程,Linux 进程等待队列

    Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制. 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待 ...

  5. linux进程等待wait()实例

    在Linux系统中,进程的生命周期内主要包含:进程就绪.进程执行.进程等待和进程退出. 就绪转执行 处于就绪状态的进程,当进程调度程序为之分配了处理机(CPU)后,该进程便由就绪状态转变成执行状态. ...

  6. linux的多进程等待,等待进程结束wait()和waitpid()函数

    上一节最后我们说到若子进程先于父进程结束时,父进程调用wait()函数和不调用wait()函数会产生两种不同的结果: --如果父进程没有调用wait()和waitpid()函数,子进程就会进入僵死状态 ...

  7. Linux中进程的创建、进程的终止、进程的等待、进程的程序替换

    进程的创建 在进程的创建中,我们一个非常重要的函数 fork()函数,fork()函数会创建一个新的进程,为原有进程的子进程,原有就为父进程. 我们来看一下fork()函数的原型. #include ...

  8. Linux 进程控制(创建/退出/等待/替换)

    目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...

  9. 【Linux系统编程】进程的控制:结束进程、等待进程结束

    结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 ret ...

  10. Linux——进程控制:创建、终止、等待、替换

    进程创建 fork #include <unistd.h> pid_t fork(void); 操作系统做了什么? 调用fork之后,内核的工作: 分配新的内存块和内核数据结构给子进程 将 ...

最新文章

  1. MySQL的left on 【zt】
  2. select count
  3. mac解压rar命令_苹果mac电脑上很好用的免费压缩软件?ezip压缩软件分享
  4. C/C++ atol函数- C语言零基础入门教程
  5. 应物联网要求而生 美国团队研发出零功耗红外探测器
  6. 经典技术文章翻译(3):IIS7协议侦听器(Introducing IIS 7 IIS Protocol Listeners)
  7. ndroid分辨率 dpi 屏幕尺寸 对比图
  8. 曲折中前行的汉语编程
  9. 苹果cmsV10二开视频+图片+小说网站源码
  10. C# GridView 排序及分页
  11. EXCEL里如何识别AB和BA并去重?EXCEL里如何对多列同一值不区分顺序去重?
  12. error: <class ‘xmlrpclib.Fault‘>, <Fault 92: “CANT_REREAD: The directory named as part of the path /
  13. 广告行业常用英文词汇
  14. html制作古诗网页早发白帝城,《早发白帝城》古诗词
  15. 如何甄选出一个优秀的软件供应商?by彭文华
  16. 4.File类、Lambda表达式、JAVA IO
  17. 关于程序员的自我提升
  18. python bar图 百分比_matplotlib bar()实现百分比堆积柱状图
  19. 统信软件根社区斩获CSDN两项大奖
  20. 应用编程与裸机编程、驱动编程的区别(Linux应用编程篇)

热门文章

  1. 数据库学习----MySQL(二)
  2. 基于SSM的教学质量系统
  3. java 父类中的this_父类方法中的this
  4. vue 初识MVC与MVVM,及其与vue基本代码之间的关系
  5. Scala map中下划线_._2的含义
  6. 在spring管理的类的要注意问题
  7. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_2_网络通信协议...
  8. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_7_静态同步方法...
  9. Appium脚本(2):元素检测
  10. [SCOI2005]骑士精神