- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章设备驱动中的并发报告
第7章 设备驱动中的并发控制 现代操作系统有三大特性:中断处理、多任务处理和多处理器(SMP)。这些特性导致当多个进程、线程或者CPU同时访问一个资源时,可能导致错误,这些错误是操作系统运行所不允许的。在操作系统中,内核需要提供并发控制机制,对公用资源进行保护。本章将对保护这些公用资源的方法进行简要的介绍。 7.1 并发与竞争 并发是指在操作系统中,一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。并发容易导致竞争的问题。竞争就是两个或者两个以上的进程同时访问一个资源,从而引起资源的错误。 7.2 原子变量操作 原子变量操作是Linux中提供的一种简单的同步机制。原子变量操作是一种在操作过程中不会被打断的操作,所以在内核驱动程序中非常有用。本节对Linux中原子变量的操作进行详细的分析。 7.2.1 原子变量操作 所谓原子变量操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断。也就说,原子变量操作是一种不可以被打断的操作。原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。 7.2.2 原子整形操作 有时候需要共享的资源可能只是一个简单的整形数值。例如在驱动程序中,需要对包含一个count的计数器。这个计数器表示有多少个应用程序打开了设备所对应的设备文件。通常在设备驱动程序的open()函数中,将count变量加1。在close()函数中,将count减1。如果只有一个应用程序执行打开和关闭操作,那么这里的count计数不会出现问题。但是如果有多个应用程序同时打开或者关闭设备文件,那么就可能导致count多加或者少加,出现错误。 为了避免这个问题,内核提供了一个原子整形变量,称为atomic_t。 7.2.3 原子位操作 除了原子整数操作外,还有原子位操作。原子位操作是根据数据的每一位单独进行操作。根据体系结构的不同,原子位操作函数的实现也不同。 7.3 自旋锁 自旋锁是一种简单的并发控制机制,其是实现信号量和完成量的基础。自旋锁对资源有很好的保护作用,在Linux驱动程序中进程使用,本节将对自旋锁进行详细的介绍。 7.3.1 自旋锁概述 在Linux中提供了一些锁机制来避免竞争条件,最简单的一种就是自旋锁。引入锁的机制,是因为单独的原子操作不能满足复杂的内核设计需要。例如,当一个临界区域要在多个函数之间来回运行时,原子操作就显得无能无力了。 Linxu中一般可以认为有两种锁,一种是自旋锁,另一种是信号量。这两种锁是为了解决内核中遇到的不同问题开发的。其实现机制和应用场合有所不同,下文将分别对这两种锁机制进行介绍。 7.3.2 自旋锁的使用 在Linux中,自旋锁的类型为struct spinlock_t。内核提供了一系列的函数来对struct spinlock_t进行操作。下面将对自旋锁的操作方法进行简要的介绍。 1.定义和初始化自旋锁 2.锁定自旋锁 3.释放自旋锁 4.使用自旋锁 7.3.3 自旋锁的使用注意事项 在使用自旋锁时,有几个注意事项需要读者理解,这几个注意事项是: 自旋锁是一种忙等待。 自旋锁不能递归使用。 7.4 信号量 本节介绍锁的另一种实现机制,这种机制就是Linux中常用的信号量。Linux中提供了两种信号量,一种用于内核程序中,一种用于应用程序中。由于这里讲解的是内核编程的知识,所以只对内核中的信号量进行详细讲述。 7.4.1 信号量概述 和自旋锁一样,信号量也是保护临界资源的一种有用方法。信号量与自旋锁的使用方法基本一样。与自旋锁相比,信号量只有当得到信号量的进程或者线程才能够进入临界区,执行临界代码。信号量与自旋锁的最大不同点在于,当一个进程试图去获取一个已经锁定的信号量时,进程不会像自旋锁一样在远处忙等待,在信号量中采用了另一种方式,这中方式如下所述。 7.4.2 信号量的实现 根据不同的平台,其提供的指令代码有所不同,所以信号量的实现也有所不同。 下面详细介绍一下这个结构体的各个成员变量: 1.lock自旋锁 2.count变量 3.等待队列 7.4.3 信号量的使用 在Linux中,信号量的类型为struct semaphore。内核提供了一系列的函数来对struct semaphore进行操作。下面将对信号量的操作方法进行简要的介绍。 1.定义和初始化自旋锁 2.锁定信号量 3.释放信号量 4.使用信号量 5.信号量用于同步操作 7.4.4 自旋锁与信号量的对比 自旋锁和信号量是解决并发控制的两个很重要的方法。在使用时,应该如
文档评论(0)