当前位置:   article > 正文

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

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

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

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

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

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

1.中断中修改公共资源

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

3.多核处理器并发访问

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

保护共享资源

【问】共享资源有什么?

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

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

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

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

 【原子操作 驱动程序】

  1. static atomic64_t v = ATOMIC_INIT(1); //定义一个原子变量v,初值为1
  2. static int cdev_open(struct inode *inode, struct file *filp)
  3. {
  4. /*****************************************/
  5. file->private_data = &dev1; //指向设备结构体
  6. return 0;
  7. }
  8. static int cdev_open(struct inode *inode, struct file *filp)
  9. {
  10. if( !atomic64_dec_and_test(&v)){ // -1
  11. atomic64_inc(&v); // +1
  12. return -EBUSY; //返回错误
  13. }
  14. file->private_data = &dev1; //指向设备结构体
  15. return 0;
  16. }

 分析:

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

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

【APP】

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

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

【实验效果】

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/712264
推荐阅读
相关标签
  

闽ICP备14008679号