- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信号量、互斥体和自旋锁
分类: linux 系统 linux 驱动2014-02-20 11:06 83人阅读 评论(0) 收藏举报
一、信号量
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共
享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享
内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:
(1) 测试控制该资源的信号量。
(2 ) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
(3 ) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大
于0,进程被唤醒,转入步骤(1)。
(4 ) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正
在睡眠等待此信号量,则唤醒此进程。
维护信号量状态的是Linux 内核操作系统而不是用户进程。我们可以从头文件
/usr/src/linux/include/linux/sem.h 中看到内核用来维护信号量状态的各个结构的定义。信号
量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是
semget ,用以获得一个信号量ID。Linux2.6.26下定义的信号量结构体:
struct semaphore {
spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
从以上信号量的定义中,可以看到信号量底层使用到了spin lock 的锁定机制,这个spinlock
主要用来确保对count 成员的原子性的操作(count--)和测试(count 0)。
1.信号量的P 操作:
(1).void down(struct semaphore *sem);
(2).int down_interruptible(struct semaphore *sem);
(3).int down_trylock(struct semaphore *sem);
说明:
(1)中的函数根据2.6.26 中的代码注释,这个函数已经out 了(Use of this function is
deprecated) ,所以从实用角度,彻底忘了它吧。
(2)最常用,函数原型
/**
* down_interruptible - acquirethe semaphore unless interrupted
* @sem: the semaphore to beacquired
*
* Attempts to acquire thesemaphore. If no more tasks are allowedto
* acquire the semaphore,calling this function will put the task to sleep.
* If the sleep is interruptedby a signal, this function will return -EINTR.
* If the semaphore issuccessfully acquired, this function returns 0.
*/
int down_interruptible(structsemaphore *sem)
{
unsigned long flags;
int result = 0;
spin_lock_irqsave(sem-lock,flags);
if (likely(sem-count 0))
sem-count--;
else
result = __down_interruptible(sem);
spin_unlock_irqrestore(sem-lock,flags);
return result;
}
对此函数的理解:在保证原子操作的前提下,先测试count 是否大于0,如果是说明可以获
得信号量,这种情况下需要先将count-- ,以确保别的进程能否获得该信号量,然后函数返
回,其调用者开
文档评论(0)