wuyouwuyou

嵌入式Linux中同步机制概述

0
阅读(35493)

Linux系统同一时间可能有多个进程在执行,因此需要一些同步机制来同步各个进程对于共享资源的访问。在Linux内核中有相应的同步技术实现,包括原子操作、信号量、读写信号量、自旋锁和等待队列等等。本文从同步的机制出发,重点研究讨论了Linux系统非阻塞的同步机制、Linux系统内核同步机制、Linux系统多线程的同步机制。

我们在实际生活中经常碰到这样的一类问题:有时候我们在使用打印机实现某种功能的时候,有可能使多个任务的打印结果交织在一起,造成混乱。这时多任务之间的同步操作便显得非常重要。比如在工业控制中的多个相互合作的任务,可以将数据采集、数据处理和数据输出划分为不同的任务。在它们之间建立一种必要的通信机制,使得采集任务可以通知数据处理任务。在新采集的数据已经处理完毕的时候,数据处理任务可以及时的通知输出任务,告诉输出任务需要实现的结果已经经过计算完成,需要通过输出设备输出【1】。多任务的引入主要有以下有点:多任务的引入改善了系统的资源利用率,并且提高了系统的吞吐量,尤其是在嵌入式多任务操作系统中,但是与此同时多任务的引入也带来了另外的问题,那就是多个任务间如何协调、合作共同完成一个大的系统功能。特别是当我们在竞争使用临界资源,或是需要相互通知某些事件发生时。

另外在Linux操作系统里,在某一个时间段里,有些资源可能被很多内核同时来调用,这时我们便需要一套同步机制来同步各内核执行单元对共享数据的访问。尤其是在多核通信的机制上更需要同步机制来协调进程之间的通信。在Linux内核中有相应的技术实现,主要包括原子操作、信号量、读写信号量、自旋锁和等待队列。利用常用的同步机制可以有效地实现多任务、多内核之间的优化,实现其之间的合理调度。

同步机制

1临界资源与临界区

    我们把在一段时间内只允许一个任务访问的资源叫做临界资源。这里与vxworks中的信号量的使用比较的类似。任务在占有CPU之后,还需要相应的资源才可以正常的执行。如果此时任务需要的资源被其它任务所占有,那么当前任务必须等待前一个任务完成并释放该

资源后,才可以执行。把程序中使用临界资源的代码称为临界区【2】。如果此刻临界资源未能访问,该任务便可以进入临界区,并将其设置为被访问状态。然后,即可以对临界资源进行操作。待任务完成后释放其占用的资源。

2 进程的上下文

在任务执行的过程中我们需要注意下面的问题。在经过通过系统调用,用户空间的应用程序,进入内核空间的时候。这时用户空间的进程往往要传递很多变量、参数的值给内核,内核在运行的时候也要保存用户进程所需要的一些寄存器值、变量等。

而我们所说的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值以及当时的环境等。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。通常一个任务的上下问主要由以下几个部分组成。分别是用户级上下文、寄存器上下文以及系统级上下文。用户级上下文主要包括正文、数据、用户堆栈以及共享存储区;寄存器上下文主要包括通用寄存器、程序寄存器、处理器状态寄存器、堆栈指标;系统级上下文:进程控制块task_struct、内存管理信息、内核栈。

内核任务

我们把内核中执行的一切活动对象称之为内核任务,每个内核任务都拥有一个独立的程序计数器、堆栈和一组寄存器。更重要的是它们都属于内核调度的范畴,我们可以在内核中交错地调用他们。内核任务主要包含“内核线程”、“系统调用”、“硬件中断”、“半底任务”等几类。

内核线程可以理解成在内核中运行的特殊进程,它有自己的“进程上下”,所以同样被进程调度程序调度,也可以睡眠,自动放弃CPU,这样和系统调用一样与系统中其它内核任务有共享数据的可能。总而言之,内核任务就是把任务活动中需要的资源、以及所操作的一切资源的活动对象的总和。

4   共享资源

在多任务的处理中,每个任务都是独立在运行,他们之间没有直接联系,由于其运行的独立性,它们并不知道其它任务的存在。但是,这些任务在运行时,都会使用某些公共的资源。而这些资源往往数有限,甚至由于其本身的性质,只能被某些任务单独占有。因此,这些资源不能允许用户随意使用.而应该使用一种机制,保证对资源的使用是满足系统的限制条件的。常见的机制有:锁、信号量等【3】

另外资源的共享又可以分为两种情况。一种是资料共享:应用程序使用多个任务,同时并行处理一组资料时,应该提供某种互斥机制,限制同时只有一个任务访问该组数据。计算中大量存在。另外一种是共享外部设各:多个应用程序同时访问独占性的外部设备。由于资源的有限、资源的本身属性、任务的特性等等共同构成了在任务调用资源或对资源进行访问的时候受到种种限制。这便要求我们进一步的优化资源的配置,优化任务的调度。

5原子操作

这与资源的保护有点类似。它的核心思想就是找到某种特定的方式,在一个资源被当前的任务访问的时候,其它任务不能访问相同的资源。这是实际上与互斥也很类似。常用的解决方案可以分为两类。一类是软件方法;一类是硬件方法。软件解决方法包括:关闭中断或关闭调度、使用锁变量、轮换法。硬件的使用这里就不做太多的介绍。本文的立足点主要是研究在任务调度使用时在软件上的同步机制,所以本文重点强调了这几个方面。