冲破临界区

本文探讨了临界区的定义及其保护机制,特别强调了使用锁和中断管理时遇到的问题。通过实例揭示了在不当使用全局中断时,可能导致资源冲突和系统崩溃的风险。关键点在于理解中断管理对实时性的影响及合理使用同步机制的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是临界区

​ 临界区指的是一个程序片段,该片段中包含的资源是公共的,任意时刻只能一个线程去访问,如系统堆。

2. 临界区保护

  1. 使用 OS 提供的 IPC 机制,通常使用锁、信号量 的方式来达到对临界区的保护,当一个线程要访问临界区(如要 malloc),会先去拿锁,能够拿到说明临界区此时仅有线程 A 访问,其他 IPC 机制同理。
  2. 调度器上锁,顾名思义,调度器上锁了,线程就不会被调度,这一时刻,临界区的资源也只能由锁调度器的线程访问,频繁锁调度器严重影响系统实时性。
  3. 关 cpu 全局中断,此时连普通的外部中断都无法打断了,由于线程上下文的切换依赖于中断环境,因此,临界区的资源只能由关闭中断者访问。频繁关中断,更为严重影响系统实时性,因为连外部中断都无法得到响应了。

3. 冲破临界区

​ 被上述机制保护的临界区被冲破了,也就是说,临界区中的资源不再是任意时刻只能由一个线程拥有。

  • 场景:线程 A 使用 malloc,向系统要一片内存,此时线程 A 已经获得锁了,正常情况下,不管天王老子来了,也得等线程 A 把这片内存申请到手之后,其他线程才能再次申请内存。

  • 问题来了:此时,线程 B 醒了,线程 B 的优先级较高,此时操作系统把 cpu 的使用权交给线程 B,此时线程 B 很开心的得到了执行,但是线程 B 不守规矩,把全局中断给 关了,然后线程 B 很开心的去向操作系统申请内存,此时由于线程 A 已经拿了锁,此时线程 B 应当被操作系统挂起

  • 问题又又来了:线程 B 把全局中断给关了,然后又去拿锁,锁已被线程 A 拿,此时线程 B 要被挂起,然后将 cpu 使用权交给优先级更高的线程去使用,但是此时 全局中断关闭了,让出 cpu 使用权的动作是在中断中完成的,那线程 B 继续持有 cpu 使用权

  • 结果:线程 B 没有被挂起,线程 B 继续很开心的去获取公共资源,线程 B 最终如愿得到了一大片内存,很开心。此时线程 A 被操作系统唤醒了,线程 A 继续吭哧吭哧的干活,但是他不知道公共资源已经被线程 B 得到过一次了

4. 总结

​ 上述场景是非常危险的,系统可能跑着跑着就崩溃,因此,需要合理的使用锁等机制,在关全局中断下的代码,一定不要有访问上锁的临界区的动作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值