spinlock理解

锁理解:
1、比如自旋锁,如果一个CPU的情况:
他是指的线程运行的主体CPU或者对应的线程core在在某个线程或者进程已开始进来加锁成功后,然后CPU就在时间片内一直执行锁内部的代码操作,在时间片结束的最后一个CPU指令是中断处理,也就是需要切换CPU到其他进程或者线程,如果此时是加的自旋锁,则被切换的线程2执行到加锁位置,此时因为锁在线程1上还没有被释放,所以线程2让这个CPU继续忙等待什么都不做,拜拜浪费CPU,直到这个时间片到达过去,切换到下一个线程,同样也是白白浪费到下一个线程CPU执行周期,最终这个CPU切换到最开始那个线程,到这里可以执行接下来的程序,但是可能又被切走,这样就相当于会白白浪费很多线程上的白等待时间,看起来有死锁的味道。因此在单CPU上如果上自旋锁,则只能是CPU不听的切换(时间片到了),但是切换后还是什么都干不了,就是不停的切换不停的自旋,最终这个那个CPU在整个时间周期都在自旋,所以自旋锁不能在单个CPU上执行。
同样,如果是信号量呢,则切换到线程2时候,由于获取不到信号量,则睡眠(意思就是让出CPU,让CPU切换到其他线程的去执行)。这样CPU就很快被切换走,不会忙等待白自旋。等一会CPU在切换到线程1时候,继续执行线程1的动作,执行完成后,释放锁,切换去执行其他线程。

Spinlock可以用在中断上下文中吗?
Spinlock和中断的关系,因为一般情况下,spinlock会被一个单独的进程使用,进程拿到这个锁,然后进行临界区的修改,然后在释放锁。但是如果在这过程中存在中断发生,中断处理程序就可能会在进程正在处理持有锁的过程中被中断打断,以至于CPU被切换去处理中断的动作,此时执行的主体就是中断上下文中,此时可能存在中断上下文也会修改临界区资源,这样就没有做到临界区的互斥了。所以为了解决这个问题, spinlock支持在加锁过程中关闭中断,也就是过程中不处理本CPU上的中断,其他CPU不关系。这个接口就是spin_lock_irqsave.这样在CPU加锁执行spinlock的过程中CPU不会被中断切走执行。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章