2.6 操作系统 并发与互斥

一、同步与异步

  • 同步:用来保证调用方和被调用方顺序执行。调用方需要等待被调用方执行完成之后,自身才能继续执行,调用方的逻辑控制流被阻塞。同步不一定要阻塞,只是逻辑控制流被阻塞。阻塞只是同步最常用的手段。
  • 异步:调用方和被调用方各自执行。调用方发出请求之后,无需等待被调用方执行完毕就可以继续执行,被调用方的执行结果通过回调、信号等方式返回给调用方。
  • 核心区别:调用方的逻辑控制流是否阻塞等待被调用方执行结束

二、同步:有锁、无锁、无等待

  • 锁的概念:核心目的是解决并发(多个操作同时进行)时,争抢共享资源(如数据、文件等)导致的混乱问题。
  • 上锁(加锁):申请独占使用权。如果资源空闲,就可获得锁并开始操作。
  • 解锁(释放):归还使用权,让其他任务可以申请。

(1)有锁 (Lock-Based)

核心思想:保证同一时间只有一个线程能进入临界区(访问共享资源)。

特点

阻塞:未获得锁的线程会挂起等待,导致上下文切换的开销。

确定性:保证了最强的正确性(安全性)。

(2)无锁 (Lock-Free)

核心思想:不使用传统的互斥锁,通过原子操作来保证并发安全。它保证系统整体的进度不会停滞

特点

非阻塞:至少有一个线程能在有限步内完成操作,不会出现所有线程都卡死的情况。

高性能:在高竞争环境下,避免了线程挂起和调度的巨大开销。

活性:可能发生活锁(线程不断重试但都无法完成操作),但某个线程最终总会成功。

保证:它只保证系统整体不会卡死,不保证每一个线程都能立刻取得进展。

(3)无等待 (Wait-Free)

核心思想:是无锁的一个更强保证的子集。要求每一个线程都能在有限步内完成自己的操作,不管其他线程的行为和速度。

特点

非阻塞:是所有非阻塞算法中最高级别的保证。

线程级进步:每个线程都独立取得进展,绝对不会出现“饿死”现象。

实现难度极高。

最强保证:提供了最强的进度保证和公平性。

三、自旋锁

自旋锁只有锁定和解锁两个状态。自旋锁不会导致休眠,会一直尝试获取锁。自旋锁只适合短期持有。如果自旋时间过长,会浪费处理器的时间,降低系统性能。自旋锁同时会禁止本处理机的抢占,如果没有禁止中断,则只有中断程序能够运行。在用户态下应尽量避免使用自旋锁。

(1)加锁

(2)解锁

直接原子将 lock 清零。

四、自旋锁和信号量可以用于中断吗?

自旋锁可以用于中断,但在获取自旋锁前,需要先禁止本地中断。因为如果获取了锁,此时又一个中断程序

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论
流程图很清晰
点赞 回复 分享
发布于 04-03 00:23 河北
同步异步讲得好
点赞 回复 分享
发布于 04-03 00:16 河北
欢迎订阅专栏《C++/嵌入式开发 秋招面经》 :https://www.nowcoder.com/creation/manager/columnDetail/MKaoll
点赞 回复 分享
发布于 03-30 17:09 河北

相关推荐

评论
5
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务