内核同步(上)
1. 锁的概念
在没有任何干预的情况下,线程可以同时执行临界区代码,而这些临界区代码是对共享可写数据(共享状态)进行操作的。为了避免并发问题,我们需要消除并行性,并对临界区内的代码进行序列化,也就是让共享数据的读写操作按顺序进行。
一种常见的强制代码路径序列化的技术是使用锁。锁的基本工作原理是,在任何给定的时间点,确保只有一个执行线程能够“获取”或拥有该锁。因此,使用锁来保护代码中的临界区,可以让临界区代码独占执行(甚至可能是原子执行,后续会详细介绍)。
锁的工作过程如下:当多个线程(假设为 n 个线程)竞争获取锁(LOCK 操作)时,只有一个线程会成功,这个线程被称为锁的“获胜者”或“所有者”。它会将锁 API 视为非阻塞调用,然后愉快且独占地执行临界区代码(临界区实际上就是加锁和解锁操作之间的代码)。而其余的 n - 1 个“失败者”线程,可能会将锁 API 视为阻塞调用,它们会等待。等待什么呢?当然是等待锁的所有者(“获胜者”线程)执行解锁操作。一旦解锁,剩下的 n - 1 个线程会再次竞争下一个“获胜者”位置,同样只有一个线程会“获胜”并继续执行,而其余 n - 2 个失败者会等待新的获胜者解锁,这个过程会一直重复,直到所有 n 个线程都依次获取到锁。
然而,锁虽然有效,但会带来相当大的开销,因为它消除了并行性,将执行流程序列化。可以把这种情况想象成一个漏斗,狭窄的茎部就是临界区,一次只能容纳一个线程,其他线程会被阻塞,锁会造成瓶颈。另一个常见的物理类比是多条车道的高速公路合并成一条非常繁忙且拥堵的车道(可能是设计糟糕的收费站),在这里,并行性(不同车道上并行行驶的汽车,类比不同 CPU 上的线程)消失了,汽车必须依次排队,这就是序列化行为。
内核同步机制与锁技术解析
超级会员免费看
订阅专栏 解锁全文
&spm=1001.2101.3001.5002&articleId=151306276&d=1&t=3&u=d61dd53e88e5407593e5f0e87137c141)
6445

被折叠的 条评论
为什么被折叠?



