'Mutex锁'究竟做了什么?

Ben*_*min 7 operating-system kernel mutex locking

您可以在此链接中看到一个有趣的表格.http://norvig.com/21-days.html#answers

该表描述了
Mutex 从主内存中锁定/解锁25 nanosec
100 nanosec

纳秒?
我很惊讶因为mutex lock速度比fetch data from memory.如果是这样,到底mutex lock是做什么的?Mutex lock桌上的意思是什么?

Ada*_*cin 15

假设有十个人不得不分享一支笔(也许他们在一家资金紧张的公司工作).因为他们必须用笔写长篇文档,但是写文档的大部分工作只是考虑说什么,他们同意每个人都用笔写一个文档的句子,然后必须让其他人可以使用.

现在我们遇到了一个问题:如果有两个人在考虑下一个句子,并且两个人都想立刻使用笔会怎么样?我们可以说,两个人都可以拿笔,但这是一支脆弱的老笔,所以如果两个人抓住它,那么它就会破坏.相反,我们在笔周围画一条粉笔线.首先,你把手放在粉笔线上,然后抓住笔.如果一个人的手在粉笔线内,那么没有其他人可以将他们的手放在粉笔线内.如果两个人试图把他们的手越过粉笔线的同时,根据这些规则只有其中一人将获得粉笔线内第一,所以对方有拉回自己的手,并保持它只是粉笔线外,直至笔可以再次使用.

让我们把它与互斥量联系起来.互斥锁是一种在短时间内保护共享资源(笔)的方法,称为临界区(写入文档的一个句子的时间).无论何时您想使用该资源,您都同意先打电话mutex_lock(将您的手放在粉笔线内).无论何时完成资源,您都同意致电mutex_unlock(从粉笔线区域拿出手).

现在来看一下互斥体的实现方式.互斥锁通常用共享内存实现.有一些共享的不透明数据对象称为互斥锁,mutex_lock而且mutex_unlock函数都带有指向其中一个的指针.该mutex_lock函数使用原子测试和设置或加载链接/存储条件指令序列(在x86 xhcg上经常使用)检查和修改互斥锁内的数据,并且"获取互斥锁" - 设置互斥锁的内容对象向其他线程指示临界区被锁定 - 或者必须等待.最终,线程获取互斥锁,在临界区内完成工作,并调用mutex_unlock.此函数设置互斥锁内部的数据以将其标记为可用,并可能唤醒一直尝试获取互斥锁的睡眠线程(这取决于互斥锁实现 - 一些实现mutex_lock只是在紧固的情况下旋转xchg直到互斥锁是可用,所以没有必要mutex_unlock通知任何人).

为什么锁定互斥锁会比走出内存更快?简而言之,缓存.CPU具有可以非常快速地访问的高速缓存,因此xchg只要处理器可以确保没有其他处理器访问该数据,操作就不需要一直到存储器.但是86有"拥有"的高速缓存行的一个概念-如果处理器0拥有的高速缓存行,即希望在该高速缓存行使用的数据都必须经过处理器0这样任何其他处理器,就没有必要对xhcg操作查看缓存之外的任何数据,缓存访问往往非常快,因此获取无争用的互斥锁比内存访问更快.

但是,最后一段有一点需要注意:速度优势仅适用于无争议的互斥锁.如果两个线程试图同时锁定相同的互斥锁,则运行这些线程的处理器必须通信并处理相关缓存线的所有权,这大大减慢了互斥锁的获取速度.此外,两个线程中的一个必须等​​待另一个线程执行临界区中的代码,然后释放互斥锁,从而进一步减慢其中一个线程的互斥锁获取速度.


And*_*ykh 1

您链接的文章没有提到架构,但从 L1 和 L2 缓存的提及来看,它是英特尔的。如果是这样,那么我认为互斥锁指的是 LOCK 指令。在这方面,这篇文章似乎很相关:Intel 64 and IA-32 | 原子操作,包括获取/释放语义

如果您知道自己在寻找什么,英特尔软件开发人员手册也可以提供帮助。我阅读了所有我能找到的有关 LOCK 指令的相关内容。