61 - 进程互斥锁的详细设计

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

1. 问题

  • 任务之间总是完全独立毫无依赖的吗?

1.1 生活中的示例

1.1.1 吃饭问题

在这里插入图片描述

1.1.2 十字路口

在这里插入图片描述

1.1.3 洗手间

在这里插入图片描述

1.1.4 生产消费者问题

  • 有n个生产者同时制造产品,并把产品存入仓库中
  • 有m个消费者同时需要从仓库中取出产品
  • 规则:
    • 一次只允许一个生产者向仓库放入产品
    • 一次只允许一个消费者从仓库取出产品
    • 生产者和消费者不能同时进入仓库

1.2 结论

在特殊情况下,并行执行的任务之间 存在依赖

2. 接下来的问题

  • 如何在操作系统中提供 任务间安全依赖的方式?

2.1 临界资源(Critical Resource)

  • 每次 只允许一个任务 进行访问(读 / 写)的资源 —— 临界资源

2.2 临界区(Critical Section)

  • 每次 只允许一个任务 执行的代码片段 —— 临界区

2.3 任务间的同步

同步在特殊情况下,控制 多个任务间的相对执行顺序

2.4 任务间的互斥

互斥多个任务 在同一时刻都需要访问 临界资源

2.5 互斥锁(Mutex)的定义

互斥锁 是一种 特殊的状态变量(空闲状态 & 占用状态

  • 当互斥锁处于空闲状态时:
    • 任务可成功获取锁并继续执行,也即访问临界资源
    • 锁被任务获取后,自动转化为占用状态
  • 当互斥锁处于占用状态时:
    • 试图获取锁的任务会被阻塞,直到锁再次转换为空闲状态

2.6 操作Mutex的关键函数

  • uint CreateMutex();
    创建锁,返回锁的唯一标识
  • void DestroyMutex(uint mutex);
    销毁指定标识的锁
  • void EnterCritical(uint mutex);
    当锁空闲时:获取锁并继续执行
    当锁占用时:阻塞并等待锁释放
  • void ExitCritical(uint mutex);
    释放锁( 同一把锁 的获取和释放必须在同一个任务中 成对出现

2.7 Mutex使用示例设计

在这里插入图片描述

  • 注意:对于指定的互斥锁,必须先获取再释放,并且获取与释放不能跨任务进行

2.8 课后扩展问题

  • Mutex相关函数接口处于用户态还是内核态?
  • Mutex处于占用状态时,试图获取Mutex的任务如何阻塞?
  • Mutex恢复空闲状态时,如何通知阻塞的任务继续执行?
  • 通过Mutex能否保证任务同步执行(即:串行执行)?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值