并发编程

什么是并发?并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中的耗时任务以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善。现代的PC都有多个CPU或一个CPU中有多个核。是否能合理运用多核的能力将成为一个大规模应用程序的关键。

所谓并发编程是指在一台处理器上“同时”处理多个任务。它的主要目标是充分的利用处理器的每一个核,以达到最高的处理性。

 

1. 并发编程产生原因

在早期的计算机中不包含操作系统,它们从头到尾只可以运行一个程序。操作系统的出现使得计算机每次都能运行多个程序,并且不同的程序都在单独的进程中运行。

在计算机的操作系统来实现多个程序的同时执行,主要是基于下面几个原因:

1) 资源利用率

在某些情况下,程序必须等待某个外部操作执行完成,而等待时程序无法执行其他任何工作。因此,如果在等待同时可以运行另一个程序,那么无疑将提高资源的利用率。

2) 公平性

不同的用户和程序对于计算机上的资源有着同等的使用权。一种高效的运行方式是通过时间分片使用户和程序可以共享计算机资源,而不是一个程序从头运行到底,再启动下一个程序。

3) 便利性

通常来说,在计算多个任务时,应该编写多个程序,每个程序执行一个任务并在必要时相互通信,这比只编写一个程序来计算所有任务更容易实现。

 

2. 并发编程的重要概念

1) 并发与并行

并发和并行是十分容易混淆的概念。并发指的是多个任务交替进行,而并行则是指真正意义上的 “同时进行”。实际上,如果系统内只有一个CPU,而使用多线程时,那么真实系统环境下不能并行,只能通过切换时间片的方式交替进行,而成为并发执行任务。真正的并行也只能出现在拥有多个CPU的系统中,或者运行在不同的设备上,它们共同完成一项任务。

2) 临界区

临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每个线程使用时,一旦临界区资源被一个线程占有,那么其他线程必须等待。

3) 阻塞和非阻塞

阻塞和非阻塞通常用来形容多线程间的相互影响,比如一个线程占有了临界区资源,那么其他线程需要这个资源,就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞,而非阻塞就恰好相反,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。

4) 同步和异步

同步和异步通常用来形容一次方法调用。同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。比如,在超市购物,如果一件物品没了,你得等仓库人员跟你调货,直到仓库人员给你把货物送过来,你才能继续去收银台付款,这就类似同步调用。而异步调用了,就像网购,你在网上付款下单后,什么事就不用管了,该干嘛就干嘛去了,当货物到达后你收到通知去取就好。

什么是竞态条件?竞态条件是指多个进程(线程、协程)读写某些共享数据,而最后的结果取决于进程运行的准确时序。也就是当多个进程(线程、协程)竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。在一般的操作系统中,不同 ...