产生原因:
由于多进程对临界资源的抢占
根本原因:
1、对于单核处理器而言,内核支持抢占就会出现竞态
2、对于多核处理器而言,是核与核的竞态
3、进程与中断间存在竞态
4、arm开发板不会出现中断与中断间的竞态(目前);NVIC支持中断的嵌套,存在中断间的竞态
解决方法:
1、中断屏蔽
2、自旋锁
3、信号量
4、互斥体
5、原子操作
1、中断屏蔽
就是关闭中断,不过关闭的时间是纳秒(ns)级的;
2、自旋锁
一个进程抢占了临界资源(上锁),别的进程会在原地等待(自旋状态),直到解锁;
特点:
1、自旋状态会消耗cpu资源
2、自旋锁会出现死锁现象(如两次上锁,一次解锁)
3、自旋锁支持进程的上下文切换,也支持中断的上下文切换(由于特点4和中断屏蔽)
4、自旋锁适用于临界资源较小的场景,锁内不能有耗时操作,也不能有copy_from/to_user此类函数(由于特点1)
3、信号量
原理类似自旋锁,但有所区别,信号量的+-来抢占临界资源,抢占不到资源的进程会进入休眠态;
特点:
1、休眠态不消耗cpu资源,但是运行态<--->休眠态的过程中会消耗cpu资源
2、信号量不会出现死锁现象
3、信号量支持进程的上下文切换,但不支持中断的上下文切换
4、不论临界资源较大或较小,信号量都适用
4、互斥体
与信号量极度相似,区别在于互斥体不是立即进入休眠态,它会等待一段时间,如果这段时间内临界资源被释放,他就不进入休眠态,不然才进入休眠态;
5、原子操作
将进程占用临界资源这个过程看作一个整体来防止竞态的出现,内部是个变量(原子变量),通过对原子变量的+-1与0比较来确定对临界资源的占用。