• spin_lock & mutex_lock的差别?


    本文由该问题引入到内核锁的讨论,归纳例如以下

    为什么须要内核锁?
    多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是能够訪问全部内核数据的,因此要对共享数据进行保护,即相互排斥处理

    有哪些内核锁机制?
    (1)原子操作
    atomic_t数据类型,atomic_inc(atomic_t *v)将v加1
    原子操作比普通操作效率要低,因此必要时才使用,且不能与普通操作混合使用
    假设是单核处理器,则原子操作与普通操作同样
    (2)自旋锁
    spinlock_t数据类型,spin_lock(&lock)和spin_unlock(&lock)是加锁和解锁
    等待解锁的进程将重复检查锁是否释放,而不会进入睡眠状态(忙等待),所以经常使用于短期保护某段代码
    同一时候,持有自旋锁的进程也不同意睡眠,不然会造成死锁——由于睡眠可能造成持有锁的进程被又一次调度,而再次申请自己已持有的锁
    假设是单核处理器,则自旋锁定义为空操作,由于简单的关闭中断就可以实现相互排斥
    (3)信号量与相互排斥量
    struct semaphore数据类型,down(struct semaphore * sem)和up(struct semaphore * sem)是占用和释放
    struct mutex数据类型,mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加锁和解锁
    竞争信号量与相互排斥量时须要进行进程睡眠和唤醒,代价较高,所以不适于短期代码保护,适用于保护较长的临界区
    相互排斥量与信号量的差别?(转载但找不到原文出处)
    (1)相互排斥量用于线程的相互排斥,信号线用于线程的同步
    这是相互排斥量和信号量的根本差别,也就是相互排斥和同步之间的差别
    相互排斥:是指某一资源同一时候仅仅同意一个訪问者对其进行訪问,具有唯一性和排它性。但相互排斥无法限制訪问者对资源的訪问顺序,即訪问是无序的
    同步:是指在相互排斥的基础上(大多数情况),通过其他机制实现訪问者对资源的有序訪问。在大多数情况下,同步已经实现了相互排斥,特别是全部写入资源的情况必然是相互排斥的。少数情况是指能够同意多个訪问者同一时候訪问资源
    (2)相互排斥量值仅仅能为0/1,信号量值能够为非负整数
    也就是说,一个相互排斥量仅仅能用于一个资源的相互排斥訪问,它不能实现多个资源的多线程相互排斥问题。信号量能够实现多个同类资源的多线程相互排斥和同步。当信号量为单值信号量是,也能够完毕一个资源的相互排斥訪问
    (3)相互排斥量的加锁和解锁必须由同一线程分别相应使用,信号量能够由一个线程释放,还有一个线程得到
  • 相关阅读:
    Android studio导入开源项目
    使用Kindeditor上传图片
    IOS实现自动循环滚动广告--ScrollView的优化和封装
    Android开发之Drag&Drop框架实现拖放手势
    IOS中的手势详解
    Android实现图片轮显效果——自定义ViewPager控件
    IOS欢迎界面Launch Screen动态加载广告
    tomcat 启动参数 Xms, Xmx, XX:MaxNewSize, XX:PermSize, -XX:MaxPermSize, Djava.awt.headless
    PHP提升echo, printf, print, file_put_contents等输出方法的效率
    WIN7下强制分第四个主分区的方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4219691.html
Copyright © 2020-2023  润新知