Linux内核锁的类型01

159次阅读
没有评论

共计 1965 个字符,预计需要花费 5 分钟才能阅读完成。

Linux内核中锁的类型

当多个进程或者线程使用共享资源时,总会不可避免地发生冲突,为了控制对共享资源的访问,因此设计了锁,防止并发引起的系统问题。大概总结了如下几种锁的类型。

  • 原子操作:就是该操作绝不会在执行完毕前被任何其他任务或事件打断,这个需要硬件的支持使用汇编语言实现的。主要用于资源计数。

  • 信号量

    • 内核信号量
    • 用户态信号量
    • POSIX 信号量:一个正整数,
    • System V IPC信号量:一个或多个信号量
    • 信号量初始化为1,代表互斥锁,如果一个调用者持有这个信号量,那么别的调用者只能挂起等待。
  • 读写信号量(rw_semaphore):对访问者进行细分,分为读者和写者,写者是排他独占的

    • 如果一个读写信号量被写者占有,其他写者或者读者都必须挂起,直到写者释放信号量
    • 一个读写信号量同时拥有的读者数量不受限制,可以同时拥有多个读者
    • 适合读多写少的情况使用,在linux内核中对进程的内存映像描述结构的访问就使用了读写信号量进行保护。
  • 自旋锁(spin lock):自旋锁不会引起调用者睡眠,如果自旋锁已经被别的单元持有,调用者循环等待,持有者释放锁,“自旋”一词,因此得名。因为自旋锁一般持有者只占有很短的时间,因此选择自选而不是睡眠,效率比互斥锁要高。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。在获取自旋锁前需要禁止抢占,这样为了防止被调度出去,让出CPU。

    • 读写锁(rwlock) 也是一种特殊的自旋锁,读写分明的情况
    • 大读者锁(brlock-Big Reader Lock) 读写锁高性能版,但是只存在2.4内核中,2.6就已经没有了。读者可以非常快地获得锁,但写者获得锁的开销比较大。这种锁适合于读多写少的情况,它在这种情况下远好于读写锁。
  • 大内核锁 Big Kernel Lock(BKL)(大内核锁),全局唯一,保护内核的大锁,可以递归调用,用于比米娜多个处理器上的进程同时访问同一区域。:在内核入口处安装一把‘巨大’的锁,一旦一个处理器进入内核态就立刻上锁,其它将要进入内核态的进程只能在门口等待,以此保证每次只有一个进程处于内核态运行。这把锁就是大内核锁。有了大内核锁保护的系统当然可以安全地运行在多处理器上:由于同时只有一个处理器在运行内核代码,内核的执行本质上和单处理器没有什么区别;而多个处理器同时运行于进程的用户态也是安全的,因为每个进程有自己独立的地址空间。鸡肋

  • RCU(Read-Copy Update),顾名思义:读-拷贝更新,它是基于原理命名的。

    • 被RCU保护的共享数据结构,读者不需要获取任何锁就可以访问,但是写者需要等待所有CPU读者退出临界区,才能将修改后的数据写回,实际上是一种改进的rwlock读写锁,虽然读者没有同步开销,但是写者存在同步开销。因为如果写比较多时,对读者的性能提高不能弥补写者导致的损失。
    • 绝大部分为读而只有极少部分为写的情况下,它是非常高效的,因此在路由表维护、系统调用审计、SELinux的AVC、dcache和IPC等代码部分中,使用它来取代rwlock来获得更高的性能。但是,它也有缺点,延后的删除或释放将占用一些内存,尤其是对嵌入式系统,这可能是非常昂贵的内存开销。此外,写者的开销比较大,尤其是对于那些无法容忍旧数据的情况以及不只一个写者的情况,写者需要spinlock或其他的锁机制来与其他写者同步。
  • 顺序锁(seqlock):顺序锁也是对读写锁的一种优化,对于顺序锁,读者绝不会被写者阻塞,也就说,读者可以在写者对被顺序锁保护的共享资源进行写操作时仍然可以继续读,而不必等待写者完成写操作,写者也不需要等待所有读者完成读操作才去进行写操作。但是,写者与写者之间仍然是互斥的,即如果有写者在进行写操作,其他写者必须自旋在那里,直到写者释放了顺序锁。这种锁有一个限制,它必须要求被保护的共享资源不含有指针,因为写者可能使得指针失效,但读者如果正要访问该指针,将导致OOPs

    • 如果读者在读操作期间,写者已经发生了写操作,那么,读者必须重新读取数据,以便确保得到的数据是完整的。
      这种锁对于读写同时进行的概率比较小的情况,性能是非常好的,而且它允许读写同时进行,因而更大地提高了并发性。
    • 因为在读写分明、且读多写少写优先的场景下,使用seqlock可以避免写操作被阻塞。
正文完
 
landery
版权声明:本站原创文章,由 landery 2023-08-15发表,共计1965字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)