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

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

这里写目录标题

  • 面试常见概念区分:并发与并行、同步与异步、阻塞与非阻塞、线程同步与互斥
    • 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)

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

总结:

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

总结

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

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

相关文章:

  • 【MySQL】基本操作 —— DML 与约束
  • HashMap ,HashTable , ConcurrentHashMap 面试
  • C++ primer plus 内存模型和命名空间下
  • OSC32IN与OSC32OUT对于无源晶振而言有区别吗?
  • 数字滤波器的设计实现及应用(论文+仿真)
  • 在教育领域的大模型知识引擎 × DeepSeek应用
  • 显示模组bonding缺划专案
  • RabbitMQ入门:从安装到高级消息模式
  • SWPU 2022 新生赛
  • Fisher准则例题
  • 【大语言模型】【个人知识库正式内容】提示工程:如何设计模型的提示语
  • Linux操作系统下Git的使用详细步骤
  • 什么是mysql索引回表?
  • jmeter-sample
  • 论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • 自定义MDCAdapter,进行线程池级别的日志ID传递
  • 安装 Powerlevel10k 及 Oh My Zsh 的使用
  • opencascade 源码学习几何变换 BRepBuilderAPI-BRepBuilderAPI_Transform
  • 【GB28181】RTSP服务器传输AAC音频
  • JVM垃圾收集器相关面试题(1)
  • 王毅同德国外长瓦德富尔通电话
  • 解放日报:“感觉全世界人都在上海买买买”
  • 香港特区政府强烈谴责美参议员恐吓国安人员
  • 马上评|科学红毯,让科学家成为“最亮的星”
  • 俄媒:俄乌代表团抵达谈判会场
  • 娃哈哈:自4月起已终止与今麦郎的委托代工关系,未来将坚持自有生产模式