博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux进程互斥等待
阅读量:5173 次
发布时间:2019-06-13

本文共 1013 字,大约阅读时间需要 3 分钟。

我们已经见到当一个进程调用 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

你可能感兴趣的文章
如何开启VMware串口
查看>>
数据库
查看>>
常见Struts、Hibernate、Spring、J2EE、ibatis、Oracle等开发框架架构图及其简介
查看>>
Java为何大行其道
查看>>
CFileDialog的使用方法简单介绍
查看>>
send,recv,sendto,recvfrom
查看>>
C#开发问题汇总
查看>>
Kettle
查看>>
[复习]Python基础回顾
查看>>
LNMP
查看>>
java 读写锁
查看>>
_itoa_s替换 itoa
查看>>
面试问题
查看>>
Jmeter-【JSON Extractor】-响应结果中一级key取值
查看>>
mysql建库
查看>>
bzoj1066: [SCOI2007]蜥蜴
查看>>
jQuery自定义右键菜单
查看>>
mybatis实现延迟加载多对一
查看>>
JS拖拽,移动与拉伸
查看>>
Linux资源站
查看>>