并发和并行的概念区分

就当前计算机的技术来讲,目前大部分的语言能够满足并发执行,但是现在的多核cpu或者多cpu下开始产生并行的概念。

 

总体概念:

在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。 

 

并发编程:

 "并发"在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行。
  使用多个线程可以帮助我们在单个处理系统中实现更高的吞吐量,如果一个程序是单线程的,这个处理器在等待一个同步I/O操作完成的时候,他仍然是空闲的。在多线程系统中,当一个线程等待I/O的同时,其他的线程也可以执行。
  这个有点像一个厨师做麻辣鸡丝的时候同时做香辣土豆条,总比先做麻辣鸡丝再做香辣土豆条效率要高,因为这样可以交替着做。
  上面这总情况是在单处理器(厨师)的系统处理任务(做菜)的情况,厨师只有一个,他在一个微观的时间点上,他只能做一件事情,这种情况就是虽然是多个线程,但是都是在同一个处理器上运行。
  但是多线程并不能一定能提高程序的执行效率,比如,你的项目经理给你分配了10个bug让你修改,你应该会一个一个去改,一般的人不会每个bug去改5分钟,知道改完为止,如果这样的话,上次改到什么地方都记不得了。在这总情况下并发并没有提高程序的执行效率,反而因为过多的上下文切换引入了一些额外的开销。

因此在单cpu下只能实现程序的并发,但是无法实现程序的并行。

 

现在cpu到了多核的时代,那么就出现了新的概念:并行。

并行是真正的细粒度上的同时进行;既同一时间点上同时发生着多个并发;更加确切并且简单的来讲:就是每个cpu上运行一个程序,以达到同一时间点上每个cpu上运行一个程序。

 

总结,计算机的计算原理是顺序执行的;既一台计算机同一时间点上只能完成一个运算;既然突破不了这个理论基础,那么就在其基础上去发展去:为一台计算机内置多个cpu,这样就可以达到真正意义上的并行。

 

就目前来讲,硬件上已经到来了多cpu的时代,软件技术上已经开始跟进并行,比如java已经开始在新的虚拟机上加入并行。但是就当前来讲,并发编程还是主流的。那么什么情况下去使用并发编程呢?

 

比如,你有一个计算,包括cpu的计算,网络的传输,数据库的访问,io的操作,如果不采用并发,而是单线程执行,那么cpu计算结束,程序还需要等待接下来步骤的彻底完成,才算一次执行完毕。如果在执行的过程中,又有新的访问到来,那么就需要等待上一次的执行彻底完成,才能开始本次的访问。这样从很大程度上浪费了cpu的资源;如果采用并发编程,既线性编程,那么上面的过程就得这样描述了:一次请求完成cpu计算之后,开始等待剩余步骤的执行;而下一次的请求也可以先完成cpu的计算,进入剩余步骤状态;这样从很大程度上提高了程序的执行效率,也提高了cpu的利用率,充分的利用了cpu的计算资源。

 

因此,如果你的程序是只进行cpu的计算就over,那么采用线性编程就得不偿失,因为cpu一次只能完成一次计算,如果将一次正在进行的计算挂起,开始一个新的计算,新的计算进行一半,又被挂起,回头执行上次的计算;大家从现实当中就可以考虑一下:一个学生在同一时间,是只能做一门功课的,当前正在做语文作业,做了一些之后放下,开始做数学,那么这时还得打开数据作业本,整理思路,找到老师布置的科目等,然后开始做;然后做了一半,又放下开始做剩余的语文作业。。。。。。不用再描述下去了吧?所以,只进行cpu计算的程序,是不需要多线程的。而如果程序包括多个执行步骤,而其中的某一个步骤比较耗时,程序想将一次计算完毕,需要等待耗时的操作返回,这个时候就得考虑线性编程了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值