自旋锁spinlock

spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令.
当某个CPU锁住数据总线后, 它读一个内存单元(spinlock_t)来判断这个spinlock 是否已经被别的CPU锁住. 如果否, 它写进一个特定值, 表示锁定成功, 然后返回. 如果是, 它会重复以上操作直到成功, 或者spin次数超过一个设定值. 锁定数据总线的指令只能保证一个机器指令内, CPU独占数据总线.
单CPU当然能用spinlock, 但实现上无需锁定数据总线.

spinlock在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候spinlock会让其它process动不了.

自旋锁是一种保护数据结构或代码片段的原始方式,
在某个时刻只允许一个进程访问临界区内的代码。

一般spinlock实现会有一个参数限定最多持续尝试次数. 超出后, spinlock放弃当前time slice. 等下一次机会.

用户空间, 应当是进程内只允许一个线程访问临界区内的代码.
内核进程共享地址空间, 进程之间互斥是没错.

有三果问题不清楚
1,单CPU内核中,假设好几个内核线程用spinlock共享一块数据,一个时间只有一个线程得到锁,那是不是其它没有得到锁的线程都在疯狂的自旋中?

2,内核里似乎到处都有spinlock,在单CPU系统下spinlock主要用来做什么呢?也能用来当数据同步的锁来用?

3,用户空间有spinlock吗?

1. Yes. 但spinlock只适用于short lock.

2. 单CPU, 或SMP, 都是同步锁

3. Yes


1. 通常如果一个线程没有得到锁会调用 sleep() 或者 yield() 之类的函数让调度器重新进行调度,不会疯狂自旋的。

2. 自旋锁是一种很低级的操作,是为了实现资源的互斥而不是同步,在单 CPU 中其实可以用关闭中断的方法代替自旋锁,在多 CPU 中自旋锁必须要实现,这如前面一个朋友所说的,自旋锁需要锁总线,你可以查看 X86 的 lock 指令和 compare and exchange 指令或者 test and set 指令得到更多的信息。

3. 通常在用户空间不使用自旋锁,在用户空间通常使用 Mutex 互斥,Semaphore 同步。自旋锁有可能用于实现 Mutex 和 Semaphore.

你可能感兴趣的:(数据结构,Semaphore,Exchange,X86)