【操作系统】并发与并行

 并发基本概念

    1. 同步与异步

同步与异步用来形容一次方法调用。同步调用必须等方法调用返回以后,才能继续调用。异步调用更像是一个消息传递,一旦开始方法便立即返回,调用者可以继续完成后面相关的调用。此时异步方法就在另一个线程中真实的执行。

如上图所示是同步调用与异步调用的区别,同步调用只能是在调用完成以后才能进行后续的工作,然而异步调用则是只要触发了异步调用开始之后就可以继续完成后面的工作。此时会有一个并发的线程与主线程一起在工作。

形象点说就是,形象的说就是做饭的时候,你是一直在等着饭煮熟,再洗菜,还是在煮饭的时候,去洗菜的问题。无非就是我顺序的去执行,还是同时执行。顺序的去执行就类似于同步。同时去执行就是异步。效率大家可想而知。

    1. 并发与并行

  如上图所示并发与并行实际概念上是有差异的。并发强调的是时间片的轮换,交替执行。然而在时间片轮换过程中对于使用程序的用户来说错觉上就感觉是同时运行的。并行则不一样是真实的同时运行。由于他们的结果是一样的所以我们混淆的把并发与并行统一归类为并发。实际上如果是单核CPU的话,并做不到真正的并行。因为只有一个处理器,只能靠CPU的时间片的切换来并发执行,以给用户一种真正意义上的并行。

    行象点说就像你爬山的时候,爬一会又看一会儿风景。然而如果你做缆车的话,就可以用缆车的上行来代替你上山的过程,你就可以一直看风景。你爬山就像并发执行,边爬边看。你坐缆车上山就是并行执行的。这个效率,自然明白。

    1. 临界区

表示一种公共资源或者共享数据,可以被多个线程使用。但每一次只能有一个线程使用它。一旦临界区被占用,其他线程要想使用这个资源就必须等待。在并行程序中,临界区是保护的对象,比如一个会议室不能同时提供给两个开发团队开会一样,只能轮流开会,这就是临界资源的概念。

1.4阻塞与非阻塞

阻塞与非阻塞通常形容的是多线程之间的相互影响。比如一个线程占用了临界区资源,那么其他需要这个资源的线程就必须在临界区等待。等待会导致线程挂起,这种情况就是阻塞。此时如果占用资源的线程不释放资源,那么其他的线程就不能执行。

非阻塞意思恰恰相反,它强调的是没有一个线程能够阻碍其他线程的执行,所以线程都会尝试不断的向前执行。

1.5死锁,饥饿与活锁

饥饿是指某一个或多个线程因为种种原因无法获得所需资源。导致一直无法执行的情况。比如某个线程的优先级比较低,或者说是某个线程一直占着核心资源不放的情况。但是相比于死锁来说,活锁是在未来某一段时间内可以解决的。

活锁就是指线程碰撞,主动让出资源给别人,导致两个线程不断的碰撞。形象的说就好比我们出电梯门的时候总有那么一种情况两个人互相让,两个人同时让右结果撞,又同时让左结果又碰上了,这个时候人的话两到三次以后就解决了。但是计算机的线程就没那么幸运了,可能会不断的尝试造成短暂的活锁,可是可以解决的。

死锁,相比于饥饿与活锁,死锁的危害性似乎会是更严重的。我们说就像爱情里面的三角恋。你爱我,我爱她,她爱你。造成了你,我,她三个线程互相等待,形成了环。当等待形成了环的时候我们就说这个程序已经死锁了,因为没发玩了。要解决这个问题唯一的办法就是其中一个线程主动让出资源。

1.6 并发的级别

并发的级别大致分类可以分为阻塞,无饥饿,无障碍,无锁,无等待几种。

1.6.1 阻塞

一个线程是阻塞的,那么在其他线程释放资源之前,当前线程是无法继续执行的。当我们使用synchronized,或可重入锁的时候,在执行后面的代码的时候,都会试图得到临界区资源。如果得不到,线程就会挂起等待,直到占有了所需资源为止。

1.6.2 无饥饿

如果线程之间是有优先级的,那么线程调度的时候总是倾向于高优先级的线程,也就是说对于同一个资源的分配是不共平的。对于非共平锁来说因为是有优先级的,导致线程之间会有饥饿产生,对于非公平锁来说,线程之前是没有优先级的。先来先执行,所以线程直接就不会产饥饿的情况。

1.6.3 无障碍

就是多个线程可以同时对共享资源进行修改,然而如果多个线程把数据改坏了的话,就做线程资源的回滚,相比重量级锁来说,这是一种乐观的操作,类似于我们框架的hibernate中的version操作。所有线程一起改,在这个线程开始改的时候通过设置共享资源的版本,等线程改完之后,再拿着修改前的共享资源版本去对比,如果是同一个版本。那么就允许修改,如果不是同一个版本,那么就不允许修改,做线程与共享资源的回滚操作。

1.6.4 无锁

也是一种无障碍的并发执行模式,多个线程一起竞争修改资源,不断的循环去尝试,总有一个线程可以从中胜出。不至于全军覆灭。至于临界区竞争失败的资源,总是尝试不成功则会一直处于饥饿状态。

典型的例子就是我们的比较设值操作。

1.6.5 无等待

     无等待是在无锁的基础上更胜了一步,也就是无锁是只要其中一个线程能在有限的步数里面完成就可以了。但是无等待的话是所有的线程都在有限的步数里面完成。

 

 

 

 

 

 

<think>嗯,用户这次问的是操作系统并发并行的区别,这个问题在操作系统领域很基础但也很重要。用户可能正在学习操作系统课程或者准备面试,需要清晰的概念区分。 从用户提供的引用材料看,[1][2][3]都给出了类似的定义:并发是单处理器上的任务交替执行,并行是多处理器上的真正同时执行。不过用户特别强调要参考之前的问答历史,我注意到上次详细解释了进程/线程切换机制,其中提到线程切换的优势就在于支持更高效的并发执行。 用户似乎偏好技术细节的对比分析,上次对TLB失效、CR3寄存器等硬件级机制就很关注。这次回答可以延续这种风格,但要注意概念解释的通俗性。那个“吃馒头”的比喻很生动,可以保留,同时补充更专业的技术细节。 需要特别注意几个关键点: - 并发是逻辑上的同时(通过时间片轮转实现) - 并行是物理上的同时(需要多核硬件支持) - 并发常涉及上下文切换开销(参考上次的线程切换分析) - 并行可能引发缓存一致性问题(MESI协议) 用户可能还会追问实际应用场景,比如“什么时候用并发什么时候用并行”,这个在回答最后可以提一下。另外数学表达方面,虽然问题本身不涉及复杂公式,但可以加入简单的执行时间计算公式来体现专业性。 上次回答末尾提出的四个延伸问题中,第3个“多核CPU下的额外问题”正好和并行相关,这次可以顺势引导用户思考缓存一致性等更深层问题。不过要注意控制回答深度,避免让初学者感到困惑。</think>以下是操作系统并发(Concurrency)并行(Parallelism)的详细对比及技术解析: --- ### **一、核心定义** | **概念** | **定义** | **硬件依赖** | **实现方式** | |----------|--------------------------------------------------------------------------|----------------------|----------------------------------| | **并发** | 单个处理器**交替处理多个任务**,通过快速切换营造“同时执行”的假象 | 单核 CPU 即可实现 | 时间片轮转、中断调度[^2][^3] | | **并行** | 多个处理器/多核**真正同时处理多个任务**,物理上同步执行 | 需多核 CPU 或分布式系统 | 多核调度、分布式计算[^1] | > **通俗比喻** > - **并发**:一个厨师同时照看三口锅(交替翻炒) > - **并行**:三个厨师各炒一口锅(同时操作)[^1] --- ### **二、关键技术原理** #### 1. **并发的实现机制** - **时间片轮转(Round-Robin)** 操作系统为每个任务分配固定时间片(如 10ms),到期强制切换任务。 数学表达:$$ \text{任务响应时间} = \frac{\text{任务数} \times \text{时间片长度}}{\text{CPU 核心数}} $$ - **I/O 阻塞切换** 当任务 A 执行 I/O 操作时,CPU 立即切换至任务 B,避免空闲等待[^3] ```plaintext [任务A: 计算] → [任务A: I/O 等待] → [任务B: 计算] → [任务A: 继续计算] ``` #### 2. **并行的硬件基础** - **多核 CPU 架构** 每个核心独立执行指令流,共享 L3 缓存和内存总线。 ```mermaid graph LR CPU[CPU] --> Core1[核心1] CPU --> Core2[核心2] CPU --> Core3[核心3] CPU --> Memory[共享内存] ``` - **SIMD 指令集**(如 AVX-512) 单条指令同时操作多组数据(如 GPU 并行计算)。 --- ### **三、性能开销对比** | **维度** | **并发** | **并行** | |----------------|---------------------------------------|---------------------------------------| | **切换开销** | 需上下文切换(保存/恢复寄存器、栈)[^3] | 无切换开销(物理并行) | | **资源竞争** | 高(共享 CPU 核心,需锁机制) | 低(各任务独占核心) | | **加速比** | ≤1(单核无加速) | 理论可达 $N$ 倍($N$=核心数) | | **适用场景** | I/O 密集型任务(网络请求、磁盘读写) | CPU 密集型任务(矩阵计算、图像渲染) | > ⚠️ **阿姆达尔定律(Amdahl's Law)** > 并行加速上限取决于代码中**必须串行执行**的比例: > $$ S = \frac{1}{(1 - P) + \frac{P}{N}} $$ > $P$:可并行化比例,$N$:处理器核心数 --- ### **四、典型应用场景** 1. **并发用例** - Web 服务器(Nginx):单进程处理千级并发连接(epoll 事件驱动) - 操作系统 GUI:响应点击事件时后台执行文件下载 2. **并行用例** - 科学计算:使用 MPI 在多节点并行求解微分方程 - 深度学习:GPU 并行训练神经网络(TensorFlow/PyTorch) --- ### **五、协同工作模式** 现代系统通常**混合使用**并发并行: ```plaintext [多核 CPU] ├─ 核心1:并发执行任务A、B(时间片轮转) ├─ 核心2:并发执行任务C、D └─ 核心3:独占执行任务E(无切换) ``` > **示例**:Chrome 浏览器 > - 并行:不同标签页运行在独立进程(多核利用) > - 并发:单个页面内 JS 线程渲染线程交替执行[^1] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值