
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3 互斥机制
在Linux内核中几种不同的活动可能被相互打断;在多处理器环境下,不同的活动可以并行执行。在活动并行运行过程中,保持系统的稳定性和正确性是必须要解决的问题。
如果内核中的各活动相互独立,没有交叉访问,就不会引起任何问题。一旦几个活动要访问同一数据结构,如果不采取相应的保护机制,即使在单CPU的系统中都可能会引起预想不到的结果。
下面我们用一个实例来说明这个问题,系统中有两个活动A和B,都要访问同一个链表,将自己的数据skb_a和skb_b加入到链表中。活动A在执行过程中被活动B打断,活动B执行一段时间后,活动A恢复执行。图1-2给出了这两个活动执行结束后的结果。将skb_b加入到链表中的操作结果不正确。

图1-2 并发访问造成的问题
为了避免这类问题的发生,当几个活动需要同时操作同一个数据结构时(这段代码通常称为critical section),这种操作必须是原子操作。所谓原子操作,即整个操作过程不能被打断,操作的几个步骤以不可分的方式执行。
在网络实现代码中,互斥机制使用得非常广泛。在Linux系统的发展过程中,不断创建、优化了几种机制来实现代码执行的互斥。以下几节主要总结了用于网络子系统中的互斥机制,每一种互斥机制适于某些特定的执行环境。