并发和并行,同步和异步,阻塞和非阻塞

并发和并行:
“并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。 
而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。 
从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。


同步和异步,阻塞和非阻塞:
因为中文语意的问题,很多时候确实会导致混用,而且语境不一样意义也可能不一样。如果只是从计算机编程这个角度说, 讨论最多的也是IO 模型 ,阻塞非阻塞 和 同步异步说的应该是不同的东西。

阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。
同步异步: 你总是做完一件再去做另一件,不管是否需要时间等待,这就是同步;异步呢则反之,你可以同时做几件事,并非一定需要一件事做完再做另一件事。同步简单理解成一问一答同步进行,异步可以简单理解为不必等一个问题有答了再去问另一个问题,尽管问,有答了再通知你。

举个例子: 
我去买一本书,立即买到了,这就是非阻塞;
如果恰好书店没有,我就等一直等到书店有了这本书买到了才走,这就是阻塞;
如果书店恰好没有,我就告诉书店老板,书来了告诉我一声让我来取或者直接送到我家,然后我就走了,这就是异步。
那同步呢? 前面两种情况,非阻塞和阻塞都可以称为同步。
如果说书店有这书,我还让老板通知我以后来取就没这个必要了。

反映在编程方面就是 用户进程 调用 系统调用。(用户进程对应我,内核 对应 书店老板,书对应数据资源data , 买书就是一个系统调用了)
这阻塞非阻塞与同步异步IO机制,都是伴随计算机系统发展,用来解决一些出现的问题。阻塞非阻塞、同步异步可以组合,但是没必要组合,应该说是不同的IO机制,没必要纠结怎么区分,如果定要组合心里才爽,可以 这样认为:阻塞非阻塞都是同步,异步就没什么阻塞不阻塞了,都异步了还阻塞啥,肯定是非阻塞了。(异步非阻塞听起来多别扭)

unix网络编程中说到:
将IO模型分为五类:阻塞IO,非阻塞IO,IO复用,信号驱动,异步IO
其中阻塞IO就是那种recv, read,一直等,等到有了拷贝了数据才返回;
非阻塞就是不用等,立即返回,设置描述符为非阻塞就行了,但是要进程自己一直检查是否可读;
IO复用其实也是阻塞的,不过可以用来等很多描述符;
信号驱动采用信号机制等待;
异步IO就不用等待了,当他告知你的时候,已经可以返回了,数据都拷贝好了。

posix.1严格定义的异步IO是要求没有任何一点阻塞,而上述的前面四个(阻塞IO,非阻塞IO,IO复用,信号驱动)都不同程度阻塞了,而且都有一个共同的阻塞: 内核拷贝数据到进程空间的这段时间需要等待。 (这么说上面的举例中: 必须要书送到我家,否则都不算异步,纠结。。。)

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同步非阻塞异步非阻塞都是针对并发编程的不同策略,主要区别在于它们如何管理时间片以及在处理任务时的交互方式。 ### 同步非阻塞 (Synchronous Non-blocking) - **特点**: 系统能持续接收并处理新请求,即便是在处理较长耗时的操作期间也是如此。 - **工作流程**: 接收一个请求后,系统并不等待其完成,而是继续处理其他未完成的请求,并将当前请求放入等待队列中。当当前请求完成或超时时,系统会从等待队列中取出并继续处理。 - **优势**: 提高了并发性能和整体系统利用率。 - **劣势**: 开发和调试相对复杂,尤其是在多任务切换时需要更精细的控制。 ### 异步非阻塞 (Asynchronous Non-blocking) - **特点**: 更侧重于在处理I/O和其他耗时任务时不阻塞主线程或任何其他的任务流。 - **工作流程**: 当遇到I/O操作、数据库查询等需要等待的情况时,程序会立即返回给用户,而不是进入阻塞状态。这使得在等待结果的同时,系统能够处理更多的任务。 - **优势**: 显著提高并发处理能力,特别是面对大量轻量级任务时。 - **劣势**: 需要使用回调函数、事件循环或多路复用器等复杂的机制来组织和管理任务,增加了代码的复杂性和难度。 ### 主要区别总结 - **任务执行顺序与调度**: - **同步非阻塞**:保持任务按接收顺序执行,但在等待耗时操作时,可以并行处理其它任务。 - **异步非阻塞**:任务不受接收顺序限制,一旦遇到耗时操作即返回,直到结果准备好才再次运行。 - **核心目标**: - **同步非阻塞**:主要目标是提高整体系统性能和响应速度。 - **异步非阻塞**:着重于最大化I/O操作的效率,特别是在处理大量I/O密集型任务时。 - **实现方式**: - **同步非阻塞** 可以通过优化现有线程或进程的调度实现,例如通过多线程池、异步文件系统等技术。 - **异步非阻塞** 则更多依赖于事件驱动和回调机制,如通过异步IO、基于事件的网络服务器等技术。 ### 相关问题: 1. **异步编程与同步编程的主要区别是什么?** 2. **异步非阻塞编程在哪些场景下特别有效?** 3. **在选择同步非阻塞还是异步非阻塞时,应考虑哪些因素?** 以上介绍了这两种编程策略的核心差异及其应用场景,选择哪种取决于具体的业务需求、系统负载特性以及团队的技术栈和经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值