【讯为Linux驱动开发】5.并发与竞争

并发:一个CPU在一个时间片只能执行一个任务,切换速度很快。

并行:双核CPU,真正的同时执行两个任务

 并行就是并发的理想情况,统称并发。

【问】Linux在什么情况下产生并发?

1.中断中修改公共资源

2.抢占式并发访问:正在执行的进程随时可能被抢占

3.多核处理器并发访问

【问】并发时我们需要怎么做?

保护共享资源

【问】共享资源有什么?

全局变量、驱动设备结构体、共享数据....

【原子操作】 atomic(保护进程)

原子操作是一个最小单位的执行操作,在执行完前不可以被任何操作打断

用于保护一个整型单位或者位。

 【原子操作 驱动程序】

static atomic64_t v = ATOMIC_INIT(1); //定义一个原子变量v,初值为1

static int cdev_open(struct inode *inode, struct file *filp)
{
    /*****************************************/
    file->private_data = &dev1; //指向设备结构体
    return 0;
}

static int cdev_open(struct inode *inode, struct file *filp)
{
    if( !atomic64_dec_and_test(&v)){        // -1
        atomic64_inc(&v);                  // +1
        return -EBUSY;                    //返回错误
    }
    
    file->private_data = &dev1; //指向设备结构体
    return 0;
}

 分析:

假如A进入驱动函数,v的值为1,v-1为0,v = 返回1,取反等于0,不满足要求,则执行下面的私有数据。

A在使用OPEN函数,此时B进入驱动函数,v的值为0,返回值为0,取反为1,进入if函数,返回EBUSY错误指令。

【APP】

int main(int argc, char *argv[])
{
   int fd1;
   char buf1[32] = "ni hao test1!";
   
   fd1 = open("/dev/test1", HELLO);  /* 打开设备节点1 */   
   sleep(5);  /* 延时5秒,为了实验效果*/
   close(fd1);
  
   return 0;  
}

生成a.out ,复制一个为b.out

【实验效果】

执行a.out后马上执行b.out返回error,因为a.out中有五秒延时占用程序。

过五秒后执行b.out即执行正常。

相关推荐

  1. Linux驱动开发】4.文件私有数据

    2024-06-13 06:44:02       28 阅读
  2. Linux驱动开发】3.内核空间和用户空间

    2024-06-13 06:44:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-13 06:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-13 06:44:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-13 06:44:02       82 阅读
  4. Python语言-面向对象

    2024-06-13 06:44:02       91 阅读

热门阅读

  1. 大模型日报2024-06-12

    2024-06-13 06:44:02       34 阅读
  2. 网页自动关闭

    2024-06-13 06:44:02       24 阅读
  3. 【AI应用探讨】— Meta Llama-3模型应用场景

    2024-06-13 06:44:02       27 阅读
  4. 011.编译随机指纹浏览器-禁用webRTC-售卖成品

    2024-06-13 06:44:02       32 阅读
  5. uni-app文件下载 h5 xls 乱码 锟斤拷 Blob pdf打不开

    2024-06-13 06:44:02       38 阅读
  6. Spring Boot中的RESTful API详细介绍及使用

    2024-06-13 06:44:02       30 阅读
  7. spring boot logback.xml文件配置,info、error隔离

    2024-06-13 06:44:02       33 阅读
  8. MySQL 搭建主从报错 1236

    2024-06-13 06:44:02       28 阅读
  9. vue在hash路由模式下实现点击定位滑动

    2024-06-13 06:44:02       24 阅读
  10. 学习AI 机器学习,深度学习需要用到的python库

    2024-06-13 06:44:02       28 阅读
  11. 深度学习每周学习总结N1(one-hot 编码案例)

    2024-06-13 06:44:02       21 阅读