同步锁

(1)自旋锁(Spinlock)
自旋锁被别的执行单元保持,调用者就一直循环,看是否该自旋锁的保持者已经释放了锁
一个单元想要访问被自旋锁保护的共享资源,就必须先得到锁,在访问结束后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,此时立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁这个操作将自旋,知道该自旋锁的保持者释放了锁
(2)读写锁(rmlock)
rmlock是内核提供的一个自旋锁的读者/写者形式,允许任意数目的读者同时进入临界区,但是写者必须是排他的
(3)RCU锁
RCU(Read-Copy Update),即读-复制修改。被RCU保护的共享数据结构,读者不需要任何锁就可以访问,但是写者在访问时,首先要复制一个副本,然后对副本进行操作,最后使用回调(callback)机制在适当时机将指向原来数据的指针重新指向新的被修改的数据

信号量

Linux内核的信号量是一种睡眠锁,当一个任务试图获得已被占用的信号量时,会进入一个等待队列,然后睡眠。当持有该信号量的进程释放信号量后,位于等待队列的一个任务就会被唤醒,这个任务获得信号量