• 互斥锁与自旋锁


    互斥锁

    假如在一个多核CPU中,coreA运行的A线程通过调用pthread_mutex_lock去获得一个临界区的互斥锁,然后coreB中运行的B线程也调用pthread_mutex_lock去获取互斥锁,B线程就会被阻塞,coreB就会执行上下文切换,把B线程调度到等待队列中,然后coreB就可以继续调度执行位于就绪队列中的其他线程。

    互斥锁适合用在持锁时间比较长的操作,如:
    1 临界区有IO操作
    2 临界区代码复杂或者循环量大
    3 临界区竞争非常激烈
    4 单核处理器

    自旋锁

    线程A调用pthread_spin_lock去获取自旋锁,然后线程B也调用pthread_spin_lock去获取自旋锁,线程B就会一直循环不停的进行获取锁请求(消耗CPU资源),直到得到这个锁为止。

    自旋锁适合用在临界区持锁时间非常短且CPU资源不紧张的情况下,自旋锁一般用于多核的服务器。

    自旋锁在单核非抢占式CPU上是无效的.被设为空操作,不做任何事。

    自旋锁有几个重要的特性:
    1、被自旋锁保护的临界区代码执行时不能进入休眠。
    2、被自旋锁保护的临界区代码执行时是不能被被其他中断中断。
    3、被自旋锁保护的临界区代码执行时,内核不能被抢占。
    从这几个特性可以归纳出一个共性:被自旋锁保护的临界区代码执行时,它不能因为任何原因放弃处理器。

    linux上的自旋锁有三种实现:

    1. 在单cpu,不可抢占内核中,自旋锁为空操作。
    2. 在单cpu,可抢占内核中,自旋锁实现为“禁止内核抢占”,并不实现“自旋”。(注意)
    3. 在多cpu,可抢占内核中,自旋锁实现为“禁止内核抢占” + “自旋”。

    引用:自旋锁死锁
    引用:互斥锁与自旋锁的区别

  • 相关阅读:
    DOM增删改替换
    DRF框架之序列化器serializers组件详解
    DRF基础操作流程
    DRF框架基础知识储备
    selectors模块
    并发编程——IO模型详解
    高性能web服务器——nginx
    Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?
    使用cors完成跨域请求处理
    Flask基础
  • 原文地址:https://www.cnblogs.com/gitfong/p/13799052.html
Copyright © 2020-2023  润新知