当前位置: 首页 > article >正文

面试常见概念区分:并发与并行、同步与异步、阻塞与非阻塞、线程同步与互斥

这里写目录标题

  • 面试常见概念区分:并发与并行、同步与异步、阻塞与非阻塞、线程同步与互斥
    • 1. 并发和并行
      • 并发(Concurrency)
      • 并行(Parallelism)
    • 2. 同步和异步
      • 同步(Synchronous)
      • 异步(Asynchronous)
    • 3. 阻塞和非阻塞
      • 阻塞(Blocking)
      • 非阻塞(Non-blocking)
    • 4. 线程同步和互斥
      • 线程同步(Thread Synchronization)
      • 线程互斥(Thread Mutual Exclusion)
    • 总结

面试常见概念区分:并发与并行、同步与异步、阻塞与非阻塞、线程同步与互斥

在编程和系统设计中,我们常常会遇到并发、并行、同步、异步、阻塞、非阻塞、线程同步与互斥等概念。这些概念虽然常见,但很容易混淆。本文将通过通俗易懂的方式,结合实际例子,帮助你深入理解这些核心概念。

1. 并发和并行

并发(Concurrency)

并发是指宏观上看起来多个任务同时运行,但在微观上,这些任务的指令是交织着运行的。例如,在单核CPU上运行多任务时,虽然看起来像是同时运行,但实际上CPU在不同任务之间快速切换,每个任务的指令是穿插执行的。这种并发并不能真正提高计算机的性能,但可以提高资源利用率和效率。

并行(Parallelism)

并行是指严格物理意义上的同时运行。例如,在多核CPU上,多个任务可以分别在不同的核心上同时运行,互不影响。在单个周期内,每个核心都可以执行自己的指令,因此并行确实提高了计算机的性能。这也是现代CPU向多核发展的主要原因。

总结:

  • 并发是任务在时间上交替执行,宏观上看起来同时运行。
  • 并行是任务在物理上同时运行,真正提高了性能。

2. 同步和异步

同步和异步关注的是消息通信机制(synchronous communication / asynchronous communication)。

同步(Synchronous)

同步通信是指调用者在发出调用后,必须等待调用结果返回才能继续执行。换句话说,调用者会主动等待调用的结果。例如,你打电话问书店老板有没有《分布式系统》这本书,老板会说“稍等,我查一下”,然后开始查找。在老板找到结果并告诉你之前,你只能等待。

异步(Asynchronous)

异步通信是指调用者在发出调用后,不会等待结果返回,而是继续执行其他任务。结果通过回调函数或其他方式通知调用者。例如,你问书店老板有没有书,老板直接说“我查一下,查好了打电话给你”,然后挂电话。你不需要等待结果,可以先去做别的事情,老板查到结果后会主动打电话通知你。

总结:

  • 同步:调用者等待结果返回。
  • 异步:调用者不等待结果,通过回调或其他方式获取结果。

3. 阻塞和非阻塞

阻塞和非阻塞关注的是程序在等待调用结果时的状态。

阻塞(Blocking)

阻塞调用是指调用结果返回之前,当前线程会被挂起,无法执行其他任务。例如,你打电话问书店老板有没有书,然后一直等待结果,直到老板告诉你答案。

非阻塞(Non-blocking)

非阻塞调用是指调用结果返回之前,当前线程不会被挂起,可以继续执行其他任务。例如,你问书店老板有没有书,然后不等结果,先去做别的事情。过一会儿再检查老板是否回复了。

总结:

  • 阻塞:线程在等待结果时被挂起。
  • 非阻塞:线程在等待结果时可以继续执行其他任务。

注意: 阻塞与非阻塞与同步异步无关。同步可以是阻塞的,也可以是非阻塞的;异步也可以是阻塞的,也可以是非阻塞的。

4. 线程同步和互斥

线程同步(Thread Synchronization)

线程同步是指线程之间存在的一种制约关系,一个线程的执行依赖于另一个线程的消息。当一个线程没有得到另一个线程的消息时,它会等待,直到消息到达才继续执行。例如,线程A需要线程B的结果才能继续执行,线程A就会等待线程B完成。

线程互斥(Thread Mutual Exclusion)

线程互斥是指多个线程对共享资源的访问是排他性的。当一个线程正在访问共享资源时,其他线程必须等待,直到当前线程释放资源。例如,多个线程都要访问一个共享变量,但同一时刻只能有一个线程访问。

总结:

  • 线程同步:线程之间存在依赖关系,需要等待消息。
  • 线程互斥:多个线程对共享资源的访问是排他性的。

总结

本文通过通俗易懂的例子,帮助你理解了并发、并行、同步、异步、阻塞、非阻塞、线程同步与互斥等核心概念。这些概念在编程和系统设计中非常重要,理解它们可以帮助你更好地设计高效、可靠的系统。

如果你对这些概念还有疑问,欢迎在评论区留言,我们一起讨论!

原文地址:https://blog.csdn.net/weixin_44330367/article/details/146260254
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/587842.html

相关文章:

  • 设计模式之装饰器模式:原理、实现与应用
  • 阿里云服务器购买及环境搭建宝塔部署springboot和vue项目
  • 论文阅读笔记:Deep Unsupervised Learning using Nonequilibrium Thermodynamics
  • 在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢
  • 【设计模式】从事件驱动到即时更新:掌握观察者模式的核心技巧
  • 深入探究 HTML 框架:多页面同窗口显示的奥秘
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(40)翻天印压回文串 - 最长回文子序列(区间DP)
  • [MoeCTF 2021]babyRCE
  • 词向量:优维大模型语义理解的深度引擎
  • 使用WireShark解密https流量
  • Centos 7 安装达梦数据库
  • 设计模式-工厂模式、策略模式、代理模式、责任链模式
  • STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步
  • docker安装和卸载
  • Kubernetes教程(七)了解集群、标签、Pod和Deployment
  • Python和PyTorch库实现基于生成对抗网络(GAN)将小纹理合成大纹理的详细步骤及代码示例
  • HOT100——链表篇Leetcode234. 回文链表
  • 自动化立体库的规划设计
  • [Hello-CTF]RCE-Labs超详细WP-Level13Level14(PHP下的0/1构造RCE命令简单的字数限制RCE)
  • 当内核调试过程中出现bug的调试流程