我是靠谱客的博主 完美汽车,最近开发中收集的这篇文章主要介绍并发,同步,异步,互斥,阻塞,非阻塞的理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

    • 1 什么是线程同步和互斥⭐⭐⭐⭐⭐
    • 2 并发,同步,异步,互斥,阻塞,非阻塞的理解
    • 3 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐⭐

1 什么是线程同步和互斥⭐⭐⭐⭐⭐

之所以会引出这个概念全都是因为 “线程之间是抢占式调度的”。
临界资源:多个线程访问的那个公共资源叫做临界资源。
临界区:访问临界资源的代码叫做临界区。
互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。
原子性:不会被任何调度机制打断的操作,该操作只有两种状态,要么完成,要么未完成。

线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。
互斥量pthread_mutex_t
线程的同步就是协同步调,按预定的先后次序进行运行。同步指的是顺序上的同时,同步控制着线程和线程之间的执行顺序(主要还是线程的抢占式调度惹的祸,有的时候就是需要线程和线程之间按照一定的顺序执行。)
条件变量pthread_cond_t
pthread_cond_wait需要互斥量,解锁和等待的动作是原子的,因为怕线程错过其他线程的通知消息导致一直等。条件变量总是和互斥量一起使用,互斥量保护着条件变量,防止多个线程对条件变量产生竞争。

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

并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。
1.互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  
2.同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
异步(asynchronous):异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

阻塞非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式。阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
一般来说IO模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
同步阻塞IO :用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。
同步非阻塞IO :用户进程发起一个IO操作以后可返回做其它事情, 但是用户进程需要时不时的询问 IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。应用发起一个IO操作以后,使用阻塞select系统调用 来等待 I/O可用的通知。 select 调用非常有趣的是它可以用来为多个IO描述符提供通知,而不仅仅为一个描述符提供通知。
异步阻塞IO :应用发起一个IO操作以后,不等待内核IO操作的完成, 等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别同步必须等待或者主动的去询问IO是否完成。
异步非阻塞IO :用户进程只需要发起一个IO操作然后立即返回, 等IO操作真正的完成以后,应用程序会得到IO操作完成的通知, 此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作因为真正的IO读取或者写入操作已经由内核完成了。

同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。

3 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐⭐

异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法,只有同步才有阻塞和非阻塞之分。
同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。
异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作
阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作
非阻塞:进程给CPU传达任务后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。
同步阻塞的例子:
你上QQ问书店老板有没有哪本书,如果是同步阻塞,书店老板会说,你稍等,“我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。(你一直等的,等老板给你回复)
同步非阻塞的例子:
而如果是同步非阻塞,不管老板有没有告诉你,你自己一边玩去了,当然你也会偶尔过几分钟问一下老板,书找到了吗。
异步机制的例子:
书店老板会直接告诉你我查一下啊,查好了,我直接回复你,然后直接那人就下线(不返回结果)。然后查好了,他会主动联系你。

最后

以上就是完美汽车为你收集整理的并发,同步,异步,互斥,阻塞,非阻塞的理解的全部内容,希望文章能够帮你解决并发,同步,异步,互斥,阻塞,非阻塞的理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部