嵌入式Linux网络体系结构设计与TCP/IP协议栈
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.2 读-写spin lock

在使用某个锁时,如果可以把操作明显地划分为只读、读写操作时,使用读-写spin lock会更有效。spin lock与读-写spin lock的区别在于:后者可以允许多个读操作同时持有锁;一次只有一个写操作可以获取锁;当写操作持有锁时,读操作不能获取锁;通常赋予读操作的优先级比写操作的优先级高,当读操作的数量大大超过写操作数量时,这种锁定机制的执行效率更高。

例如,在网络子系统中,所有表示网络设备的数据结构net_device的实例都存放在以dev_base为头指针的链表中。在系统初始化时,当我们探测到一个有效的网络适配器时,就将该网络设备的net_device实例插入到链表中,这时为写操作。在系统运行过程中,我们很少改变net_device结构变量的值,大部分操作是在dev_base链表中查找设备,获取设备属性值,这属于读操作。

对这种数据结构的访问,一定要用锁定机制来保护,但对dev_base链表的读操作在没有写操作的情况下,不需要串行等待执行,就最适合读-写spin lock锁定机制。它允许多个读操作的活动同时运行其critical section部分的代码,但一旦锁被写操作获取后,所有的活动只能等到写操作释放锁后才能访问共享数据。

当我们要向dev_base链表加入一个新的网络设备的net_device数据结构实例时,我们需要用读-写spin lock的写锁来保护dev_base链表。以下列出的函数可以用于获取和释放读-写spin lock。需要注意的是,我们要按照操作的类型(读/写)来区分锁的状态。同样,读-写锁也有处理中断和bottom half的函数,与上节所说的spin lock一样,在这里就不再重复叙述了。

    read_lock …()
    read_unlock…()
    write_lock….()
    write_unlock…()