linux信号量与完成量

信号量:
   是用于保护临界区的一种常用方法,它的使用和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行
临界区的代码。但是与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待
状态。
#include <linux/semaphore.h>

struct semaphore {
raw_spinlock_t          lock;
unsigned int            count;
struct list_head        wait_list;
};

定义一个信号量:
struct semaphore sem;

初始化信号量:
void sema_init(struct semaphore *sem, int val);  //val为count的初始值
//初始化为1
#define init_MUTEX(sem) sema_init(sem, 1)
        //初始化信号量,并将信号量sem的值设置为0,就是在创建时就处于已锁定的状态
#define init_MUTEX_LOCKED(sem) sema_init(sem, 0)

定义并初始化:
DECLARE_MUTEX(sem);  //count的初始值为1

锁定信号量:
void down(struct semaphore *sem);//获得信号量,可能导致睡眠,不能再中断上下文中使用该函数

int down_interruptible(struct semaphore *sem);
返回非0值表示被信号(不是被UP)唤醒, if(down_interruptible(&sem) return -ERESTARTSYS;

int down_trylock(struct semaphore *sem);//尝试获取信号量sem
返回非0表示没有获取锁

if(count的值大于0)
将count减1后立即返回
else
进入睡眠, down_trylock不会进入睡眠

释放信号量:
void up(struct semaphore *sem);//释放信号量sem,实质上是把sem的值加1

count的值加1

if(有进程等待该信号量)
唤醒第一个等待该信号量的进程

完成量:
#include <linux/completion.h>

struct completion {
unsigned int done;
wait_queue_head_t wait;
}

定义:
struct completion com;

初始化:
init_completion(&com);
done的初始值为0

定义并初始化:
DECLARE_COMPLETION(com);
done的初始值为0

等待完成量:
void wait_for_completion(struct completion *com);
int wait_for_completion_interruptible(struct completion *com);
返回-ERESTARTSYS表示被信号唤醒, 0 completion

if(done的值不等于0)
将done减1后立即返回
else
进入睡眠

唤醒完成量:
void complete(struct completion *com);
将done的值加1, 然后唤醒第一个等待该完成量的进程

void complete_all(struct completion *com);
将done的值设为最大, 然后唤醒所有等待该完成量的进程

时间: 2024-07-28 18:48:49

linux信号量与完成量的相关文章

大话Linux内核中锁机制之完成量、互斥量

大话Linux内核中锁机制之完成量.互斥量 在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题.  八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等待另一个执行单元完成某事后方可执行,它是一种轻量级机制.事实上,它即是为了完成进程间的同步而设计的,故而仅仅提供了代替同步信号量的一种解决方法,初值被初始化为0.它在include\linux\completion.h定义. 如图8.1所示,对于执行单元

摄像头-linux上传完文件后,另一台Android手机自动下载这个可以实现么

问题描述 linux上传完文件后,另一台Android手机自动下载这个可以实现么 linux我用摄像头拍照上传到ftp去 但是我Android要一直看着ftp才能把它下下来 可以让它自动判断ftp状态 然后上传完了自动下下来么 解决方案 如果是简单的学生习作程序,另一个程序不断轮询服务器就可以了.

linux编程-在 Linux中写完 makefile make时出现下列的情况 怎么解决呀

问题描述 在 Linux中写完 makefile make时出现下列的情况 怎么解决呀 在 Linux中写完 makefile make时出现下列的情况 怎么解决呀 试了很多办法 附问题图片和makefile 解决方案 http://blog.csdn.net/jiaweizou/article/details/7546619 解决方案二: 根据你的错误提示看的话应该是没定义变量的问题-- 但这些变量貌似应该不是你定义的吧--可以试试把function5.c所依赖的头文件放在和function5

Linux驱动技术(八) _并发控制技术

为了实现对临界资源的有效管理,应用层的程序有原子变量,条件变量,信号量来控制并发,同样的问题也存在与驱动开发中,比如一个驱动同时被多个应用层程序调用,此时驱动中的全局变量会同时属于多个应用层进程的进程空间,这种情况下也要使用一些技术来实现对并发的控制.本文将讨论内核中下述并发控制技术的技术特点和应用场景. 1.中断屏蔽 2.原子操作  a.原子变量操作  b.原子位操作 3.自旋锁  a.传统自旋锁  b.读写自旋锁  c.顺序锁  d.RCU 4.信号量  a.传统信号量  b.读写信号量  

大话Linux内核中锁机制之原子操作、自旋锁【转】

转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题. 通常情况下,如图1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程1先对临界区完成操作,然

大话Linux内核中锁机制之RCU、大内核锁

大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linux内核中锁机制>系列博文进行了总结,并提出关于目前Linux内核中提供的锁机制的一些基本使用观点. 十.RCU机制 本节将讨论另一种重要锁机制:RCU锁机制.首先我们从概念上理解下什么叫RCU,其中读(Read):读者不需要获得任何锁就可访问RCU保护的临界

大话Linux内核中锁机制之原子操作、自旋锁

转至:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题. 通常情况下,如图1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程1先对临界区完成操作,

大话Linux内核中锁机制之信号量、读写信号量

大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容.  六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程才能执行临界区的代码:不同的是获取不到信号量时,进程不会原地打转而是进入休眠等待状态.它的定义是include\linux\semaphore.h文件中,结构体如图6.1所示.其中的count变量是计数作用,通过使用lock变量实现对count变量的

linux网络编程之System V 信号量(二)

用信号量实现进程互斥示例和解决哲学家就餐问题 一.我们在前面讲进程间通信的时候提到过进程互斥的概念,下面写个程序来模拟一下,程序流程如下图: 即父进程打印字 符O,子进程打印字符X,每次打印一个字符后要sleep 一下,这里要演示的效果是,在打印程序的边界有PV操作,故每个进 程中间sleep 的时间即使时间片轮转到另一进程,由于资源不可用也不会穿插输出其他字符,也就是说O或者X字符都会是成 对出现的,如OOXXOOOOXXXXXXOO.... 程序如下: #include<sys/types.