Atitit 锁的不同层级 app锁 vm锁 os锁 硬件锁

目录

1. 在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制 1

1.1. test and set指令 1

1.2. 锁内存总线 1

1.3. Cas 原子操作 2

2. Os的锁 2

2.1. mutex(互斥锁)、 2

2.2. 原子操作、信号量(semaphore)、 3

2.3. 自旋锁spin_lock 3

2.4. BKL(Big Kernel Lock) 3

2.5. 顺序锁 3

3. Vm的锁 4

3.1. monitor锁 调用os锁 4

3.2. 可以使用队列实现锁 纯软件锁 4

4. 3. 硬件上怎么实现的 4

  1. 在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制

    1. test and set指令

既然只有中断才能把上锁过程打断,造成多线程操作失败。我先关中断不就得了,在加锁操作完成后再开中断。
2、上面这个手段太笨重了,能不能硬件做一种加锁的原子操作呢?能,大名鼎鼎的“test and set”指令就是做这个事情的。(怎么,test and set是干什么的?同学,看来你上课时不够专心啊,赶紧回头复习复习)

  1. 锁内存总线

通过上面的手段,单核环境下,锁的实现问题得到了圆满的解决。那么多核环境呢?简单嘛,还是“test and set”不就得了,这是一条指令,原子的,不会有问题的。真的吗,单独一条指令能够保证该指令在单个核上执行过程中不会被中断打断,但是两个核同时执行这个指令呢?。。。我再想想,硬件执行时还是得从内存中读取lock,判断并设置状态到内存,貌似这个过程也不是那么原子嘛。对,多个核执行确实会存在这个问题。怎么办呢?首先我们得明白这个地方的关键点,关键点是两个核会并行操作内存而且从操作内存这个调度来看“test and set”不是原子的,需要先读内存然后再写内存,如果我们保证这个内存操作是原子的,就能保证锁的正确性了。确实,硬件提供了锁内存总线的机制,我们在锁内存总线的状态下执行test and set操作,就能保证同时只有一个核来test and set,从而避免了多核下发生的问题。

  1. Cas 原子操作
  1. Os的锁

在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制;OS基于这几个CPU硬件机制,就能够实现锁;再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等等等等)。所以要想理解OS的各种同步手段,首先需要理解本文介绍的内容,这时最原点的机制,所有的OS上层同步手段都基于此。

在基于锁,就能实现各种各样的同步机制(信号量、消息等等)

  1. mutex(互斥锁)、

 互斥锁主要用于实现内核中的互斥访问功能。内核互斥锁是在原子API之上实现的,但这对于内核用户是不可见的。对它的访问必须遵循一些规则:同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。互斥锁不能进行递归锁定或解锁。一个互斥锁对象必须通过其API初始化,而不能使用memset或复制初始化。一个任务在持有互斥锁的时候是不能结束的。互斥锁所使用的内存区域是不能被释放的。使用中的互斥锁是不能被重新初始化的。并且互斥锁不能用于中断上下文。但是互斥锁比当前的内核信号量选项更快,并且更加紧凑,因此如果它们满足您的需求,那么它们将是您明智的选择。

  1. 原子操作、信号量(semaphore)、

读写信号量(rw_semaphore)、spinlock

  1. 自旋锁spin_lock
  2. BKL(Big Kernel Lock)

BKL即全局内核锁,也称大内核锁,它是一个全局自旋锁。

  1. 顺序锁

  顺序锁为写者赋予更高的优先级,写者永远不会等待读者。缺点是读者有时不得不读多次数据以获取正确的结果。

  顺序锁的数据结构中除了有spinlock外,还有一个顺序号。如果成功获得锁,顺序锁的顺序号会加1,以便读者能够检查出是否在读期间有写者访问过。读者在读取数据前后两次读顺序值,如果两次值不相同,则说明读取期间有新的写者操作过数据了,那么本次读取就是无效的。

  1. Vm的锁

    1. monitor锁 调用os锁
    2. 可以使用队列实现锁 纯软件锁

Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。

  1. 3. 硬件上怎么实现的

前面提到,cpu会通过对总线加锁的手段来解决多核同时获取锁的情况,它到时是怎么实现的呢? 在cpu芯片上有一个HLOCK Pin,可以通过发送指令来操作,将#HLOCK Pin电位拉低,并持续到这条指令执行完毕,从而将总线锁住,这样同一总线上的其他CPU就不能通过总线来访问内存了。最开始这些功能是用来测试cpu的,后来被操作系统实现而封装成各种功能:关键代码段,信号量等。

Ref

linux内核锁机制 - 全文 - 嵌入式操作系统 - 电子发烧友网

Atitit 锁的不同层级 app锁 vm锁 os锁 硬件锁 目录 1. 在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制 1 1.1. test and set指令 1 1.2. 锁内相关推荐

  1. Android 10.0 app添加校验锁(输入密码才能进入app)

    1.概述 最近有客户有需求要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Lau ...

  2. jc机制是什么_单片机中jc指令表示什么?有什么用?

    展开全部 JC是判断C进位标志是否为1,为1则跳转到指定位置. JC指令判断有借位则转移,也就是说两数相62616964757a686964616fe78988e69d8331333433656133 ...

  3. Bochs调试Linux内核初级入门2、bochs调试断点和单步指令、0x7c00、关中断和开中断指令

    前文见此: https://blog.csdn.net/bcbobo21cn/article/details/105314444 修改run.bat为:"C:\Program Files ( ...

  4. 一款基于安卓的观看漫画的app,有漫画排行榜、漫画目录、收藏夹、历史记录、漫画搜索、更新推送服务等

    Android项目分享:漫画app 项目介绍 一款基于安卓的观看漫画的app,有漫画排行榜.漫画目录.收藏夹.历史记录.漫画搜索.更新推送服务等 仓库地址 因为代码较多,有将近10000行代码,不能放 ...

  5. Atitit 通过教育提升阶层 不同阶层的不同教育专业分类 目录 1. 顶层婆罗门教育专业 1 1.1. 价值观教育 意识形态 宗教 (哲学 教育学 ) 1 1.2. (11)法学 管理学 公

    Atitit 通过教育提升阶层 不同阶层的不同教育专业分类 目录 1. 顶层婆罗门教育专业 1 1.1. 价值观教育 意识形态  宗教 (哲学   教育学 ) 1 1.2. (11)法学 管理学 公共 ...

  6. Zabbix3.2下Template App Zabbix Server+Template OS Linux Item学习记录

    就是Zabbix server默认的78个Item学习记录,返回值是在我自己的虚拟机上通过zabbix_get或者zabbix_agentd获取的,zabbix internal check的item ...

  7. C语言的变量和汇编中的伪指令,伪指令 尤其EQU DW DB(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪指令是在微机标准版基础上修改的版

    微机原理中表明 变量用伪指令DW,DB 单片机中的伪指令EQU C语言中的变量来源与汇编的伪指令(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪 ...

  8. html5调用安卓锁屏,HTML5实现APP永不锁屏

    用HTML5做一个APP的时候,需要做一个永不锁屏的功能.然后去设置手机的时候发现手机并不能设置永不锁屏,所以就只能在程序里面设置. 想一下,手机永不锁屏的情况有那些?第一个想到的就是看电影的时候了, ...

  9. mysql中的锁的指令_mysql中的锁

    MYSQL不同的存储引擎支持不同的锁的机制 MyISAM 支持表锁,InnoDB支持表锁和行锁 表锁,行锁比较 表锁:开销小,加锁快:不会出现死锁:锁定力度大,发生锁冲突概率高,并发度最低 行锁:开销 ...

  10. 120帧手机动态壁纸_热门动态壁纸主题锁屏墙纸精选app下载-热门动态壁纸主题锁屏墙纸精选最新版下载v6.2...

    热门动态壁纸主题锁屏墙纸精选这款软件将会为用户们提供更多高清精美的壁纸,多种风格分类让你肆意挑选,超多热门的动态壁纸可以让用户们自由选择,为你带来更加个性化的手机桌面.还可以将自己喜欢的视频进行上传, ...

最新文章

  1. 中国信通院:2019年Q1全球人工智能产业数据报告
  2. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)
  3. 赵雅智:service_startService生命周期
  4. java final 内存泄漏_干货详解:一文教你如何避免内部类中的内存泄漏
  5. js双通信java,js和java的http通信
  6. 李萍matlab实验报告,李萍, 张磊, 王垚廷. 基于Matlab的偏微分方程数值计算[J]. 齐鲁工业大学学报, 2017, 31(4): 39-43....
  7. 【李宏毅2020 ML/DL】P10 Classification_1 | 简单的例子告诉你使用 wx+b 以及 Sigmoid 作为激活函数的合理性
  8. The Introduction Of Filter
  9. 想要快速扒谱?快来掌握这些小技巧吧!
  10. SlickEdit配置保存路径
  11. ubuntu笔记本gpu温度太高解决办法
  12. 数据分析师成长之路-软件篇
  13. Zint生成二维码及png操作
  14. 网络原理考试到ADSL上网原理
  15. Android EditText 只能输入数字
  16. [1927-2011][影片][历届奥斯卡最佳影片合集][全82部]
  17. Activity重建之殇
  18. 我的MSN机器人终于有了自己的头像
  19. Qt Creator 运行LVGL模拟器
  20. 小程序、APP、企业网站开发工具有哪些?如何使用软件开发工具?

热门文章

  1. oracle不完全恢复类型,Oracle——不完全恢復
  2. 用虚表和虚表指针实现动态绑定
  3. MYSQL 表左连接 ON AND 和ON WHERE 的区别
  4. 提问的智慧 程序员成长之路
  5. 解决ssh登录Host key verification failed
  6. 解压文件--linux
  7. 用php的ob_start()控制浏览器cache
  8. 关于shiro使用心得
  9. Uva 12563 - Jin Ge Jin Qu(01背包)
  10. Linux用awk处理文本数据