并发
在介绍并发之前我们先介绍两个与并发相关的基础概念,即物理控制流和逻辑控制流。
物理控制流(Physical Control Flow) 就是CPU实际运行时的一系列的PC(Program Counter寄存器)值;
逻辑控制流(Logical Control Flow) 由于操作系统抽象出了进程的概念,即系统中的各个进程都仿佛在独占CPU和存储器,仿佛进程自己的指令被处理器不间断的执行,所以一个进程运行时的一系列的PC值就是一个逻辑控制流。在linux内核中最小的调度实体是线程,我们这里可以理解为一个线程就是一个逻辑控制流。逻辑控制流有很多形式,除了各个线程外,内核中还有其他逻辑控制流,比如中断处理函数、软中断、tasklet、信号响应函数等等;
并发(concurrency) 如果两个或多个逻辑控制流(logical control flow)的运行过程中在时间上有重叠,那么他们就是并发运行。如下:
如上所示,进程A和B是并发运行,进程A和C是并发运行,但是进程B和C不是并发运行,因为进程C运行的时候,进程B已经退出了,他们在时间轴上没有重叠。
现在的系统为什么都支持并发?因为逻辑控制流的并行执行可以显著提高多核系统中的整体执行速度。虽然并发会带来很多困难,但是并发是必由之路。
同步
由于操作系统中有多个逻辑控制流在同时运行,或以不确定的顺序运行,所以我们需要使用同步机制来确保程序按照我们预期的逻辑运行。常见的同步机制的类型有互斥访问(mutually exclusive access)的同步、条件成立的同步、生产者/消费者的同步等等。
互斥访问与竞争
临界区(critical section)是一个逻辑控制流中访问共享资源的一段代码,这段代码不能由多个控制流同时执行,否则会造成错误的结果。共享资源通常是一个变量、一个数据结构等等。
竞争条件(race condition)是多个逻辑控制流几乎同时进入临界区并读写访问了共享的资源,最终导致了错误的结果。
不确定性(indeterminate)是程序由一个或多个竞争条件组成,程序的输出因运行而异,具体取决于哪些逻辑控制流在何时运行。这导致结果不是确定的(deterministic),而我们通常期望计算机系统给出确定的结果。
互斥机制(mutual exclusion):为了避免竞争条件和不确定性问题,各个逻辑逻辑控制流之间要使用某种互斥(mutual exclusion)机制,即在一个控制流进入临界区后,其他控制流将被阻止进入临界区,保证只有一个控制流进入临界区,从而避免出现竞争问题。
请关注微信公众号 “Linux研习社” 获取更多技术内容: