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

并行和并发

并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件(多核线程)在同一时刻发生;而并发是指两个或多个事件(进程或者程序)在同一时间间隔内发生。计算机在宏观上并发,微观上并行。

在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

①程序与计算不再一一对应,一个程序副本可以有多个计算

②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、缓冲区等。

③并发程序在执行中是走走停停,断续推进的。

网上找到一个简单的例子:

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。

(来自作者:龚昱阳 Dozer,链接:https://www.zhihu.com/question/33515481/answer/58849148

来源:知乎。著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。)

串行和并行:

指的是任务的执行方式。串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。并行指的是多个任务可以同时执行。异步是多个任务并行的前提条件。

同步和异步

指的是能否开启新的线程。同步不能开启新的线程,异步可以。个人理解同步是指两个线程的运行是相关的,其中一个线程要阻塞等待另外一个线程的运行。异步的意思是两个线程毫无相关,自己运行自己的。

在I/O流中它们是消息的通知机制。

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

异步的概念和同步相对。

当一个异步过程调用发出后,调用者不会立刻得到结果。

实际处理这个调用的部件是在调用发出后,

通过状态、通知来通知调用者,或通过回调函数处理这个调用。

举个例子(网上找的):

当到银行后,

.可以去ATM机前排队等候                       -- (排队等候)就是同步等待消息

.可以去大厅拿号,等到排到我的号时,

柜台的人会通知我轮到我去办理业务.              -- (等待别人通知)就是异步等待消息.

在异步消息通知机制中,

等待消息者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码)找到等待该事件的人.

在实际的程序中,

同步消息通知机制:就好比简单的read/write 操作,它们需要等待这两个操作成功才能返回;

同步, 是由处理消息者自己去等待消息是否被触发;

异步消息通知机制:类似于select/poll 之类的多路复用IO 操作,

当所关注的消息被触发时,由消息触发机制通知触发对消息的处理.

异步, 由触发机制来通知处理消息者;

阻塞和非阻塞:

阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态.

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。

对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

继续上面的那个例子,

不论是排队等待,还是使用号码等待通知,

如果在这个等待的过程中,

. 等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的,

表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行.

. 相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,

因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待.

同步阻塞              同步非阻塞

异步阻塞              异步非阻塞

同步阻塞形式:

效率是最低的,

拿上面的例子来说,就是你专心排队,什么别的事都不做。

实际程序中

就是未对fd 设置O_NONBLOCK 标志位的read/write 操作,

异步阻塞形式:

如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发,也就是领了一张小纸条,

假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;

异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息被触发时被阻塞.

比如select 函数,

假如传入的最后一个timeout 参数为NULL,那么如果所关注的事件没有一个被触发,

程序就会一直阻塞在这个select 调用处.

同步非阻塞形式:

实际上是效率低下的,

想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,

如果把打电话和观察排队的位置看成是程序的两个操作的话,

这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;

很多人会写阻塞的read/write 操作,

但是别忘了可以对fd 设置O_NONBLOCK 标志位,这样就可以将同步操作变成非阻塞的了;

异步非阻塞形式:

效率更高,

因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,

程序没有在两种不同的操作中来回切换.

比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,

于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下(注册一个回调函数),

那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了.

如果使用异步非阻塞的情况,

比如aio_*组的操作,当发起一个aio_read 操作时,函数会马上返回不会被阻塞,

当所关注的事件被触发时会调用之前注册的回调函数进行处理,

时间: 2024-08-02 16:13:21

并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞的相关文章

背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下载任务(任务分组,并行或串行执行,组完成后通知) 示例演示后台下载任务的分组,以及如何设置组内任务是并行执行还是串行执行,以及组任务全部完成后如何 toast 或 tile 通知)BackgroundTask/TransferModel.cs /* * 扩展了 DownloadOperation 和 UploadOperation,用于 MVVM 绑定数据 */ using System; using S

同步 ,异步,并发/并行,串行

同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B.只存在一个线程. 异步:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B.任务B不用等待任务A结束才执行.存在多条线程. 接下来分析一下并行/并发,串行.很多人大概会混淆这些概念. 并发和并行其实是异步队列实现的两种形式.并行其实是真正的异步,多核CUP可以同时开启多条线程供多个任务同时执行,互补干扰,如上图的并行,其实和异步图例一样.但是并发就不一样了,是一个伪异步.在单核CUP中只能有一条线程,但是又想执行多个任务

iOS:转载:同步、异步、并行、串行的详解

理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21日iOSasynchronization.concurrency.GCD.iOS.serial.synchronization.串行.同步.并发.异步 iOS 开发过程中,常常需要用到多线程技术,GCD 是常用的实现多线程的技术,其因简洁底层而备受欢迎. GCD 技术中,同步(synchroniza

Quartz定时任务的并行与串行

Quartz定时任务的执行策略有并行和串行之分. 所谓并行是指多个任务同时运行的情况,即若两个任务的执行时间存在重叠,两个任务同时运行的情况. 串行则是指一个任务必须等其前一个任务执行完毕之后再执行的策略. Spring集成Quartz时,控制定时任务的并行和串行是通过concurrent(译:同时发生的; 同时完成的; 同时存在的)属性实现的. 当任务系统存在多个定时任务时,任务执行很可能会存在时间上的重叠,通过设置concurrent属性为false,可以避免任务并行执行,job只能在其前一

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dispatch_queue_t,一种先进先出的数据结构,线程的创建和回收不需要程序员操作,由队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial); 并

【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)

一.同步.异步和串行.并行 任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行. 一个同步函数只在完成了它预定的任务后才返回.一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成.因此,一个异步函数不会阻塞当前线程去执行下一个函数. (来源:http://www.cocoachina.com/industry/20140428/8248.html) 队列分为串行和并行 任务的执行分为同步和异步 -------  队列只是负责任务的调度,而不负责任

ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序它是按顺序从上往下执行的, 这个执行顺序我们可以把它看成是一条线,把这条线就叫做线程(个人理解,错了勿喷);每一个程序中至少包含一条线程, 这条线程,我们叫它主线程. 多线程:多线程也就是说一个程序中有多条执行路径.在iOS当中将一些比较耗时的操作放到另一条执行路径里.让它与主线程同时运行.这样不会

GCD网络多线程---同步执行,异步执行,串行队列,并行队列

总结:同步(不管是串行还是并行)----不开辟子线程 异步(不管是串行还是并行)----开辟子线程 GCD: dispatch queue 主线程的main queue 并行队列 global dispatch queue 串行队列serial queues 一般用于按顺序同步访问 #pragma mark - 加载多线程 - (void) _loadMutil { //GCD基于C语言 //1.主对列:(串行队列) dispatch_queue_t mainQueue=dispatch_get

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结 在GCD函数中, 我们常常碰到同步,异步,串行队列,并发队列,全局队列,主队列等概念,而这些概念又常常组合在一起, 十分头疼, 这篇文章就来梳理一下这些烦人的概念. 不想看长篇大论的, 直接看文章末尾的表格即可! 在此之前, GCD中还涉及到两个十分重要的概念, 就是任务和队列 任务(Task): 你需要执行的操作 队列(Queue): 存放任务的容器 GCD中两个重要的函数, 一个同步执行, 一个异步执行 dispatch_asyn

串行乘法与并行乘法

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 串行乘法 OR1200中串行乘法采用的是"移位--加"迭代算法,这种算法借鉴了手工计算乘法的过程,对于二进制乘法,比如:1101*1011,手工计算过程如图8.1所示. 图8.1 手工计算二进制乘法的过程 从图中可知手工计算时会将被乘数与乘数中每一位依次相乘,最后将所有的乘积项一并相加.这种方法速度快,但是用硬件实现时,会耗费较多硬件资源."移位--加"迭代算法对此作了修改:每算出一乘积项,就加到乘