15-721 Chapter7 索引

news2025/2/27 18:19:17

锁的分类

锁占用少量内存,实际上在不竞争的情况下性能不错.

第一个就是靠test_and_set实现的自旋锁,高效,因为在用户态,但是却不可扩展,对cache,os都不友好

 

第二个是mutex,实际上两个部分组成,一个在内核态,一个夺锁失败要陷入内核态os latch等待调度。

 第三个

Adaptive spinlock是一种锁机制,用于在多线程环境中防止对共享资源的并发访问。它的工作原理是当一个线程请求获取锁时,如果锁是可用状态,该线程会直接获取锁并进入临界区域执行任务;如果锁已经被其他线程占用,则该线程不会阻塞等待锁的释放,而是在一定时间内尝试反复获取锁(自旋),直到锁被释放或者达到最大自旋次数后才会进入睡眠状态,等待通知唤醒。

Adaptive spinlock的优点是:

  1. 适应性好:由于自旋的次数是根据当前系统负载情况动态调整的,因此可以避免多余的自旋等待,减少了资源的浪费和响应时间的延迟。
  2. 减少上下文切换:相比于传统的阻塞式锁,在自旋等待过程中,线程并没有被挂起,所以可以减少上下文切换的开销。
  3. 避免死锁:自旋锁只会在短时间内占用CPU资源,因此不会像阻塞式锁那样容易出现死锁问题。

但是,Adaptive spinlock也存在一些缺点:

  1. 自旋等待会占用CPU资源,如果自旋的时间过长或者发生争用时容易导致系统负载升高。
  2. 自旋锁不适用于较长时间的临界区,因为在这种情况下自旋等待会过于耗费CPU资源,导致性能下降。
  3. 如果线程释放锁的通知被延迟或者遗失,将会导致自旋无法结束,浪费CPU资源。

 第四个

Queue-Based Spinlock(MCS Spinlock)是一种旨在解决自旋锁长时间自旋浪费CPU资源的问题,同时还可以避免多核系统中的总线争用和缓存同步的问题。

MCS Spinlock的工作原理如下:

  1. 每个线程都有自己的一个等待节点(MCS Node),该节点包含一个标志位(locked)和一个指向前一个节点的指针(prev)。
  2. 当一个线程需要获取锁时,它会先将自己的节点加入到锁的等待队列的末尾,并将自己的标志位置为true。然后线程会检查它的前一个节点是否已经释放了锁,如果已经释放则该线程直接进入临界区,否则线程会自旋等待。
  3. 当一个线程完成临界区的操作后,它会将自己的节点从队列中移除,并将它的前一个节点的标志位置为false,通知下一个节点可以继续执行。

Queue-Based Spinlock(MCS Spinlock)的优点如下:

  1. 减少了不必要的自旋:每个线程只需要检查自己的前一个节点是否已经释放锁,而不是像传统自旋锁那样不断尝试获取锁,这样可以减少不必要的自旋,降低了系统的开销。
  2. 降低了总线争用和缓存同步:MCS Spinlock的节点是分散存储在不同的处理器缓存中,而不是像传统自旋锁那样共享一个内存变量,这样可以减少不必要的总线争用和缓存同步,提高了系统的可扩展性。
  3. 可以有效避免死锁问题:每个线程都有一个自己的等待节点,并且节点之间是单向链表结构,所以不存在像传统自旋锁那样的死锁问题。

Queue-Based Spinlock(MCS Spinlock)的缺点如下:

  1. 实现复杂:相比于传统自旋锁,MCS Spinlock的实现更加复杂,需要额外的数据结构来维护节点的关系。
  2. 需要更多的内存:由于每个线程都需要一个等待节点,所以在多线程的情况下,需要消耗更多的内存。

 

 第5个读写锁,这个就注意一个点,如果有写锁被阻塞的化,后来的写锁也要被阻塞,目的是为了写饿死

 

B+树锁策略优化

1.就是读的话,拿到下面的节点后就可以释放上面一个节点,写的话,就是写入安全,不会分裂或者使节点少于一半,可以释放祖先节点全部的锁。还要类似的occ策略,在已知冲突少的情况下,我们可以到最后的叶子节点再加写锁,默认是不会对父节点做改变,如果改变的话,我们就加写锁重试。

2.

这个类似mvcc策略就是看看父节点是不是版本变化,变化的话说明我们错过了跟新,可能导致错误状态,我们要重试啦

 

 Trie

因为cache miss也是内存数据库的瓶颈,树高logN的话,那么可能就有log N 次cache miss,而Trie是logK,其中N是节点个数,而k是key的长度。

 这个做了水平和垂直两方面的优化,水平就是把0和1,用位置来代替后就可以去掉了。垂直就是如果没有分叉的话,为了节省内存,我们直接指针指向tuple,到tuple验证, 同时减少了cache miss。但是有可能出现假阳性,就像个布隆过滤器一样。

judy array

 

 

 

 judy vs ART

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浮空,定位

浮动原理: 清除浮动 高度塌陷是怎么造成的,浮动元素脱离当前文档流,然后无法撑起父容器导致了高度塌陷,因为父容器没有设置高度 解决方法: 1.将父元素变成bfc元素 2.父元素浮动 3.清除浮动: 通过给父元…

小伙被内卷逼成扫地僧,把牛客网所有面试题整理成25W字面试手册

很多工作过了 5 年之后的工程师,都表示写不动 CRUD 代码了,都会考虑转架构师,但是一想到面试,可能心里就会一紧。 一般面试大厂架构师的岗位至少需要 3 轮技术面试,我咨询了一下阿里的大佬,了解到每一轮的…

数字化时代,如何建造会“运转”的数仓

在建设数仓之前需要根据数据基础和业务需求来决定要建设什么标准的数仓。 常见数仓问题 1、公共底层加工逻辑分散:对于来自多个数据源,但需要使用相同过滤和解析方式公共底层数仓,其过滤和解析代码在每个任务或配置中直接静态复制&#xff…

【系统集成项目管理工程师】项目范围管理

💥十大知识领域:项目范围管理 项目范围管理包括以下 6 个过程: 编制范围管理计划过程收集需求过程定义范围过程创建工作分解结构过程确认范围过程范围控制过程 一、编制范围管理计划过程 对如何定义、确认和控制项目范围的过程进行描述 1、输出&#xff…

ch02-PyTorch数据预处理

ch02-PyTorch数据预处理0.引言1.数据读取机制 Dataloader 与 Dataset1.1.纸币二分类1.2.DataSet与DataLoader1.2.1.torch.utils.data.DataLoader:构建可迭代的数据装载器1.2.2.torch.utils.data.Dataset:Dataset抽象类1.2.3.以人民币分类为例2.数据预处理…

【Python】如何正确执行python装饰器?

文章目录前言一、错误的做法是什么?二、正确的方法总结前言 说到Python装饰器的执行顺序,有很多半吊子张口就来: 靠近函数名的装饰器先执行,远离函数名的装饰器后执行。 这种说法是不准确的。但是这些半吊子多半还会不服&#…

海明码的计算和检错纠错

海明码 1.学习前提 学习海明码之前,我们要约定3个原则: 海明码只能检测出2位错,纠1位错(因此不要问如果3位错怎么办等幼稚问题)。海明码默认进行偶校验(除非特殊说明使用奇校验)。海明码是一串由0和1组成的序列(除01外没有其他的值&#x…

ASEMI代理AD8606ACBZ-REEL7原装ADI车规级AD8606ACBZ-REEL7

编辑:ll ASEMI代理AD8606ACBZ-REEL7原装ADI车规级AD8606ACBZ-REEL7 型号:AD8606ACBZ-REEL7 品牌:ADI/亚德诺 封装:WLCSP-8 批号:2023 引脚数量:8 安装类型:表面贴装型 AD8606ACBZ-REEL7…

Serverless 冷启动:如何让函数计算更快更强?

问题背景 Serverless 计算也称服务器无感知计算或函数计算,是近年来一种新兴的云计算编程模式。其致力于大幅简化云业务开发流程,使得应用开发者从繁杂的服务器运维工作中解放出来(例如自动伸缩、日志和监控等)。借助 Serverless…

APT攻击及密码学

目录标题什么是APT攻击?APT攻击过程APT防御技术APT防御过程沙箱处理流程密码学什么是对称加密?什么是非对称加密?SSL工作过程什么是APT攻击? APT攻击即高级可持续威胁攻击,也称为定向威胁攻击,指某组织对特…

fastCGI快速上手

fastCGI OVERVIEWfastCGI一、CGI二、fastCGI三、fastCGI使用1.fastCGI和spawn-fcgi安装2.nginx fastcgi(1)nginx的数据转发(2)spawn-fcgi启动(3)fastCGI进程处理3.fastCGI总结四、其他1.fastCGI环境变量2.…

【图像分割】LabelMe基本使用/标注标签格式转换及可视化

前言 之前一直在做目标检测的相关内容,使用LabelImg标注检测数据轻车熟路。不过最近尝试探索一下图像分割场景,需要用到LabelMe标注用于分割的数据标签,本文进行过程记录。 图像分割数据标签示例 以道路分割为例,下图是deepglo…

基于MVC+SSH的文章发布系统源码数据库毕业论文

目 录 摘要 1 Abstract 2 1 绪论 1.1 课题背景 1.2 研究现状及发展趋势 1.3 课题意义与目的 1.4 研究内容 1.5 论文组织 2 开发工具和技术介绍 2.1 开发工具 2.1.1 Myeclipse简介 2.1.2 MySQL简介 2.1.3 Tomcat简介 2.2 开发技术 2.…

【LInux】MySQL高可用之主从复制

一、Mysql主从架构技术说明 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到 多个系统上去,这种分布的机制,是通过将Mysql的某一台主机(Master)的数据复 制到其它主(slaves&…

音频模块的介绍

一、术语总结 1.HIFI 级   “HIFI”一词通常指高保真音频(High-Fidelity Audio),是指尽可能保持音频信号的原始质量,让听众感受到最真实的音乐表现。因此,“HIFI级”通常指具有高保真音频性能的产品或设备&#xff…

音视频开发十六:SDL基础概念

SDL 纹理渲染 纹理 ​ 在SDL中,纹理是图像的描述信息。用SDL_Texture表示一个纹理对象(texture),它是一个用于存储像素数据的结构体类型。 渲染 ​ **互联网解释:**渲染是在电脑绘图中是指用软件从模型生成图像的…

【Linux】线程互斥详解:多线程会有什么问题?什么是互斥锁?C++怎么封装使用互斥锁?

多线程可以提高程序的并发性和运行效率,充分利用计算机的多核资源. 前面的几篇文章已经介绍了, Linux线程的基本概念、基本控制等内容. 我们已经看到了多线程可以提升运行效率等. 但是, 也发现了问题, 多线程可能会导致输出混乱、访问共享资源混乱、竞争等问题. 输…

Vue中 import ...与import{ }、import from ‘@路径‘ 与 import from ‘../路径‘

遇到的问题: 不带{ }以组件方式 引入后,用 组件名. 变量 的方式一直提示变量未定义的问题,改成直接 带{ }引入变量直接使用变量就不提示错误了,(不知道是不是我引入的包和他人不一样的原因...)&#xff0…

至尊宝工具箱 - 电商运营选品必备工具下载安装详细教程

简介 至尊宝插件是一款电商网络浏览插件,能够帮助店主更好地运营自己的网店,这款插件功能十分全面强大,可以实现搜主图、快速商家商品、优化商品标题等,通过帮助店家增加曝光量来增效销售,感兴趣的朋友快来体验。 下…

使用Superlink控制物联网网关远程调试PLC示例(PLC/HMI调试工具)

目录 1.Superlink工具使用说明 1.1软件安装 1.2账号登录 1.3设备查看 1.4菜单栏使用 2. Superlink网关远程调试网口/串口设备示例 2.1 远程调试西门子网口1200 PLC示例 2.2 远程调试欧姆龙232 PLC实串口通讯示例 3. 常见使用问题及技术支持 3.1 Superlink工具使用问题…