新的排队spin_lock--有序和无序

2.6.25内核实现了新的自旋锁,叫做ticket spin_lock,ticket就是排队的意思,就像看电影时拿着票有序入场一样,新的自旋锁不再是乱抢自旋锁了,而是有序地获得自旋锁,这样就消除了一些不必要的混乱。这样做的初衷是什么呢?首先看看自旋锁的意义,它是一种十分高效的锁,得不到锁的时候不是睡眠而是自旋,自旋就是忙等,这样就免去了睡 眠-切换-唤醒-切换的开销,毕竟一个进程睡眠必然导致一次硬切换,而唤醒仍然需要一次硬切换。但是在忙等期间,cpu实际上没有做什么有意义的事情,这 是一点小小的弊端,但是任何事必须图一方面,和睡眠-切换-唤醒的开销比起来,这么做是十分有意义的。另外要明白的是,当前实现的自旋锁的争抢实体实际上 是cpu,而不是进程,在单cpu的非抢占内核上,自旋锁是不必要的,在单cpu的抢占内核,自旋锁实际就是禁用了抢占而已,只有在多cpu的环境下,自旋锁作为锁的意义才真正存在,所以我们说是cpu获得了自旋锁而不是别的。要了解新自旋锁的意义还要了解老自旋锁的实现。老的自旋锁是一个整数,在cpu 企图获得锁的时候要将此数减一,然后看看是否为0,如果为0,那么就获得了锁,如果为负数就说明别的cpu比此cpu先获得了锁,然后此cpu进入忙等, 等待占有锁的cpu释放锁从而将锁置为1,然后它再次将其减一后与0比较。这么实现可以看出,一个cpu企图获得锁时所探测到的锁的值是负数并且绝对值越大,那么就有越多的cpu在争抢这个自旋锁,这看起来没有问题,就像踢足球一样,那么多人抢一个球,但是足球有个人技术,团队合作在里面,有输有赢的结果,而自旋锁就不一样了,所有的cpu要公平竞争,没有团队,没有个人技术,但是这个实现真的就很公平吗?如果不考虑硬件告诉缓存,那么它可能还是比较公平的,但是几乎每个cpu都有硬件高速缓存,如果一个cpu得到了自旋锁那么信息就会被读入该cpu的缓存行,后来它释放了这个自旋锁,但是马上它又去争 抢同一个锁,这样这个cpu对于别的cpu就是不公平的,它再次得到自旋锁的可能性要比别的cpu要大,因此,老的自旋锁实现方案看似公平实际不公平,按道理应该让等待时间最长的cpu获得自旋锁。要得到这样的效果,改进点已经很明确了,就是增加一个队列,这个队列的元素按照等待时间排队,数据结构也很简单,增加一个list_head字段即可,如果这么实现当然比较好,比较规则,比较规范,但是不是那么艺术和高效,于是新的ticket自旋锁由运而生。
以上从理论角度阐述了老的自旋锁的实现,下面看一下具体的代码,主要是纯粹的获得锁和释放锁的代码,不再讨论开关抢占的内容:

#define spin_lock_string /

你可能感兴趣的:(数据结构,linux,windows,String,扩展,linux内核)