linux内核同步方式--信号量

原创 2012年03月21日 11:06:00
Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列(具体可以参考进程的活动状态),然后让其睡眠,此时处理器能重获自由,而去执行其他代码.当持有信号量的进程将信号量释放后,处于等待队列中的那个进程会被唤醒,并获得该信号量.
所以和自旋锁的区别是:
1)信号量适用于锁会被长时间持有的情况
2)持有信号量锁的线程可以睡眠,而持有自旋锁的线程是不允许睡眠的
3)信号锁不会禁止内核抢占
4)最重要的信号锁同时允许任意数量的锁持有者,而自旋锁在同一时刻最多只允许一个任务持有他
因为不受睡眠的限制,所以信号量锁用起来要方便一些.

信号量锁的持有者数目可以在声明信号量时指定.当信号量的持有者被声明为只允许一个持有者时,此时的信号量又被称为互斥信号量.
在适用信号量的时候基本上用到的都是互斥信号量.

信号量的接口:
信号量的实现是与体系结构相关,具体实现定义在<asm/semaphore.h>文件中.
struct semaphore类型用来表示信号量:
static DECLARE_SEMAPHORE_GENERIC(name,count);//name为信号量的名字,count为持有者数目.
创建更为普通的互斥信号量:
static DECLARE_MUTEX(name);

当动态创建信号量时,可是使用:
sema_init(sem,count);//初始化,sem是指针变量,count是持有者数目
初始化一个动态创建的互斥信号量时使用以下函数:
init_MUTEX(sem);//同样sem是指针

使用down_interruptible()试图获得指定的信号量,如果失败,进程会以TASK_INTERRUPTIBLE状态进入睡眠.
使用down_trylock(),可以尝试以非堵塞的方式来获得指定的信号量,在信号量已被占用时,立刻返回非0值;否则返回0,并立刻让你成功持有信号量锁.
使用up(),则是可以释放指定的信号量.

与自旋锁一样,信号量也有读写信号量,读写信号在内核中是由rw_semaphore结构表示,定义在<linux/rwsem.h>文件中.具体接口就不细说了.

Linux内核同步机制之信号量与锁

Linux内核同步控制方法有很多,信号量、锁、原子量、RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率。首先,看看我们最熟悉的两种机制——信号量、锁。 一、信号量 首先还是看看内核中...

Linux内核同步机制之信号量与锁

作者:bullbat           Linux内核同步控制方法有很多,信号量、锁、原子量、RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率。首先,看看我们最熟悉的两种机制——信号...
  • bullbat
  • bullbat
  • 2012年03月21日 09:10
  • 3843

linux内核同步(4)--信号量

任务获取一个已经被占用的信号量,信号量将其推进一个等待队列,然后让其睡眠,CPU去执行其他代码。当持有信号量的进程将信号释放,处于等待队列汇总的任务被唤醒,并获取信号量。         ...

LINUX内核信号量设计与实现.rar

  • 2010年03月26日 10:06
  • 117KB
  • 下载

Linux内核之自旋锁和信号量

Linux内核实现了多种同步方法,指令级支持的原子操作、自旋锁、信号量、互斥锁、完成量、大内核锁等等,我就挑比较有代表性的两个锁——自旋锁和信号量来分析。 自旋锁 Linux内核中最常用的锁就是自旋锁...

Oracle安装-Linux内核参数-共享内存信号量设置

Oracle数据库在linux系统上的安装过程中,涉及到设置linux内核参数; 这些内核参数究竟代表什么含义,如何调整这些参数?   kernel.shmall = 2097152 # 可以使...

LINUX内核信号量设计与实现

LINUX内核信号量设计与实现 tao...
  • myspor
  • myspor
  • 2011年04月12日 10:27
  • 6745

linux内核学习-6信号量(关注新浪微博:寂寞侵蚀的岁月(4000多篇技术分享))

#include // 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。8 #include // 内核头文件。...
  • xizmi
  • xizmi
  • 2015年04月21日 11:57
  • 609

Linux内核中的互斥操作(1)——信号量

*看了一段时间Linux内核源代码了,经常会在代码中看到down()、up()、spin_lock()、spin_unlock()、read_lock()、write_lock()、read_unlo...

Linux内核源码之信号量的实现

之前的一片博客介绍了用于Linux内核同步的自旋锁,即使用自旋锁来保护共享资源,今天介绍另外一种Linux内核同步机制——信号量。信号量在内核中的使用非常广泛,用于对各种共享资源的保护。信号量与自旋锁...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux内核同步方式--信号量
举报原因:
原因补充:

(最多只允许输入30个字)