操作系统学习笔记 原来自旋锁还可以这样实现!

在java中我们知道对线程使用CAS(compare and swap)来实现自旋锁,在没有学习操作系统之前,我以为这是唯一一种方法了。但是今天学到了操作系统中的同步互斥,终于明白了原来CAS、TS、Swap这些都是硬件提供的原子操作罢了!不仅CAS可以实现自旋锁,TS(Test and Set)同样可以!

临界区

  • 临界区

进程中访问临界资源的一段需要互斥执行的代码

  • 进入区

    • 检查可否进入临界区的一段代码
    • 如可进入,设置相应“正在访问临界区”标志
  • 退出区

    • 清楚“正在访问临界区”标志
  • 剩余区

    • 代码的剩余部分

临界区的访问规则

  • 空闲则入
    • 没有进程在临界区时,任何进程可进入
  • 忙则等待
    • 有进程在临界区时,其他进程均不能进入临界区
  • 有限等待
    • 等待进入临界区的进程不能无限期等待
  • 让权等待(可选)
    • 不能进入临界区的进程,应释放CPU(如转换到阻塞状态)

临界区的实现方法

  • 禁用中断
  • 软件方法
  • 更高级的抽象方法

方法3:高级抽象的同步方法

  • 硬件提供了一些同步原语
    • 中断禁用,原子操作指令
  • 操作系统提供更高级的变成抽象来简化进程同步
    • 例如:锁、信号量
    • 用硬件原语来构建

锁lock

  • 锁是一个抽象的数据结构
    • 一个二进制变量(锁定/解锁)
    • Lock::Acquire()
      • 锁被释放前一直等待,然后得到锁
    • Lock::Release()
      • 释放锁,唤醒任何等待的进程

原子操作指令

  • 现代CPU体系结构都提供了一些特殊的原子操作指令

  • 测试和置位(Test-and-set)指令

    • 从内存单元中读取值
    • 测试该值是否为1(然后返回真或假)
    • 内存单元值设置为1

使用TS指令实现自旋锁

1class Lock{ 2 int value = 0; 3}
1Lock::Acquire() { 2 while( test-and-set(value)) 3 ; //spin 4}
1Lock::Release() { 2 value = 0; 3}

如果锁被释放,那么TS指令读取0并将值设置为1

  • 锁被设置为忙并且需要等待完成

如果锁处于忙状态,那么TS指令读取1并将值设置为1

  • 不改变锁的状态并且需要循环

它的问题是线程在等待的时候也要消耗CPU的时间

在这里插入图片描述

很多原子操作指令都可以做到同步互斥中用户态难以做到的事情。

Hello World社区的界面很美观~希望可以和Hello World一起成长

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

java 里面 的锁

A、乐观锁、悲观锁B、偏向锁、轻量级锁、重量级锁C、互斥锁、自旋锁、适应性自旋D、可重入锁、读写锁E、公平锁、非公平锁F、总线锁、缓存锁(linux操作系统底层,由CPU提供的锁)G、锁优化:减少锁持有时间、减小锁粒度、锁分离、锁粗化、锁消除信号量与互斥量:信号

java面试题汇总,不断更新中。。。

JVM,并发,锁相关:1.请你谈谈对volatile的理解,volatile是否存在伪共享问题。2.cas你知道吗?3.原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗?4.公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。5.CountDownLatch、CyclicBarrier、S