首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么互斥锁延迟比JEFF DEAN的latency Numbers中的主存引用要小,每个程序员都应该知道?

互斥锁延迟比JEFF DEAN的latency Numbers中的主存引用要小,每个程序员都应该知道的原因是:

互斥锁是一种同步机制,用于保护共享资源的访问,防止多个线程同时访问导致数据不一致的问题。在多线程编程中,使用互斥锁可以确保同一时间只有一个线程可以访问被保护的资源,其他线程需要等待锁的释放才能继续执行。

互斥锁的延迟比主存引用的延迟小的原因主要有以下几点:

  1. 互斥锁的延迟是由于线程之间的竞争和调度引起的,而主存引用的延迟是由于内存访问的物理操作引起的。互斥锁的延迟主要受到线程调度器的影响,而主存引用的延迟主要受到硬件和内存子系统的影响。由于线程调度器通常比硬件和内存子系统更加高效,所以互斥锁的延迟相对较小。
  2. 互斥锁通常是在用户空间实现的,而主存引用是在内核空间实现的。用户空间的操作相对于内核空间的操作来说,具有更低的开销和延迟。因此,互斥锁的延迟相对较小。
  3. 互斥锁的实现通常会利用一些优化技术,如自旋锁、读写锁等,以减少锁的竞争和降低延迟。这些优化技术可以根据具体的场景和需求选择合适的锁策略,从而进一步降低延迟。

总之,互斥锁延迟比JEFF DEAN的latency Numbers中的主存引用要小是因为互斥锁的实现通常在用户空间,利用了线程调度器的高效性和一些优化技术,从而降低了锁的竞争和延迟。每个程序员都应该知道这个原因,以便在多线程编程中选择合适的同步机制并优化性能。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用于 LLM 公开数值数据

数组每个元素都是一个包含两个键字典: input: 用于训练模型输入文本。输入文本通常包括一个问题或描述。 output: 模型预期输出。这通常是一个简短回答或数值。...LLM 开发者应知数字 在谷歌,传奇工程师杰夫·迪恩(Jeff Dean)整理了一份名为“每位工程师都应该知道数字”文档。...磁盘延迟是指从磁盘读取或写入数据所需时间。了解磁盘延迟有助于在处理大量数据时了解存储系统性能瓶颈。 网络延迟 同一数据中心内往返延迟(RTT)大约为 0.5 毫秒。...跨洲际光缆往返延迟大约为 150 毫秒。 网络延迟是指数据在网络传输所需时间。了解网络延迟有助于在开发分布式系统和优化网络通信时预测性能。...然而,我们鼓励您在使用这些数据时,引用这个存储库以便其他人可以找到这些资源。 项目地址 https://github.com/ray-project/llm-numbers

19030

美国工程院士、谷歌首席架构师、结对编程榜样杰夫·迪恩(JeffDean)博士传记(27k字)

杰夫(Jeff)与桑杰(Sanjay)对于计算机工作原理非常熟悉,能够立足位(bit)层级进行思考。杰夫(Jeff)曾经整理出一份《每位程序员都应该了解那些延迟数字》清单。...虽然名为“每位程序员都应该了解”,但大多数从业者对这些数字其实非常陌生——例如一级缓存引用通常需要半纳秒,或者从内存顺序读取1MB大概需要250微秒等等。...桑杰(Sanjay):“但我不知道我们为什么会觉得一起在同一台计算机前面琢磨,会比分头行动效果更好。” 杰夫(Jeff)则表示,“我宁愿走过两个街区,也想从自己D.E.C研究实验室赶到他研究室去。...正如厨师在食材下锅之前先对其进行分类一样,MapReduce也要求程序员将自己任务分成两个阶段。...与此同时,在每周星期一共同编程,杰夫(Jeff)与桑杰(Sanjay)又鼓捣出了一个新 AI 项目。杰夫(Jeff)说这是一种尝试,训练出一套“巨型”机器学习模型来执行成千上万种不同任务。

2.5K10

《纽约客》长文:Jeff Dean和他背后男人

他跟另一位同事——一位身材瘦高、精力充沛31岁男子,名叫Jeff Dean,同样来自Digital Equipment Corporation。 JeffSanjay早10个月离开D.E.C。...Jeff和Sanjay是在比特级别上理解计算机Jeff曾经分发过一份“每个程序员都应该知道延迟时间”列表。...实际上这是一份几乎没有哪位程序员知道数字列表:L1缓存引用通常需要0.5纳秒,或者从内存连续读取1兆字节需要250微秒。这些数字根植在Jeff和Sanjay大脑里。...“我们从进谷歌之前就已经是搭档了,”Jeff说。 “但我不知道为什么我们决定在一台电脑前工作,而不是用两台电脑,”Sanjay说。...“我不知道为什么越来越多人不这样做了,”Sanjay说,他指的是与搭档一起编程。 “你需要找到一个能与你思维方式兼容的人来做搭档,这样你们俩就能形成互补。”Jeff说。

58610

干货 | 聊聊java并发(上)

(一)为什么“并发”? 既然聊并发,我们首先会思考为什么引入这个技术。...那么为什么并发呢? 接下来,我尝试系统、深入、图文并茂聊一下并发、JSR133定义JMM以及其中具体语义细节。 ? 1.充分利用CPU资源 首先,并发可以充分利用CPU资源。...(上下文切换示意图) 2.更复杂,有挑战 并发编程串行编程更加复杂,考虑问题、线程安全、重排序问题、共享数据一致性、线程池设置等等。...为什么不可见 计算机为了提高整体运行效率,使得CPU不会直接与内存(主存)进行通信,会先使用缓存替代主存。 使用缓存好处主要两点:一,缓存读写数据内存读写数据速度更快,能更好地被CPU使用。...这个线程获取对象成功同时,会使得当前CPU缓存数据失效,那么接下来读操作,就会重新从系统主存读取(并填充缓存)。

51720

干货 | 聊聊java并发(上)

(一)为什么“并发”? 既然聊并发,我们首先会思考为什么引入这个技术。...那么为什么并发呢? 接下来,我尝试系统、深入、图文并茂聊一下并发、JSR133定义JMM以及其中具体语义细节。 ? 1.充分利用CPU资源 首先,并发可以充分利用CPU资源。...(上下文切换示意图) 2.更复杂,有挑战 并发编程串行编程更加复杂,考虑问题、线程安全、重排序问题、共享数据一致性、线程池设置等等。...为什么不可见 计算机为了提高整体运行效率,使得CPU不会直接与内存(主存)进行通信,会先使用缓存替代主存。 使用缓存好处主要两点:一,缓存读写数据内存读写数据速度更快,能更好地被CPU使用。...这个线程获取对象成功同时,会使得当前CPU缓存数据失效,那么接下来读操作,就会重新从系统主存读取(并填充缓存)。

90250

Jeff Dean激荡人生:我和Sanjay在同一台电脑上写代码

他追随 Jeff Dean 加入谷歌,他们之前同在 Digital Equipment Corporation。Jeff Dean Sanjay 早十个月离开 D.E.C.。...Jeff 和 Sanjay 对计算机有非常深入了解。Jeff 曾经写过一份清单《Latency Numbers Every Programmer Should Know》。...在设计房子时,他发现虽然自己喜欢设计空间,但并没有耐心去完成「适合 Sanjay 部分」:横梁细节、螺栓以及保证整个设计不至于分崩离析。 「我不知道为什么别人不这么干——合作编程。」...在 MIT,他研究生导师是 Barbara Liskov,这是一位有影响力计算机科学家,研究复杂代码库管理。在她看来,最好代码就像是一篇好文章。它需要一个精心实现结构,每个都应该起作用。...「这山比我想象陡。」Jeff 说道。 「我记得有人说这是一次非常平坦远足。」Sanjay 说。 「我猜这就是那一侧没有自行车道原因。」Jeff 说道。 他们又走进了一片丛林。

1.1K10

谷歌基情实录:和Jeff Dean在同一台电脑上写代码

大数据文摘出品 编译:DonFJ、周家乐、李雷、七、胡笳、jin、钱天培 单丝不成线,孤木不成林,浑身是铁也打不成几根钉子。 谷歌伟大有一多半归功于公司亲密无间、协同工作程序猿们!...谷歌承诺提供一个当时谷歌搜索引擎还大十倍索引,为什么这么大量呢,因为按照当时情况,互联网上数据一年翻一倍(现在岂止一倍……),那这个索引刚好能小跑儿地跟上时代步伐。...Jeff 和 Sanjay对计算机了解已经达到了字节级别。Jeff曾经发布过一个名为“每个程序员都应该知道延迟数列”列表。...事实上,几乎没有程序员知道这个数字列表:引用L1缓存通常需要半纳秒,或者在内存顺序读取一兆字节通常需要250微秒。这些数字都深深印刻在了Jeff和Sanjay脑海中。...它需要精心设计结构,每个单词都应该发挥作用。这种程序需要与读者产生共鸣。这也意味着代码不仅被看做是实现功能手段,而其本身也是一种艺术。

85530

乐观&悲观&自旋

当线程A更新数据值时,在读取数据同时也会读取version值,在提交更新时,若刚才读取到version值为当前数据库version值相等时才更新,否则重试更新操作,直到更新成功。...然后t1t1t1比较预期值E1E1E1和主存VVV,发现E1=VE1=VE1=V,说明预期值是正确,执行N1=V1+1N1=V1+1N1=V1+1,并将N1N1N1值传入主存。...=V,t2t2t2线程将主存已经改变值更新到自己副本,再发起重试; 直到预期值等于主存值,说明没有别的线程对旧值进行修改,继续执行代码,退出; 4....这其实就是乐观实现全过程。如果此时使用是悲观,那么意味着所有程序员都必须一个一个等待操作提交完,才能访问文件,这是难以接受。 2.什么时候使用悲观?...它是为实现保护共享资源而提出一种机制。 其实,自旋互斥比较类似,它们都是为了解决对某项资源互斥使用。

88240

Java高并发:Java内存模型

在指令前插入读屏障,可以让高速缓存数据失效,强制从主存加载数据。并且,先于这个屏障指令必须先执行。 写屏障:在指令后插入写屏障指令能够让高速缓存最新数据立刻刷新到主存,其他线程可见。...图片 本质上,这些规则是解决各种场景在并发时可见性问题: 程序顺序规则:一个线程每个操作都应该happens-before该线程任何后续操作。即线程内每个操作结果对该线程所有后续操作都可见。...7 synchronize synchronize是互斥,由JVM实现,实际上是调用了操作系统pthread_mutex_lock系统调用。...每个Java对象都有一个监视器对象同生共死,获取失败线程会进入监视器对象阻塞队列等待被唤醒。...synchronize是互斥,可以保证原子性。 synchronize使用后unlock时会强制将修改共享变量刷回主存,保证可见性。

79330

【数据库09】数据库系统体系结构

,不能够直接用于实现数据库通用,但是原子操作指令可以用于实现短时间,也称为闩(shuuan),以用于数据库互斥。...1.获取表上互斥(闩) 2.检查是否可以分配请求,如果可以,则更新表以表示已分配锁,否则,更新表以表示请求在该队列 3.释放表上互斥。...客户端可以采取优化策略来减少网络延迟(network-latency,指在网络上发消息得到响应时间)影响。数据库系统也可以采取同样策略。 预取。...这类扩展适用于事务是更新类事务处理系统,比如银行存款和取款。 下面这些因素影响并行操作效率,并且可能同时降低加速比与扩展。 串行计算,有些任务必须要串行执行。...由于高速缓存主存多,因此共享内存体系也加入了高速缓存,如果需要对不在高速缓存数据项访问,需要从主存提取,称为高速缓存未命中(cache miss).

58530

Go 应用优化指北

为什么要做优化 这是一个速度决定一切时代,我们生活在不断地数字化,线下流程依然在持续向线上转移,转移过程,作为工程师,我们会碰到各种各样性能问题。...因此我们需要知道一些基本与磁盘、内存、网络相关基本数据与常见概念: 要了解内存多级存储结构:L1,L2,L3,主存。...还要知道这些不同层级存储操作时大致延迟latency numbers every programmer should know[1]。...要知道基本文件系统读写 syscall,批量 syscall,数据同步 syscall。 熟悉项目中使用网络协议,至少要对 TCP, HTTP 有所了解。...numbers every programmer should know: https://colin-scott.github.io/personal_website/research/interactive_latency.html

29240

一文讲透 “进程、线程、协程”

虚拟存储器主要提供了三个能力:  将主存看成是一个存储在磁盘上高速缓存,在主存只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,更高效地使用主存每个进程提供了一致地址空间,...而同一进程多个线程是可以共享同一地址空间 线程是CPU调度基本单元,一个进程包含若干线程。 线程进程,基本上不拥有系统资源。...线程创建和销毁所需要时间进程很多 由于线程之间能够共享地址空间,因此,需要考虑同步和互斥操作 一个线程意外终止会影响整个进程正常运行,但是一个进程意外终止不会影响其他进程运行。...而且,线程阻塞状态是由操作系统内核来完成,发生在内核态上,因此协程相比线程节省线程创建和切换开销 协程不存在同时写变量冲突,因此,也就不需要用来守卫关键区块同步性原语,比如互斥、信号量等,并且不需要来自操作系统支持...在针对不同场景对比三者区别之前,首先需要介绍一下python多线程(一直被程序员所诟病,认为是"假"多线程)。 那为什么认为Python多线程是“伪”多线程呢?

60820

揭秘 Google 两大超级工程师:AI 领域绝无仅有的黄金搭档

AI科技评论按,在 Google 从创业公司成长为一代巨头过程,有数不清工程师参与,其中 Jeff Dean 和 Sanjay Ghemawat 是仅有的两位达到 Google Senior...战情室里可不止以上两位,才加入 Google 没几个月 Sanjay Ghemawat 也在埋头奋战,当然这里还有引荐他进入搜索巨头老同事 Jeff Dean。...Jeff 就曾写过一个清单,在他看来清单上延迟数字是每个程序员都应该烂熟于心。...不过,功勋卓著 Jeff 和 Sanjay 当然特事特办,他们是 Google 唯二拿到 11 级超级工程师。...“我也不知道两人协作模式是怎么建立。”Sanjay 回忆道。 “好像加入 Google 之前就开始了吧。”Jeff 说道。 “但为什么两人共用一个电脑呢?”Sanjay 问道。

43920

Go语言基于共享变量并发

为了效率队内存写入一般会在每个处理器缓冲,并在必要时一起flush到主存。这种情况下数据可能会以与当初goroutine写入顺序不同顺序提交到主存。...如果goroutine在不同CPU上执行,每个核心都有自己缓存,一个goroutine写入对于其他goroutineprint在主存同步之前是不可见。...初始化延迟是比较常用一种处理方式,但是在多协程如果进行延迟初始化可能会出现互斥问题。...,而goroutine栈大小最大值有1GB,传统固定大小线程栈大很多,但一般情况下goroutine不需要太大栈。...这种调度方式并不需要进入内核上下文,所以重新调度一个goroutine调度一个线程代价低很多。

81140

Go语言基于共享变量并发

为了效率队内存写入一般会在每个处理器缓冲,并在必要时一起flush到主存。这种情况下数据可能会以与当初goroutine写入顺序不同顺序提交到主存。...如果goroutine在不同CPU上执行,每个核心都有自己缓存,一个goroutine写入对于其他goroutineprint在主存同步之前是不可见。...初始化延迟是比较常用一种处理方式,但是在多协程如果进行延迟初始化可能会出现互斥问题。...,而goroutine栈大小最大值有1GB,传统固定大小线程栈大很多,但一般情况下goroutine不需要太大栈。...这种调度方式并不需要进入内核上下文,所以重新调度一个goroutine调度一个线程代价低很多。

1.3K110

高性能队列——Disruptor总论1 背景2 Java内置队列3 ArrayBlockingQueue问题4 Disruptor设计方案代码样例性能等待策略Log4j 2应用场景

如果一个线程在持有情况下被延迟执行,例如发生了缺页错误、调度延迟或者其它类似情况,那么所有需要这个线程都无法执行下去。...1个数量级;有且多线程并发情况下,速度单线程无慢3个数量级。...每个cache line通常是64字节,并且它有效地引用主内存一块儿地址 一个Javalong类型变量是8字节,因此在一个缓存行可以存8个long类型变量 CPU每次从主存拉取数据时,会把相邻数据也存入同一个...index是long类型,即使100万QPS处理速度,也需要30万年才能用完 无设计 每个生产者或者消费者线程,会先申请可以操作元素在数组位置,申请到之后,直接在该位置写入或者读取数据。...5,069,086 175,567 Mean Latency 32,757 52 Min Latency 145 29 可见,平均延迟差了3个数量级。

1.6K31

Go语言基于共享变量并发

为了效率队内存写入一般会在每个处理器缓冲,并在必要时一起flush到主存。这种情况下数据可能会以与当初goroutine写入顺序不同顺序提交到主存。...如果goroutine在不同CPU上执行,每个核心都有自己缓存,一个goroutine写入对于其他goroutineprint在主存同步之前是不可见。...初始化延迟是比较常用一种处理方式,但是在多协程如果进行延迟初始化可能会出现互斥问题。...,而goroutine栈大小最大值有1GB,传统固定大小线程栈大很多,但一般情况下goroutine不需要太大栈。...这种调度方式并不需要进入内核上下文,所以重新调度一个goroutine调度一个线程代价低很多。

1.8K40

计算成本降低35倍!谷歌发布手机端自动设计神经网络MnasNet

Jeff Dean在推特推荐了这篇论文:这项工作提出将模型计算损失合并到神经结构搜索奖励函数,以自动找到满足推理速度目标的高准确率模型。 ?...在以前工作,移动延迟(mobile latency)通常是通过另一个代理(例如FLOPS)来考虑,这些代理经常不准确。...与之前工作不同,在我们实验,我们通过在特定平台(如Pixel phone)上执行模型,从而直接测量实际推理延迟(inference latency)。...在COCO对象检测任务,我们模型实现了MobileNets更高mAP质量和更低延迟。...如表3所示,MnasNet这些变体在精度和延迟之间权衡表现更好,这表明在资源有限CNN模型,layer多样性相当重要。

56110

你用对了吗?浅谈 Java “” 事

不过在这之前还是得先来盘一盘为什么需要这玩意,这得从并发 BUG 源头说起。 并发 BUG 源头 这个问题我 19 年时候写过一篇文章, 现在回头看那篇文章真的是羞涩啊。...这就一个很简单代码,如果此时有线程 A 和线程 B 分别在 CPU – A 和 CPU – B 执行这个方法,它们操作是先将 a 从主存取到 CPU 各自缓存,此时它们缓存 a 值都是 0...我们来看个例子,里面也有个细节。这段代码就是模拟缓存读取,先上读去缓存拿数据,如果缓存没数据则释放读,再上写去数据库取数据,然后塞入缓存返回。...这里面的细节就是再次判断 data = getFromCache() 是否有值,因为同一时刻可能会有多个线程调用getData(),然后缓存都为空因此都去竞争写,最终只有一个线程会先拿到写,然后将数据又塞入缓存...它和普通互斥区别就在于维护这两个状态和在等待队列处区别处理这两种。 所以在不适用于读写场景还不如直接用互斥,因为读写还需要对state进行位移判断等等操作。

47340
领券