Linux设备驱动第五章(并发和竞争)读书笔记.docVIP

Linux设备驱动第五章(并发和竞争)读书笔记.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux设备驱动第五章(并发和竞争)读书笔记

Linux设备驱动第五章(并发和竞争)读书笔记 第5章 并发和竞争 参考文章:/u1/34474/showart.php?id=408682 5.3旗标和互斥体 1)旗标的核心是一个单个整型值。结合一对函数来实现,也称“PV操作”。 一个想进入临界区的进程在相关旗标上调用P,如果旗标值大于0,这个值递减1,并且进程继续。如果旗标小 于或者等于0,说明该旗标已经被其他进程占用,此时进程必须等待知道旗标被释放。 解锁旗标,也就是释放旗标,通过调用V操作来完成,V操作递增旗标的值,并且可以唤醒等待该旗标的进程 。 2)互斥体 作用是:互斥,阻止多个进程同时在同一临界区内运行。互斥体也就是值初始化为1的旗标。因为 :初始化为1,当第一个进程P操作时,10,所以进程得以运行,同时旗标递减1,值为0,此时第2个进程想 获得该旗标用来访问临界区,却发现旗标值为0,因此进程2不能运行一直到进程1释放该旗标。 5.3.1 LINUX旗标实现 1)要使用旗标,必须包含asm/semaphore.h.相关的类型是 struct semaphore; 2)旗标的实现:创建一个旗标, 接着使用 sema_init 来设定它 例如: struct semaphore *sem;//定义旗标 sema_init(sem,val);//初始化旗标 val为初始化旗标的值。 3)通常,旗标是以互斥锁的模式使用。因此内核提供了一系列的宏来初始化。 DECLARE_MUTEX(name); //初始化一个互斥锁,值为1 DECLARE_MUTEX_LOCKED(name);//初始化一个互斥锁,值为0 就是:旗标初始化后就不可用。 任何要使用该旗标的进程都要先解锁它再使用。 当我们需要在运行时间初始化(也就是动态创建)我们使用: void init_MUTEX(struct semaphore *sem);//初始化一个互斥锁,值为1 void init_MUTEX_LOCKED(struct semaphore *sem);初始化一个互斥锁,值为0 例如:我们要创建一个初始化为0的互斥锁: struct semaphore *sem;//定义旗标 ECLARE_MUTEX_LOCKED(sem);//初始化旗标值为0。 以上是初始化旗标,初始化后我们当然就要使用旗标了,不然创建它有何意义? 4)旗标的获取与释放(也可以成为互斥锁,因为LINUX中基本上所有的旗标都用来互斥) 获取旗标也称P操作,也叫down。down字面意思就是下降的意思。相对于旗标来说就是减1。 p函数如下: void down(struct semaphore *sem); /*不推荐使用,会建立不可杀进程*/ int down_interruptible(struct semaphore *sem);/*推荐使用,使用down_interruptible需要格外小心,若操作被中断,该函数会返回非零值,而调用这不会拥有该信号量。对down_interruptible的正确使用需要始终检查返回值,并做出相应的响应。*/ int down_trylock(struct semaphore *sem);/*带有“_trylock”的永不休眠,若信号量在调用是不可获得,会返回非零值。*/ 我们一般使用down_interruptible函数就好。书中推荐滴。 一旦获取了旗标,则获取旗标的进程就可以存取该旗标保护的临界区了。当使用完后,要怎么办?当然是丢弃对临界区的控制,也就是释放旗标。 释放旗标也称V操作,也叫UP,up字面意思就是上升的意思。相对于旗标来说就是加1。(down和up形象的描述了对旗标的操作)。 V函数如下: void up(struct semaphore *sem); 一旦调用UP,进程就不在拥有旗标了。 5)使用旗标的容易犯错误 获得旗标的进程使用对UP的调用来释放旗标,但不能多次调用UP,就是说:一个down对于一个UP。 在持有旗标遇到错误时,我们必须在return(错误状态)是调用UP释放旗标,不然临界区一直被该进程占有,但也许该进程已经被kill了,而其他要使用临界区的进程就会因一直得不到临界区而一直挂起。 5.3.2. 在 scull 中使用旗标 正确使用加锁原语的关键是严密地指定要保护哪个资源并且确认每个对这些资源的存取都使用了正确的加锁方法. 首先看看一个scull结构体: struct scull_dev { struct scull_qset *data; /*

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档