wuyouwuyou

嵌入式Linux中的互斥机制之我见

0
阅读(2995)

从出现操作系统开始,互斥就是一个重要且必须解决的问题。因为当它发生在内核态时,可能导致系统崩溃,错误也很难被跟踪,带来的后果很严重。在实际应用中,对硬件进行编程和对操作系统进行底层运行时都要用遇到互斥,单一的互斥机制有时甚至根本不能满足要求,这样就加大了问题的复杂度,因此互斥问题的处理应该很谨慎。为了避免共享数据遭到破坏,防止竞争,内核提供了一组互斥机制来提供对共享数据的保护。Linux操作系统作为一个非常成熟的操作系统使用的互斥机制可以说随着内核版本的不断发展而完善。从最初的原子操作到后来的信号量,从大内核锁到现在的自旋锁。这些互斥机制的发展伴随着Linux从单处理器到对称多处理器的过渡、从非抢占内核到抢占内核的过渡。锁机制越来越有效,也越来越复杂。由于互斥机制的种类很多,选择合适的机制非常重要,否则因为错用而达不到目的,或者因为难度大而造成效率低下。因此,对于Linux环境下的互斥机制的研究是非常必要的一个课题。

1互斥机制的必要性

Linux中实现互斥机制的过程主要是在内核中进行的,如果把内核看作是不断对各种请求进行响应的服务器,那么正在CPU上执行的进程、发出中断请求的外部设备等就相当于客户。正如服务器要随时响应客户的请求一样,内核也要随时响应进程、中断的请求。这是因为所有的任务并不是顺序执行的,而是交错执行的。而对于所有内核任务而言,内核中的很多数据都是共享资然,因此难免会出现一些阻塞。因此对这些共享资然的访问必须遵循一定的访问规则,否则就可能对共享资然造成破坏,就好像不遵守交通规则会发生一些事故一样。同一个内核资然被多个内核任务并发访问通常是不安全的,在Linux操作系统中为了避免对临界区(访问和操作共享数据代码段)进行并发访问采用互斥机制来解决这一问题。互斥是用来控制多任务对共享数据进行串行访问的同步机制。在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。互斥使它们串行地访问数据,从而达到保护数据的目的,提高通信的效率。

2采用互斥机制的原因

内核执行任务时需要采用保护共享数据的情况很多, 简单来说有以下几种:

1)中断:中断几乎可以在任何时刻异步发生,即可能随时打断当前正在执行的代码。

2)内核抢占:如果内核具有抢占性,那么内核中的任务可能会被另一任务抢占。

3)睡眠及其与用户空间的同步:在内核执行的进程可能会睡眠,这就会唤醒调度程

  序,调度一个新的用户进程执行。

4)对称多处理:两个或多个处理器可以同时执行代码,实现任务之间的协调。

3 Linux解决互斥问题的机制

    采用互斥机制确保任务在使用共享资然时,其他任务不能访问相同的资源。为了达到这一目的,历史上众多科学家进行了尝试,提出的解决方案可以分为两类:一类是软件方法;一类是硬件方法。软件解决方法包括:

1)关闭中断或关闭调度

2)使用锁变量

3)轮换法

4)perterson

    由于上述的软件解决方法都有忙等待的缺点,实时性比较差。因此急需研究开发其他适合操作、效率高的互斥机制的方法。在Linux驱动层即内核态下解决互斥问题的机制有:中断屏蔽、原子操作、信号量和自旋锁及其他衍生锁等,其中原子操作实现互斥机制比较适合现在的计算机系统操作。下面将详细介绍这几种互斥机制。