zoukankan      html  css  js  c++  java
  • 【Linux-驱动】驱动策略----信号量


    访问共享资源的代码区块叫“临界区”,临界区需要以某种互斥机制加以保护:自旋锁、信号量等。
    互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。

    信号量:在Liunx中的信号量是一种睡眠锁。假如进程A先持有信号量F,然后进程B试图获取已经被进程A持有的信号量F时(假如信号量F资源值为1),信号量会将B进程推入等待队列,然后让

                其睡眠。当持有信号量的进程A将信号量F释放后,进程B才会被唤醒,从而获得这个信号量,继续执行进程B代码。
                PS:信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;信号量只能在进程中使用,不能再中断中使用。
    信号量基本使用形式:
         (1) 定义信号量:struct semaphore sem;
         (2) 初始化信号量:void sema_init(struct semaphore *sem, int val);
         (3) 初始化互斥信号量:
               void init_MUTEX(struct semaphore *sem);
               等同于:sema_int(struct semaphore*sem, 1);
    获得信号量:
         (1) void down(struct semaphore *sem);
              此函数用于获得信号量sem,它会导致睡眠,因此不能用于中断上下文
         (2) int down_interruptible(struct semaphore *sem);
              同down(),差异在于因为down()而进入睡眠状态的进程不能被信号打断,而因为down_interruptible()而进入睡眠状态的进程能被信号打断,而信号会导致该函数返回,这时候函数返回非0;
         (3) int down_trylock(struct semaphore *sem);
              该函数尝试获得信号量sem,如果能够立即获得,它就获得该信号量返回0,否则,返回非0值,它不能导致调用者睡眠,可以在中断上下文使用。
    释放信号量:
         void up(struct semaphore *sem);
         该函数释放信号量sem,唤醒等待者。

    使用信号量的注意事项:
          (1)可以长期加锁;
          (2)只能用于进程上下文,不能用于中断上下文;
          (3)在持有自旋锁的同时,不能持有信号量;

  • 相关阅读:
    nvm安装node的问题
    前端必读:浏览器内部工作原理
    读书笔记:《高性能网站建设指南》
    学习前端我读过的书
    Canvas绘制圆形进度条
    gitlab升级方法
    设置root远程连接ubuntu上mysql
    SpringMVC的@ResponseBody返回JSON,中文乱码问题的解决.
    JSTL 格式化输出 Calendar
    在Maven的配置文件中,自定义私有仓库地址和设置下载的jar包的保存位置
  • 原文地址:https://www.cnblogs.com/jamesharden/p/6298477.html
Copyright © 2011-2022 走看看