15 同步于互斥(一) 并发、竞态和编译乱序、执行乱序
1 并发和竞态
1.1 简介
设备在运行的过程中存在多个进程对资源的并发访问
多个执行单元同时,并行的执行。并发事件对共享资源的访问(硬件资源,全局变量,静态变量等),很容易导致设备出现竞态。
竞态的出现会导致设备出现异常
1.2 单核和多核(SMP)并发下的竞态
1.3 总结
关于共享资源的这部分临界区我们需要保护起来防止多个进程同时操作;可以采用的途径为:中断屏蔽、原子操作、自旋锁、信号量、互斥体等
2 编译乱序和执行乱序
2.1 编译乱序
在使用gcc编译是使用-O0 -O1 -O2 -O3参数时编译器并不会严格按照代码逻辑去编译生成目标文件。可能导致某些未知错误。
需要注意的是此时使用volatile并能从实际上解决这个问题,因为volatile在这里的作用太弱。
volatile的作用:简而言之就是避免内存访问行为的合并。怎么理解呢?
valatile修饰的内存将会标记为易变的。如果一个值被连续访问两次,两次都是同一个值。没有volatile的修饰,编译器便会将两次读取合并为一次,显然这是不能够接受的。
2.2 执行乱序
执行乱序即在CPU中执行一个代码段时,并不一定是按照我们的理解一个一步去执行的。
如下面代码段
a = 1;
b = 2;
c = 3;
CPU可能先执行c = 3在执行a = 1;当然这个过程对单核程序是不可见的,对我们来说更是不可能感知到的。因为正过程对外不可见,那么对于SMP系统中,如果存在部分执的修改在CPU0上执行在CPU1上read那么久可能出现异常。
2.3 总结
当然内核中SMP系统中的这些问题有他自己的解决方法,这里便不展开去分析。