cmu15545笔记-索引并发控制(Concurrent Indexes)

news/2024/11/14 11:44:53/文章来源:https://www.cnblogs.com/timothy020/p/18545665

目录
  • Overview
    • Lock和Latch辨析
    • 设计目标
    • 大致分类
  • Hash Table Latches
    • Page Latches
    • Slot Latches
  • B+Tree Latches
    • 并发问题
    • Latch Crabbing/Couping
    • Optimistic Coupling(乐观锁)
  • Leaf Node Scan

Overview

Lock和Latch辨析

  • Lock:抽象的,逻辑的,整体统筹
  • Latch:具体的,原语性的,自我管理

本节主要探讨Latch

image-20241114092741280

设计目标

  • 内存占用少,无竞态时执行迅速
  • 等待时间过长时取消调度

大致分类

  1. 自旋锁(Test-and-Set Spin Latch)
  2. 阻塞互斥锁(Blocking OS Mutex)
  3. 读写锁(Reader-Writer Latches)
特性 Test-and-Set Spinlock Blocking OS Mutex Reader-Writer Locks
实现 基于原子操作的自旋等待 操作系统级阻塞 允许多读单写
锁争用时的处理 自旋等待,消耗 CPU 阻塞等待,减少 CPU 消耗 读操作可以并发,写操作排他
适用场景 短期锁、轻度锁争用 长期锁、重度锁争用 读多写少
优点 无上下文切换,性能高 避免自旋消耗,适合长时间等待 读写并发,适合读多写少
缺点 CPU 资源消耗高,锁持有时间长时效率低 上下文切换开销较高 写者饥饿问题

image-20241114094213574

C++中的mutex -> pthread -> Linux futex(fast user mutex):先在用户空间用自旋锁,如果获取不到锁,陷入内核态调用阻塞锁进入阻塞队列。

image-20241114095322180

image-20241114095559863

Hash Table Latches

两种粒度:Page Latches和Slot Latches

Page Latches

imageimage
imageimage
  • T1给page1上读锁,T2等待(如左上图)
  • T1查看page2无读锁,给page2上读锁,释放page1读锁;T2访问page1,上写锁(如右上图)
  • T2访问page2,但由于有T1读锁,等待(如左下图)
  • T1释放page2读锁,T2结束等待,给page2上写锁,写入E|val(如右下图)

Slot Latches

整体过程和Page Latches类似,只不过粒度变了。

imageimage
imageimage
  • T1给Slot A上读锁,T2给Slot C上写锁
  • T1访问Slot C,但是由于有T2的写锁,释放Slot A写锁,在C等待(如左上图)
  • T2访问Slot D,释放Slot C写锁,给Slot D上写锁;T1可以访问Slot C,上读锁(如右上图)
  • 重复上述两个步骤(左下图和右下图)

B+Tree Latches

并发问题

相比于哈希表,B+树并发的难点在于树的结构会发生分裂或合并。

imageimage
imageimage
  • T1找到了需要删除的值44(如左上图)
  • 删除了值44,此时需要偷(steal)左兄弟的值41进行合并,保证叶子结点半满,但是T1被调度,进入休眠(如右上图)
  • T2找到了需要删除的值41,准备读取值41,但是此时T2被调度,进入休眠(如左下图)
  • T1唤醒,进行结点合并,41移动到了新的位置
  • T2被唤醒,读取41,但是数据已经被移动(如右下图)

Latch Crabbing/Couping

具体步骤:

  • 得到父结点的锁
  • 得到子结点的锁
  • 如果子结点是安全的,释放之前的锁,否则不释放
  • 安全的定义:
    • 对于查询:不做要求
    • 对于插入:不满
    • 对于删除:多于半满

例:查询

imageimage
imageimage

例:删除

imageimage
imageimage

例:插入

imageimage

Optimistic Coupling(乐观锁)

观察:在插入和删除操作中,都会给根结点上写锁,造成系统在根结点处是串行的,有性能瓶颈。

实际上一个页存储一个结点,页大小很大,大多数时候不需要结点分裂,删除时结点也可以延迟合并,说明B+树结构大多数时候不会变化,上写锁的代价太大。

基本思想:上读锁,发现冲突后重新上写锁。

步骤:

  • 查询:不变
  • 插入/删除:
    • 和查询一样,在路径上加读锁,到达叶子结点后加写锁
    • 如果叶子结点不安全,重做;否则直接执行相关操作
imageimage
imageimage

Leaf Node Scan

叶子结点扫描顺序:

  • 垂直方向:自顶向底
  • 水平方向:没有限制

扫描方向冲突:

  1. 水平扫描方向不一致导致冲突
  2. 水平扫描和垂直扫描冲突

水平扫描方向不一致:读锁没有冲突,互换读锁即可。

image-20241114113049848

水平扫描方向不一致:带写锁时会有冲突,选择自我终结。

image-20241114113141531

为什么选择自我终结:根本原因是latch是低级原语,不涉及全局信息,唯一知道的只有自己的信息,所以选择自我终结。

  • 涉及到读写磁盘,等待时间不定
  • 不知道其他进程进行到什么程度,也不知道其他进程是什么状况

为什么水平方向不能强制一个方向扫描:影响效率,在数据规模变大时更为明显。
比如where子句是 where id > 100000,如果强制从左到右,得扫描100000条数据

水平扫描和垂直扫描方向不一致:

垂直到达叶子结点的操作,在遇到水平进行的操作时,同样会遇到上述问题,处理方式也相同。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmu15545笔记:索引并发控制(Concurrent Indexes)

目录OverviewLock和Latch辨析设计目标大致分类Hash Table LatchesPage LatchesSlot LatchesB+Tree Latches并发问题Latch Crabbing/CoupingOptimistic Coupling(乐观锁)Leaf Node Scan Overview Lock和Latch辨析Lock:抽象的,逻辑的,整体统筹 Latch:具体的,原语性的,自我…

cmu15545-索引并发控制(Concurrent Indexes)

目录OverviewLock和Latch辨析设计目标大致分类Hash Table LatchesPage LatchesSlot LatchesB+Tree Latches并发问题Latch Crabbing/CoupingOptimistic Coupling(乐观锁)Leaf Node Scan Overview Lock和Latch辨析Lock:抽象的,逻辑的,整体统筹 Latch:具体的,原语性的,自我…

向量动态量化

本文介绍向量检索服务DashVector动态量化功能和作用。 背景介绍 量化(Quantization)是向量检索技术中一种常用的优化方法,通过一定程度的精度(召回率)损失,来换取性能的大幅度提升,以及内存占用(索引文件大小)大幅度降低。 向量检索服务DashVector支持向量的动态量化,…

从零到一构建并打包 React + TypeScript + Less组件库教程(一、项目初始化搭建+代码规范集成)

本系列涉及的内容如下:组件库基础搭建,react + ts + less 项目规范,包括但不限于 prettier、eslint、stylelint、husky、lint-staged、commitlint pnpm monorepo + turborepo 集成 gulp + webpack 构建 esm、cjs 和 umd storybook 文档集成此系列不包含发布 npm 和构建 CI 流…

分区Partition

理解Partition 向量检索服务DashVector的Collection具有分区(Partition)的能力,同一个Collection下的Doc可通过不同的Partition进行物理和逻辑上的分区。各种Doc操作(如插入Doc、检索Doc等。若指定Partition,则该操作将限定在该指定的Paritition内进行。通过合理的Partiti…

PGsql 大写字段名,flink目前不支持读取

flink1.20 连接 postgres_flink postgresql-CSDN博客[FLINK-23324] Postgres of JDBC Connector enable case-sensitive. - ASF JIRA

成本减半 + 效率翻倍:这家企业用 11 天实现数据处理飞跃

伴随着云计算和数字化浪潮的推进,越来越多行业数据实时性的权重正在被加速提升,对企业而言,如果想要保证业务的持续发展,其底层数据库必须要能满足数据的实时性和高并发要求。 除此之外,在降本增效的大潮下,“高性价比”也成为企业选择一款数仓的重要因素。 那么,企业应…

Windows激活神器HEU KMS Activator v42.3.1

软件介绍 HEU KMS Activator,简洁高效的全能KMS/OEM激活工具,适用所有Windows, Office版本,无需联网即可一键激活,支持UEFI的KMS激活工具。KMS服务是微软对Windows, Office等产品的批量许可服务,利用KMS可以激活局域网内的产品。该工具利用KMS机制在系统搭建KMS服务器,从…

如何远程实时监控员工的电脑屏幕?60教会你,五个妙招轻松搞定!

https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9073269535369745774%22%7D&n_type=1&p_from=4 使用远程桌面协议(RDP)远程桌面协议(RDP)是一种允许用户远程连接到另一台计算机的技术。通过配置RDP,管理员可以实时访问员工的…

终端ssh终端模拟软件:Termius激活安装包

Termius是一款功能强大的跨平台终端管理工具,提供了友好的用户界面,支持SSH、Telnet、SFTP等多种连接协议,方便用户远程连接和管理服务器。此外,Termius还支持多平台同步、文件传输、批量操作、脚本自动化等进阶功能,且具备强大的数据加密和安全性保障。无论是开发人员、系…

解读Karmada多云容器编排技术,加速分布式云原生应用升级

Karmada提供了一个全局的控制面板,使得用户能够像操作单一集群一样管理多云上的Kubernetes集群。本文分享自来源:《华为云DTSE》第五期开源专刊,作者:任洪彩 华为云高级软件工程师,Karmada社区Maintainer。管理和协调跨多个云平台的容器化应用是当前企业面临的复杂性挑战之…

京东零售广告创意:基于人类反馈的可信赖图像生成

作者:京东零售 冯伟ECCV2024: Towards Reliable Advertising Image Generation Using Human Feedback 链接:https://arxiv.org/abs/2408.00418 摘要:在电商领域,吸引顾客注意力的广告图片至关重要。尽管生成模型可以自动生成图像,但它们往往会产生不符合广告标准的图片,可…