并发,同步,异步,互斥,阻塞,非阻塞的理解

转载自 http://blog.csdn.net/it_lover_/article/details/52154591

并发(concurrency)

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。

  1. 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
  2. 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

同步与异步

同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。

阻塞,非阻塞

阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式。
阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
一般来说IO模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。

同步阻塞IO

用户进程在发起一个IO操作以后,阻塞直到系统调用完成为止,用户进程才能运行。
这里写图片描述

同步非阻塞IO

用户进程发起一个IO操作以后,需要时不时的询问IO操作是否就绪,引入了不必要的CPU资源浪费。
这里写图片描述

异步阻塞IO

应用发起一个IO操作以后,使用阻塞 select 系统调用来等待 I/O可用的通知。 select 调用非常有趣的是它可以用来为多个IO描述符提供通知,而不仅仅为一个描述符提供通知。

如图,其与同步阻塞的区别在于同步阻塞中系统调用read()在IO完成后才返回结果,而异步阻塞中read()会先返回一个错误代码,之后在select()中等待IO可用通知时阻塞,接到通知再执行系统调用read()完成IO操作。

这里写图片描述

异步非阻塞IO

用户进程只需要发起一个IO操作然后立即返回,
等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,
此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作因为真正的IO读取或者写入操作已经由内核完成了。


这里写图片描述

总结

同步是走得快的A耐住性子等待B,异步是A让B完成后通知A。
阻塞与非阻塞是线程的状态,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
阻塞是当事件没完成就等待a的完成,非阻塞就是直接说当前做完了没,做完就发结果,没做完就说没做完,不会去等待。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值