Linux设备驱动程序学习(3)-并发和竞态

Linux设备驱动程序学习(3)-并发和竞态

ID:37853549

大小:32.98 KB

页数:12页

时间:2019-06-01

Linux设备驱动程序学习(3)-并发和竞态_第1页
Linux设备驱动程序学习(3)-并发和竞态_第2页
Linux设备驱动程序学习(3)-并发和竞态_第3页
Linux设备驱动程序学习(3)-并发和竞态_第4页
Linux设备驱动程序学习(3)-并发和竞态_第5页
资源描述:

《Linux设备驱动程序学习(3)-并发和竞态》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux设备驱动程序学习(3)-并发和竞态今天进入《Linux设备驱动程序(第3版)》第五章并发和竞态的学习。对并发的管理是操作系统编程中核心的问题之一。并发产生竞态,竞态导致共享数据的非法访问。因为竞态是一种极端低可能性的事件,因此程序员往往会忽视竞态。但是在计算机世界中,百万分之一的事件可能没几秒就会发生,而其结果是灾难性的。一、并发及其管理竞态通常是作为对资源的共享访问结果而产生的。在设计自己的驱动程序时,第一个要记住的规则是:只要可能,就应该避免资源的共享。若没有并发访问,就不会有竞态。这种思想的最明显的应用是避免使用全局变量。但是,资源

2、的共享是不可避免的,如硬件资源本质上就是共享、指针传递等等。资源共享的硬性规则:(1)在单个执行线程之外共享硬件或软件资源的任何时候,因为另外一个线程可能产生对该资源的不一致观察,因此必须显示地管理对该资源的访问。--访问管理的常见技术成为“锁定”或者“互斥”:确保一次只有一个执行线程可操作共享资源。(2)当内核代码创建了一个可能和其他内核部分共享的对象时,该对象必须在还有其他组件引用自己时保持存在(并正确工作)。对象尚不能正确工作时,不能将其对内核可用。二、信号量和互斥体一个信号量(semaphore:旗语,信号灯)本质上是一个整数值,它和一对函

3、数联合使用,这一对函数通常称为P和V。希望进入临届区的进程将在相关信号量上调用P;如果信号量的值大于零,则该值会减小一,而进程可以继续。相反,如果信号量的值为零(或更小),进程必须等待知道其他人释放该信号。对信号量的解锁通过调用V完成;该函数增加信号量的值,并在必要时唤醒等待的进程。当信号量用于互斥时(即避免多个进程同是在一个临界区运行),信号量的值应初始化为1。这种信号量在任何给定时刻只能由单个进程或线程拥有。在这种使用模式下,一个信号量有事也称为一个“互斥体(mutex)”,它是互斥(mutualexclusion)的简称。Linux内核中几乎

4、所有的信号量均用于互斥。使用信号量,内核代码必须包含。以下是信号量初始化的方法:/*初始化函数*/voidsema_init(structsemaphore*sem,intval);由于信号量通常被用于互斥模式。所以以下是内核提供的一组辅助函数和宏:/*方法一、声明+初始化宏*/DECLARE_MUTEX(name);DECLARE_MUTEX_LOCKED(name);/*方法二、初始化函数*/voidinit_MUTEX(structsemaphore*sem);voidinit_MUTEX_LOCKED(structsemaphore*sem

5、);/*带有“_LOCKED”的是将信号量初始化为0,即锁定,允许任何线程访问时必须先解锁。没带的为1。*/P函数为:voiddown(structsemaphore*sem);/*不推荐使用,会建立不可杀进程*/intdown_interruptible(structsemaphore*sem);/*推荐使用,使用down_interruptible需要格外小心,若操作被中断,该函数会返回非零值,而调用这不会拥有该信号量。对down_interruptible的正确使用需要始终检查返回值,并做出相应的响应。*/intdown_trylock(st

6、ructsemaphore*sem);/*带有“_trylock”的永不休眠,若信号量在调用是不可获得,会返回非零值。*/V函数为:voidup(structsemaphore*sem);/*任何拿到信号量的线程都必须通过一次(只有一次)对up的调用而释放该信号量。在出错时,要特别小心;若在拥有一个信号量时发生错误,必须在将错误状态返回前释放信号量。*/在scull中使用信号量其实在之前的实验中已经用到了信号量的代码,在这里提一下应该注意的地方:在初始化scull_dev的地方:/*Initializeeachdevice.*/  for(i=0;

7、i  scull_nr_devs;i++){      scull_devices.quantum=scull_quantum;      scull_devices.qset=scull_qset;      init_MUTEX(&scull_devices.sem);/*注意顺序:先初始化好互斥信号量,再使scull_devices可用。*/      scull_setup_cdev(&scull_devices,i);  }而且要确保在不拥有信号量的时候不会访问scull_dev结构体。读取者/写入者信号量只读任务可并行完成它们的工作,而

8、不需要等待其他读取者退出临界区。Linux内核提供了读取者/写入者信号量“rwsem”,使用是必须包括。初始化:voidi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。