这里写目录标题
- 面试常见概念区分:并发与并行、同步与异步、阻塞与非阻塞、线程同步与互斥
- 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)
线程互斥是指多个线程对共享资源的访问是排他性的。当一个线程正在访问共享资源时,其他线程必须等待,直到当前线程释放资源。例如,多个线程都要访问一个共享变量,但同一时刻只能有一个线程访问。
总结:
- 线程同步:线程之间存在依赖关系,需要等待消息。
- 线程互斥:多个线程对共享资源的访问是排他性的。
总结
本文通过通俗易懂的例子,帮助你理解了并发、并行、同步、异步、阻塞、非阻塞、线程同步与互斥等核心概念。这些概念在编程和系统设计中非常重要,理解它们可以帮助你更好地设计高效、可靠的系统。
如果你对这些概念还有疑问,欢迎在评论区留言,我们一起讨论!