实际上是按照cpu个数创建的一个数组,每个CPU访问自己的数组成员,所以不用持锁,但是会有一个问题需要考虑,就是内核抢占问题:
1.一个访问每个CPU数据的任务,可能会被调度在不同的CPU上运行,此时对应的数组成员就不同的
2.另一个任务抢占了当前任务在当前CPU上运行,如果两个任务都访问当前CPU的数据,那么可能发生问题
鉴于以上问题,在每次操作每个CPU数据时,需要在操作前禁止掉抢占,操作后打开抢占,内核中可以通过如下API可以实现该功能:
get_cpu()
put_cpu()
实际上是按照cpu个数创建的一个数组,每个CPU访问自己的数组成员,所以不用持锁,但是会有一个问题需要考虑,就是内核抢占问题:
1.一个访问每个CPU数据的任务,可能会被调度在不同的CPU上运行,此时对应的数组成员就不同的
2.另一个任务抢占了当前任务在当前CPU上运行,如果两个任务都访问当前CPU的数据,那么可能发生问题
鉴于以上问题,在每次操作每个CPU数据时,需要在操作前禁止掉抢占,操作后打开抢占,内核中可以通过如下API可以实现该功能:
get_cpu()
put_cpu()