内核同步机制概述

内核同步最重要的是要搞清楚上下文是什么,上下文(context)指的是处于某种状态下所使用的资源集合。比如说在进程又可以成为进程上下文,中断处理成为中断上下文,中断处理可以分为两个部分,又可以认为两个不同的上下文。

在不同的上下文中,可能处理相同的数据。能被不同上下文访问的数据成为“临界资源”。例如,在内核中IP转发是在软中断中进行,IP转发需要查找FIB(转发信息库)表项;而FIB表项的添加、删除、维护是在进程上下文中进行。所以,FIB表项可以称为临界资源。

因为Linux内核支持可抢占,且能够支持多核系统,就是说会出现在多个上下文中访问临界资源的现象。而且这种访问可能不只是“读操作”,也有可能是“写操作”,同时访问的后果可能很严重,甚至引起系统崩溃。所以在访问临界资源需要进行保护,就是我们所说的同步。以FIB为例,如果CPU_0正在进行转发处理,即在软中断的上下文,在对FIB表项链表进行遍历访问,同时CPU_1上FIB的维护进程将对应的节点删除,CPU_0上的IP转发继续处理时,可能出现访问已释放内存的问题。

要保护临界资源,首先需要考虑临界资源有可能会在哪几个上下文中访问,这是模块设计首先要考虑的问题。只有明确了临界资源可能所处的上下文,才能进行针对性的保护,Linux内核中,主要涉及下面几种上下文:

1、进程上下文

2、中断上下文

3、中断下半部分

而对于多核系统(SMP)来说,又涉及不同核之间的临界资源的保护。比如A进程在CPU_0上运行,B进程在CPU_1上运行,同时对某一个数据进行访问时也需要进行同步保护。

当然最好的同步技术是把设计不需要同步的内核放在首位。事实上每一种显式的同步原语都有不容忽视的开销。

内核使用的各种同步技术



你可能感兴趣的:(内核同步)