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

文章通过生活中的例子如吃饭、十字路口和洗手间来阐述任务间的依赖关系,引出操作系统中临界资源和临界区的概念。接着介绍了互斥锁(Mutex)在确保任务间安全访问共享资源中的作用,包括其状态转换、关键函数以及使用示例。文章最后提出了关于Mutex在用户态与内核态的操作以及任务阻塞与唤醒的问题。
摘要由CSDN通过智能技术生成

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

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

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
    评论
操作系统进程互斥算法设计是确保多个并发执行的进程在访问共享资源时避免冲突的关键技术。主要目标是保证一次只有一个进程能使用该资源,从而维护数据的一致性和完整性。常见的互斥算法有以下几种: 1. **PV操作(P-V操作)**:这是最基础的互斥算法,包括P操作(请求进入临界区)和V操作(释放已获得的锁)。当进程请求进入临界区时,会尝试获取锁(P操作),如果锁被其他进程持有,则进程阻塞,直到锁被释放。当进程离开临界区时,它会释放锁(V操作),让其他等待的进程有机会进入。 2. **忙等(Busy Waiting)**:是最简单的策略,但效率低下,因为CPU在等待期间无法执行其他任务。这种做法在现代操作系统中很少使用,因为它是低效的且浪费了系统资源。 3. **信号量(Semaphore)**:一种更高级的同步机制,使用一个计数器来控制对资源的访问。当资源可用(计数器大于0)时,P操作会递减计数器;V操作则增加计数器。当计数器为0时,进程会被阻塞。 4. **自旋锁(Spin Lock)**:这是一种特殊的信号量,当资源被占用时,等待的进程不停循环检查锁是否变为可用,直到获取为止。这种方式在锁竞争不频繁时可以节省上下文切换时间,但当竞争激烈时,会导致CPU利用率降低。 5. **读写锁(Reader-Writer Lock)**:针对读操作多于写操作的情况,允许多个读进程同时进入临界区,而写进程需要独占资源。这样提高了并发性能,尤其是在大量读取较少写入的场景。 6. **互斥量(Mutex)**:这是最常见的互斥算法,用作保护单个资源。当一个进程获得了互斥量,其他所有尝试获取该锁的进程都会被阻塞,直到第一个进程释放。 相关问题: 1. PV操作是如何避免死锁的? 2. 自旋锁适合什么样的应用场景? 3. 读写锁在哪些情况下比互斥锁更有效?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

uuxiang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值