2019独角兽企业重金招聘Python工程师标准>>>

信号量(semaphore)是用亍保护临界区的一种常用方法
内核的信号量在概念和原理上不用户态的信号量是一样的,但是它不能在内核之外使用,内核信号量实际上是一种睡眠锁
原型:
/* Please don't access any members of this structure directly */
struct semaphore {
spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};

实例:
Ibmphp_hpc.c (\linux-2.6.30.4\drivers\pci\hotplug)
1声明
static struct semaphore semOperations; // lock all operations and

2 初始化
在函数 void __init ibmphp_hpc_initvars (void) 中
init_MUTEX (&semOperations);

其他的一些初始化方法

初始化信号量 
sema_init(struct semaphore *sem, int val); 
用于初始化信号量,并设置信号量sem的值为val 
init_MUTEX(struct semaphore *sem); 
用于初始化信号量,并将信号量sem的值设置为1 
init_MUTEX_LOCKED(struct semaphore *sem); 
用于初始化号量,并将信号量sem的值设置0;也就是
DECLARE_MUTEX(name); 
定义一个名称为name的信号量,并将信号量初始化为1 

3 使用

在函数 void ibmphp_lock_operations (void) 中
down (&semOperations);
使用down操作信号量可能会导致调用进程睡眠,直到等到信号量被其他调用者释放

调用down的进程不允许被中断,等待中处于D状态(可在top中查看)
如果不希望调用进程睡眠则应该使用down_trylock(&semOperations);
该凼数尝试获叏信号量sem;如果能够立卲获得,它就获得信号量并迒回0;否则,迒回非0值;它不会导致调用者睡眠,可以在中断上下文中使用 
如果希望调用者可以被用户中断则可以使用int down_interruptible(struct semaphore *sem); 
该函数获取信号量sem;如果信号量不可用,进程将被设置为TASK_INTERRUPTIBLE类型的睡眠状态 
该凼数由返回值来区分正常返回还是被信号中断返回;如果返回0,代表获取信号量正常返回;如果返回非0,
代表被信号打断 
4释放
void ibmphp_unlock_operations (void)
{
debug ("%s - Entry\n", __func__);
up (&semOperations);
to_debug = 0;
debug ("%s - Exit\n", __func__);
}
该凼数释放信号量sem;实质上是把sem的值加1,如
果sem的值为非正数,表明有任务等待该信号量,因
此需要唤醒等待者

附注:
down系列函数会使信号量的值减1
up会使信号量的值加1

转载于:https://my.oschina.net/tsuibin/blog/70511

Linux内核中的信号量解析相关推荐

  1. Linux内核中的vfs,解析 Linux 中的 VFS 文件系统机制

    在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构.Linux的最重要特征之一就是支持多种文件系统,这样它更加灵 活,并可以和许多其它种操作系统共存.由于系统已将Linux文件系统的 ...

  2. Linux内核中oops 错误解析以及问题定位

    目录 一.oops输出解析 二.工具 1.objdump 2.gdb 3.addr2line 4.decodecode 5.faddr2line 文档最后有完整的oops输出文件,此处将输出分成多个小 ...

  3. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  4. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  5. linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

  6. 关于linux内核中jiffies和jiffies_64解析

    1.前言 linux内核中定义了jiffies变量来记录从系统启动到当前时刻系统时钟所产生的tick数.jiffies变量是一个无符号整型数值,即unsigned long类型.     它的声明如下 ...

  7. Linux内核中内存管理相关配置项的详细解析3

    接前一篇文章:Linux内核中内存管理相关配置项的详细解析2 5. 2:1 compression allocator (zbud) 对应配置变量为:CONFIG_ZBUD. 此项默认为选中(如果前一 ...

  8. linux内核中的 哈希表_Linux内核中的设备模型及SCSI示例解析

    关于硬件架构 想要了解Linux操作系统的内核设备和驱动模型,最好先了解一下现在计算机硬件的架构.对计算机硬件有一定了解之后,对理解Linux内核中的设备和驱动模型非常有帮助.如图1是常规计算机的硬件 ...

  9. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  10. Linux内核中的内存管理(图例解析)

    一 ,内核管理内存的方式 (1)内核把物理页作为内存管理的基本单位,内存管理单元通常以页为单位进行处理,所以,从虚拟内存角度来看,页就是最小单位. 大多数32位系统支持4kb的页,64位系统支持8kb ...

最新文章

  1. Android--开发资源管理器/优化ListView显示列表方法
  2. Qt creator工程项目移植时因环境变换造成qmake错误的解决方案
  3. 力扣:12正数转罗马数字(python) 简单粗暴解决方法
  4. JSP页面中的pageEncoding和contentType两种属性
  5. CSS染色图标(图片)
  6. 计算机个性化定制服务课题,服务网络的构建与面向增量式需求的动态定制方法-计算机科学与技术专业论文.docx...
  7. 软件设计师学习3——操作系统知识1
  8. HDU 1301 - Jungle Roads( Prim求最小生成树 )
  9. mysql循环建表_MySQL循环建表和结合两表的update
  10. 【路径规划】基于matlab麻雀算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1582期】
  11. GJB1188A校验C语言算法
  12. 用台达PLC485通信控制11台英威腾变频启动停止速度设定
  13. 标准偏差:评价数据的离散程度
  14. epub与txt的区别是什么?有什么好用的IOS手机epub阅读器
  15. ssh与ftp连接免费使用
  16. RK3399 Android7.1以太网卡百兆网正常千兆网不能用
  17. 自建内网穿透服务器替换TeamViewer和向日葵,实现远程控制。
  18. ValueError: mode mismatch
  19. js日历(包含农历节假日)
  20. 本地计算机用户组,管理本地用户与组账户

热门文章

  1. poj 3264 Balanced Lineup RMQ问题
  2. python 进程池pool
  3. NodeMCU实现远程控制LED灯
  4. Entity Framework 代码先行之约定配置
  5. insert rows into heap/clustered table
  6. XStream的几个问题
  7. Entity Framework 笔记(一)
  8. ubuntu 14.04 下hadoop2.9.1 64位编译
  9. 使用dva框架的总结
  10. HDU1760 A New Tetris Game NP态