深入浅出Linux设备驱动之并发控制

2016-01-29 17:40 4 1 收藏

深入浅出Linux设备驱动之并发控制,深入浅出Linux设备驱动之并发控制

【 tulaoshi.com - Linux 】

  在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发"竞态",因此我们必须对共享资源进行并发控制。Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。

  自旋锁与信号量"类似而不类",类似说的是它们功能上的相似性,"不类"指代它们在本质和实现机理上完全不一样,不属于一类。

  自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,"自旋"就是"在原地打转"。而信号量则引起调用者睡眠,它把进程从运行队列上拖出去,除非获得锁。这就是它们的"不类"。

  但是,无论是信号量,还是自旋锁,在任何时刻,最多只能有一个保持者,即在任何时刻最多只能有一个执行单元获得锁。这就是它们的"类似"。

  鉴于自旋锁与信号量的上述特点,一般而言,自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用;信号量适合于保持时间较长的情况,会只能在进程上下文使用。如果被保护的共享资源只在进程上下文访问,则可以以信号量来保护该共享资源,如果对共享资源的访问时间非常短,自旋锁也是好的选择。但是,如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。

  与信号量相关的API主要有:

  定义信号量

struct semaphore sem;


  初始化信号量

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


  该函数初始化信号量,并设置信号量sem的值为val

void init_MUTEX (struct semaphore *sem);


  该函数用于初始化一个互斥锁,即它把信号量sem的值设置为1,等同于sema_init (struct semaphore *sem, 1);

void init_MUTEX_LOCKED (struct semaphore *sem);


  该函数也用于初始化一个互斥锁,但它把信号量sem的值设置为0,等同于sema_init (struct semaphore *sem, 0);

  获得信号量

void down(struct semaphore * sem);


  该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用;

int down_interruptible(struct semaphore * sem);


  该函数功能与down类似,不同之处为,down不能被信号打断,但down_interruptible能被信号打断;

int down_trylock(struct semaphore * sem);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)


  该函数尝试获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,返回非0值。它不会导致调用者睡眠,可以在中断上下文使用。

  释放信号量

void up(struct semaphore * sem);


  该函数释放信号量sem,唤醒等待者。

  与自旋锁相关的API主要有:

  定义自旋锁

spinlock_t spin;


  初始化自旋锁

spin_lock_init(lock)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)


  该宏用于动态初始化自旋锁lock

  获得自旋锁

来源:http://www.tulaoshi.com/n/20160129/1502469.html

延伸阅读
标签: Web开发
众所周知,网站制作涉及到了各个方面的知识,包括平面设计、HTML页面制作、CSS样式定义、客户端脚本编写(JavaScrfipt/VBScript)、服务器端脚本编写(Asp/Asp.Net/PHP/JSP)等诸多内容。本期笔者从最基础的讲起,着重介绍怎样制作一个简单的HTML网站,初步体会一下其中的乐趣。 1.这里笔者使用的网页制作工具是Dreamweaver。首先运行...
标签: Web开发
事件是用来通知使用控件的程序员,某件事情发生了,好让程序员可以相应的处理。事件在VB编程中比比皆是,例如,当鼠标点击控件事会发生Click事件,文本框内容改变了会发生Change事件,等等。但这儿要讲的不同于这些东西,也不同于InitProperties,ReadProperties,WriteProperties前面提到过的事件,那些是系统已经定义好了的。我们要做的是定义自...
随着计算机网络技术的突飞猛进,网络安全的问题已经日益突出地摆在各类用户的面前。仅从笔者掌握的资料表明,目前在互联网上大约有将近20%以上的用户曾经遭受过黑客的困扰。尽管黑客如此猖獗,但网络安全问题至今仍没有能够引起足够的重视,更多的用户认为网络安全问题离自己尚远,这一点从大约有40%以上的用户特别是企业级用户没有安装防火墙(...
设置MySQL数据同步(单向&双向)由于公司的业务需求,需要网通和电信的数据同步,就做了个MySQL的双向同步,记下过程,以后用得到再翻出来,也贴出来供大家参考。 一、准备服务器 由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版...
一、引子 俗话说:世上难买后悔药。所以凡事讲究个“三思而后行”,但总常见有人做“痛心疾首”状:当初我要是……。假如真的有《大话西游》中能时光倒流的“月光宝盒”,那这世上也许会少一些伤感与后悔——当然这只能是痴人说梦了。 !-- frame contents -- !-- /frame contents -- 但是在我们手指...

经验教程

674

收藏

45
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部