zoukankan      html  css  js  c++  java
  • 同步、互斥、阻塞

    实现

    使驱动程序只能同时被一个应用程序操作。

       

    幕后:m+1

    ①把变量m加载到寄存器

    ②执行寄存器运算,并把运算结果保存到

    ③把运算结果写回内存

     

    单任务系统

    当应用程序open某个驱动时,只需使用一个全局变量标记,再有其他应用程序打开这个驱动时,则直接退出(打开失败)。

       

    多任务系统

    1. 由于修改变量的值,并不是一步到位的,而是需要使用多个指令,才能完成最终的操作;

     

    当app1执行完①(未真正修改到存储于内存的变量),cpu紧接着执行app2部分的指令,将导致两个app读到的f_open值是一样的(设初次打开),那么将导致驱动在同一时间内,并不是被唯一的app操作!

     

    在多任务系统中,实现使驱动程序只能同时被一个应用程序操作的方法:原子操作、信号量

    1. 原子操作

    原子操作指的是在执行过程中不会被别的代码路径所中断的操作。

    常用原子操作函数举例:

    atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0

    atomic_read(atomic_t *v); //返回原子变量的值

    void atomic_inc(atomic_t *v); //原子变量增加1

    void atomic_dec(atomic_t *v); //原子变量减少1

    int atomic_dec_and_test(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false

       

    2. 信号量

    信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。

    当获取不到信号量时,进程进入休眠等待状态。

       

    定义信号量

    struct semaphore sem;

    初始化信号量

    void sema_init (struct semaphore *sem, int val);

    void init_MUTEX(struct semaphore *sem);//初始化为0

       

    static DECLARE_MUTEX(button_lock); //定义互斥锁

       

    获得信号量

    void down(struct semaphore * sem);

    int down_interruptible(struct semaphore * sem);

    int down_trylock(struct semaphore * sem);

    释放信号量

    void up(struct semaphore * sem);

       

    3. 阻塞

    阻塞操作

    是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。

    被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。

       

    非阻塞操作

  • 相关阅读:
    无线安全
    下载安装Emacs和基本配置--待更新中
    uv-pv-vv的区别
    tesseract安装及问题处理
    POJ 2187 Beauty Contest【凸包周长】
    POJ 1113 Wall【凸包周长】
    POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
    POJ 2031 Building a Space Station【经典最小生成树】
    URAL 1181 Cutting a Painted Polygon【递归+分治】
    POJ 1845-Sumdiv【经典数学题目---求因子和】
  • 原文地址:https://www.cnblogs.com/lilto/p/11878443.html
Copyright © 2011-2022 走看看