![](https://csdnimg.cn/release/download_crawler_static/87135443/bg8.jpg)
就不能使用(例如,task spinlock 默认表现为 task lock)。
由于 SMP 系统的特殊性,因此 SMP 编程需要特别注意,尤其是在互斥/同步机制上,
在使用的时候需要充分考虑如何提高系统的性能。在 VxWorks SMP 系统中针对每个 CPU
都有一个 idle 任务,这在 UP 中是没有的。Idle 任务是最低优先级(用户级任务是不能达到
这么低优先级的)。当 CPU 进出 idle 状态时,idle 任务会提供任务上下文,这可以用来监视
CPU 的利用率情况。
当 CPU 无事可做时,Idle 任务的存在不会影响 CPU 进入睡眠状态(当电源管理开启
时)。
可以使用 kernelIsCpuIdle()或者 kernelIsSystemIdle()这两个 API 查看一个指定 CPU 是否执行
了 idle 任务或者所有 CPU 是否执行了 idle 任务。
【注意】不要对 idle 任务进行挂起、关闭、跟踪、改变优先级等一系列操作。
SMP 的互斥/同步机制
SMP 编程与 UP 编程最大的一个不同就是互斥/同步 API 的使用。有一些 API 在这两种
编程中都可以使用,而有一些则不同。此外,UP 编程中的一些隐式同步技巧(例如使用任
务优先级替代显示同步锁等)在 SMP 中是不能用的。
与 UP 系统不同,SMP 系统允许真正意义上的同时执行。即多个任务或多个中断可以同
时执行。在绝大多数情况下,UP 系统中与 SMP 系统中的互斥/同步机制(例如,信号量、
消息队列等)是一样的。
但是,UP 中的一些机制(例如,关中断、挂起任务抢占机制以此来保护临界资源等)
在 SMP 中是不适用的。这是因为这些机制阻碍了同时执行的理念,降低了 CPU 的利用率,
是的 SMP 系统向 UP 系统的回溯。
SMP 编程与 UP 编程的一点不同是关于 taskLock()和 intLock()的使用上。SMP 提供了以
下互斥/同步锁机制进行替代:
a. 任务级、中断级的 spinlock;
b. 任务级、中断级的 CPU-specific;
c. 原子操作;
d. 内存障碍(memory barrier)
7. spinlock 互斥/同步机制
在 UP(单核)编程中通过信号量的方法可以实现 task 的互斥与同步,在 SMP 系统中
可以继续沿用信号量的机制,而 spinlock 则用于替换 UP 编程中使用 taskLock()和 intLock()
的地方。
简介
taskLock()
和
intLock()
通过
taskLock()
可以关闭系统的任务调度机制,调用
taskLock()
的任务将是唯一获得
CPU
运行资源的任务,直到这个任务调用
taskUnlock()
为止。
intLock()
与
taskLock()
类似,
intLock()
用于关闭中断,使得中断
IRS
无法执行,直到调用者调用了
intUnlock()
。
Spinlock 具有“满内存障碍”属性