同步原语

来源:互联网 发布:潮男淘宝店 编辑:程序博客网 时间:2024/04/29 05:35
 

现在我们考察一下在避免共享数据之间的竞争条件时,内核控制路径是如何交错执行的。表5-2列出了Linux内核使用的同步技术。”适用范围”一栏表示同步技术适用于系统中的所有CPU还是单个CPU。例如,本地中断的禁止只适用于一个CPU;相反原子操作影响系统中的所有CPU。

现在,让我们简要地描述每种同步技术。在后面”对内核数据结构的同步访问”一节,我们会说明如何把这些同步技术组合在一起来有效地保护内核数据结构。

每CPU变量

最好的同步技术是把设计不需要同步的内核放在首位。正如我们将要看到的,事实上每一种显式的同步有的放矢都有不容忽视的性能开销。

最简单也是最重要的同步技术包括把内核变量声明为每CPU变量。每CPU变量主要是数据结构的数组,系统的每个CPU对应数组的一个元素。

一个CPU不应该访问与其它CPU对应的数组元素,另外,它可以随意读或修改它自己元素而不用担心出现竞争条件,因为它是唯一有资格这么做的CPU。但是,这也意味着每CPU变量基本上只能在特殊情况下使用,也就是当它确定在系统的CPU上的数据在逻辑上是独立的时候。

每CPU的数组元素在主存中被排列以使每个数据结构存放在硬件高速缓存的不同行,因此,对每CPU数组的并发访问不会导致高速缓存行的窃用和失效。

虽然每CPU变量为来自不同CPU的并发访问提供保护,但对来自异步函数的访问不提供保护,在这种情况下需要另外的同步原语。

此外,在单处理器和多处理器系统中,内核抢占都可能使每CPU变量产生竞争条件。总的原则是内核控制路径应该在禁用抢占的情况下访问每CPU变量。作为一个例子,简单地考虑一下在下面这种情况下会产生什么后果--------一个内核控制路径获得了它的每CPU变量本地副本的地址,然后它因被抢占而转移到另外一个CPU上,但仍然引用原来CPU元素的地址。

表5-3列出了内核提供使用每CPU变量的函数和宏。
原创粉丝点击