问题:什么是并发?什么是并行?
-
并发:在操作系统中,在一段时间内有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。
也就是说在 单CPU的计算机中,我们看起来“同时做的多件事情”,其实只是通过CPU的时间片技术并发完成的。比如用户感觉在“同时“听歌和打游戏,其实只是并发执行,非真的同时执行。并发是会抢占资源的 -
并行:并行(Parallel),当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
有一个很重要的点,那就是系统要有多个CPU才会出现并行。在有多个CPU的情况下,才会出现真正意义上的『同时进行』。
问题:并发与并行的区别?
并发:指的是多件事情,在同一个时间段内同时发生
并行:指的是多件事情,在同一时间点上同时发生
并发的多个任务之间是互相抢占资源的。
并行的多个任务之间是不互相抢占资源的。
只有在多CPU的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。
问题:在并发编程时,使用多线程一定快吗?
-
使用多线程时,对于线程的上下文切换等会很大的消耗性能,消耗时间
并发编程艺术第一章-上下文切换 -
资源限制问题时,不一定多线程的执行速度会快。
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。例如,服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不仅不会加快执行,反而会更慢,因为增加了上下文切换和资源调度的时间。
比如在实现网络资源的断点续传的过程中,网络的带宽资源是固定,但是我们通过将资源进行切分为不同大小的任务,启动多线程下载,由于网络会存在阻塞情况,在网络阻塞的时候,会启动 tcp网络传输的拥塞控制机制,多线程的优势就体现出来了,因为你的多线程会让这个速度减速没有那么猛烈,毕竟这时可能有另一个线程正处在慢启动的在最终加速阶段,这样总体的下载速度就优于单线程了。
具体参考 断点续传实现
对于硬件资源限制,可以考虑使用集群并行执行程序。既然单机的资源有限制,那么就让程序在多机上运行。比如使用ODPS、Hadoop或者自己搭建服务器集群,不同的机器处理不同的数据。可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这笔数据。
对于软件资源限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和Socket连接复用,或者在调用对方webservice接口获取数据时,只建立一个连接。