并行和并发的区别


前言:
现代OS都将 线程 作为最小调度单位,进程 作为资源分配的最小单位

1、并发(Concurrency)

并发的实质是一个物理CPU(也可以是多个物理CPU)在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率

  • 微观角度:所有的并发处理都有排队等候,唤醒,执行等这样的步骤,在微观上它们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行
  • 宏观角度:多个几乎同时到达的请求(或线程)在宏观上看就像是同时在被处理

通俗点讲,并发就是只有一个CPU资源,程序(或线程)之间要竞争得到执行机会。图中的第一阶段,在A执行的过程中B、C不会执行,因为这段时间内这个CPU资源被A竞争到了,同理,第二个阶段只有B在执行,第三个阶段只有C在执行。其实,并发过程中,A、B、C并不是同时在进行的(微观角度),但又是同时进行的(宏观角度)

在这里插入图片描述

2、并行(Parallelism)

Parallelism,即并行,指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源上(多核),同时执行

并行,不存在像并发那样竞争、等待的概念

3、区别

并发和并行是既相似又有区别的两个概念。并行是指两个或多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却能有一道程序执行,故微观上这些程序只能是分时地交替运行

倘若在计算机系统中有多个处理机,则可以将这些并发执行的程序分配到多个处理机上,实现并行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行

4、通过多线程实现并发、并行

  • 在CPU比较繁忙,资源不足的时候(开启了很多线程),操作系统只为一个含有多线程的进程分配仅有的CPU资源,这些线程就会为自己尽量多抢时间片,这就是通过多线程实现并发,线程之间会竞争CPU资源争取执行机会
  • 在CPU资源比较充足的时候,一个线程内的多线程,可以被分配到不同的CPU资源,这就是通过多线程实现并行

至于多线程实现的是并发还是并行?上面所说,所写多线程可能被分配到一个CPU内核中执行,也可能被分配到不同CPU执行,分配过程是操作系统所为,不可人为控制。因此如果有人问我我所写的多线程是并发还是并行的?我会说,都有可能。不管并发还是并行,都提高了程序对CPU资源的利用率,最大限度地利用CPU资源

5、异步和多线程

  • 并发:在操作系统中,是指一个时间段内有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是:同步和互斥
  • 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特征;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也就是说并发事件之间不一定要同一时刻发生
  • 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当 第一个进程没有输出时第二个进程必须等待,具有同步关系的一组并发进程相互发送的消息称为消息或事件。其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发
  • 互斥:进程间相互排斥的使用临界资源的现象,就叫作互斥
  • 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行
  • 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,再等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式,异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其他的事情

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回就可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理

6、异步和同步的区别

异步和同步的区别,在IO等待的时候,同步不会切走,浪费了时间

多线程的好处,比较容易的实现了异步切换的思想,因为异步的程序很难写的。多线程本身还是以同步完成的,但是应该说比效率是比不上异步的。而且多线程很容易写,相对效率也高

7、多线程和异步操作的异同

多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别

异步操作的本质

所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源

只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无需消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作

线程的本质

线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度

异步操作的优缺点

因为异步操作无需额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无瑕。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试

多线程的优缺点

多线程的优点很明显,线程中的处理程序依然是顺序执行 ,符合普通人的思维习惯,所以编写简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现

使用范围

当需要执行I/O操作时(IO密集型),使用异步操作比使用线程+同步I/O操作更适合,I/O操作不仅包括了直接的我呢见、网络的读写,还包括数据库操作、Web Service、HttpRequest 以及 Net Remoting 等跨进程的调用

而进程的使用范围则是那种需要长时间CPU运算的场合(CPU密集型),例如耗时较长的图形处理和算法执行

8、总结

所以并发编程的目的是充分的利用处理器的每一个核,以达到最高的处理性能

  • 单CPU中进程只能是并发,仅多CPU计算机中进程可以并行(单核不行)
  • 单CPU单核中线程只能并发,单CPU多核中线程可以并行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值