layout | title | category | description | tags |
---|---|---|---|---|
post |
per-CPU变量 |
内核同步 |
per-CPU变量... |
per-CPU |
最好的同步技术是把设计不需要同步的内核放在首位,因为任何一种同步技术都需要很大的开销。最简单也是最为重要的同步技术有per-CPU变量,这个变量是数组数据结构,系统的每一个CPU都对应一个元素。
一个CPU不应该访问与其他CPU对应的数组元素,另外,它可以随意读或修改自己的元素而不会担心出现竞争状况,因为它是唯一有资格这么做的CPU,因为如果自己的CPU针对自己的数据结构进行修改而会出现竞争状况的话,那将是一个灾难。
但是,这也意味着每个CPU变量基本上只能在特殊的情况下使用,也就是在系统的CPU上的数据结构在逻辑上是独立的时候,per-CPU变量才能够使用。
per-CPU的数组元素在主存中被排列以使每个数据结构存放在硬件高速缓存的不同行,因此,对per-CPU数据结构的并发访问不会导致高速缓存行的窃用和失效,否则会带来非常昂贵的系统开销。
虽然per-CPU变量为来自不同CPU的并发访问提供了保护,但对来自异步函数比如中断处理程序和可延迟函数的访问不能提供保护,在这种情况下需要其他的同步技术。
此外,在单处理器和多处理器的系统中,内核抢占都可能使per-CPU变量产生竞争,总的原则是内核控制路径应该在禁用抢占的情况下访问per-CPU变量。如果不这样,那么可以想象,如果一个内核控制路径获得了一个per-CPU变量,并且引用当前per-CPU变量相应元素的地址。然后因为被抢占而转移到另一个per-CPU变量上,但仍然可能会引用原来的per-CPU变量元素的地址,这样就会产生系统错误。