- 论坛徽章:
- 0
|
下面的同步讨论假设只是在单CPU系统上(可抢占)
在单CPU系统上内核同步机制spin_lock代码如下:
#define spin_lock(lock) _spin_lock(lock)
#define _spin_lock(lock) __LOCK(lock)
#define __LOCK(lock) \
do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
可见在单CPU系统上加锁操作只是做了一个禁止抢占操作.
下面我有两个疑问:
1: 假设进程A正在访问临界区D,此时系统来了一个IRQ将任务B唤醒;A任务被抢系统执行任务B,如果此时任务B
也访问临界区D ,这算是竞争吗?
在单CPU系统中,从微观上来说,在某时刻系统只能执行一个任务,如果上面的问题不算竞争,那么对单CPU系统来说
访问内存资源是不可能出现竞争的,也就不需要任何加锁操作。
2:接着1的问题,如果上面情况不算是竞争, 那么在加锁操作为什么要preempt_disable()?
对于SMP系统加锁需要preempt_disable()禁止抢占还可以理解(为了提高SMP系统效率, 如果A核上的一个a进程正在访问临界区
此时a任务被抢占,,如果此时B核上的b任务正在忙等待锁 ,此时系统效率就会降低;如果禁止抢占的话 a任务就不会被抢占,从而可以
很快的释放锁.)
但是对于单CPU来说同一时刻不可能有两个任务同时在运行,所以这里禁止抢占是什么意思? |
|