作家
登录

Linux设备驱动中的并发控制

作者: 来源: 2017-11-07 09:07:06 阅读 我要评论

3).获得自旋锁

  1. spin_lock(lock);//该宏用于加锁,如不雅可以或许急速获得锁,它就能立时返回,不然,他将自旋在那边,直到该自旋锁的保持者释放。 
  2.  
  3. spin_trylock(lock);//可以或许获得,则返回真,不然返回假,实际上是不在原地打转罢了。 

4).释放自旋锁

例子:

这几个互斥的介绍:

  1. spinlock_t lock; 
  2.  
  3. spin_lock_init(&lock); 
  4.  
  5. spin_lock(&lock); //获取自旋锁,保护临界区。。。。临界区 
  6.  
  7. spin_unlock(&lock);//释放自旋锁 

自旋锁不关怀锁定的临界区毕竟是若何履行的。不管是读操作照样写操作,实际上,对共享资本进行攫取的时刻是应当可以允很多个履行单位同时拜访的,那么如许的话,自旋锁就有了弊病。于是逼揭捉?生出来一个读写锁。

它保存了自旋的特点,但在对操作膳绫擎可以许可有多个单位过程同时操作。当然,读和写的时刻不克不及同时进行。

总结:

如今又有问题了,如不雅我第一个过程写共享资本,第二个过程读的话,一旦写了,那么就读不到了,可能写的器械比较多,然则第二个过程读很小,那么能不克不及第一个过程写的同时,我第二个过程读呢?

当然可以,那么引出了次序锁的概念。都是一样的操作。

**********************************************************************************************************************************************************

是用于保护临界区的一种常用的办法,它的应用与自旋锁差不多,然则它不在原地打转,当获取不到旌旗灯号量时刻,过程会进入休眠等待状况。

重要操作:

1).定义sem旌旗灯号量

  1. struct semaphore sem; 

2).初始化旌旗灯号量

  1. void sema_init(struct semaphore *sem, int val); 

初始化旌旗灯号量,并设置sem的值为val

初始化的时刻还可以如许用,init_MUTEX(sem),这是个宏 #define init_MUTEX(sem) sema_init(sem , 1)

init_MUTEX_LOCKED(sem),这是个宏 #define init_MUTEX_LOCKED(sem) sema_init(sem , 0)

3).获得旌旗灯号量

  1. void down(struct semaphore * sem); 

该函数用于获得旌旗灯号量sem,他会导致睡眠,所以不克不及在中断中应用。

  1. int down_interruptible(struct semaphore* sem); 

旌旗灯号量一般如许应用:

与膳绫擎功能类似,因为down进入睡眠状况的过程不克不及被旌旗灯号打断,而它能被旌旗灯号打断,旌旗灯号也会导致该函数返回。

  1. int down_trylock(struct semaphore * sem); 

4).释放旌旗灯号量

  1. void up(struct semaphore * sem); 
  1. spin_unlock(lock); 

该函数用于释放旌旗灯号量,同时唤醒等待者。

  1. DECLARE_MUTEX(sem); 
  2.  
  3. down(&sem); 
  4.  
  5. .....临界区 
  6.  
  7. up(&sem); 

linux自旋锁和旌旗灯号量采取的“获取锁-拜访临界区-释放锁”的方法。

*************************************************************************************************************************

5.互斥体

互斥体和旌旗灯号量根本上差不多。不介绍了。

并发和竞态广泛存在,这几个机制是解决问题的好办法,中断樊篱很少零丁应用,原子操作只能针半数数进行,是以,自旋锁和旌旗灯号量应用最为广泛。

自旋锁会导致逝世轮回,锁按时代不许可壅塞,是以请求锁定的临界区要小。旌旗灯号量许可临界区壅塞,可以实用于临界区较大年夜的情况。读写自旋锁和读写旌旗灯号量是放宽了前提的自旋锁和旌旗灯号量,他们允很多个过程并发的攫取共享空间。

一个fifo的综合例子

  1. /*====================================================================== 
  2.     A globalfifo driver as an example of char device drivers   

      推荐阅读

      看看60万码农怎么评论:这世界上还有没有月薪低于3万的程序员?

    IT界一位大年夜神早已下过定论:“对于那些月薪三万以下,自称法度榜样员的码农们,其实我们大年夜来没有把他们归为我们法度榜样员的部队。他们固然老是以法度榜样员自居,但只是他们>>>详细阅读


    本文标题:Linux设备驱动中的并发控制

    地址:http://www.17bianji.com/lsqh/38523.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)