当前位置: 首页 > news >正文

三门峡河南网站建设室内设计案例分析ppt

三门峡河南网站建设,室内设计案例分析ppt,推荐一些能打开的网站,合肥做网站怎么样韦东山老师最新录制的驱动大全之同步与互斥收费视频已经在淘宝上架销售 #xff0c;一共7节#xff0c;良心价29元#xff0c;同时已经同步到CSDN , 51CTO , 电子发烧友#xff0c;腾讯课堂等平台。本文是其中一节《同步与互斥的失败例子》视频配套文档同步与互斥收费视频已经在淘宝上架销售 一共7节良心价29元同时已经同步到CSDN , 51CTO , 电子发烧友腾讯课堂等平台。本文是其中一节《同步与互斥的失败例子》视频配套文档《同步与互斥的失败例子》免费试看版(2分钟完整版7分46秒)《同步与互斥的失败例子》完整版 购买链接https://item.taobao.com/item.htm?id620987021249  (复制到浏览器打开)光看文档可能难度稍大建议结合视频进行学习gg完毕开始干货。1.2 同步与互斥的失败例子注意本节在GIT上没有源码。GIT地址git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git一句话理解同步与互斥我等你用完厕所我再用厕所。什么叫同步就是条件不允许我要等等。什么是互斥你我早起都要用厕所谁先抢到谁先用中途不被打扰。同步与互斥经常放在一起讲是因为它们之间的关系很大“互斥”操作可以使用“同步”来实现。我“等”你用完厕所我再用厕所。这不就是用“同步”来实现“互斥”吗有时候看代码更容易理解伪代码如下01 void  抢厕所(void) 02 { 03    if (有人在用) 我眯一会; 04    用厕所; 05    喂醒醒有人要用厕所吗; 06 } 假设有A、B两人早起抢厕所A先行一步占用了B慢了一步于是就眯一会当A用完后叫醒BB也就愉快地上厕所了。在这个过程中A、B是互斥地访问“厕所”“厕所”被称之为临界资源。我们使用了“休眠-唤醒”的同步机制实现了“临界资源”的“互斥访问”。上面是一个有“味道”的例子回到程序员的世界一个驱动程序同时只能有一个APP使用怎么实现1.2.1 失败例子101 static int valid  1; 02 03 static ssize_t gpio_key_drv_open (struct inode *node, struct file *file) 04 { 05      if (!valid) 06      { 07              return -EBUSY; 08      } 09      else 10      { 11              valid  0; 12      } 13 14      return 0; //成功 15 } 16 17 static int gpio_key_drv_close (struct inode *node, struct file *file) 18 { 19      valid  1; 20      return 0; 21 } 22 看第5行我们使用一个全局变量valid来实现互斥访问。这有问题吗很大概率没问题但是并非万无一失。注意编写驱动程序时要有系统的概念程序A调用驱动程序时它可能被程序B打断程序B也去调用这个驱动程序。下图是一个例子程序A在调用驱动程序的中途被程序B抢占了CPU资源程序A执行到第11行之前被程序B抢占了这时valid尚未被改成0程序B调用gpio_key_drv_open时发现valid等于1所以成功返回0当程序A继续从第11行执行时它最终也成功返回0这样程序A、B都成功打开了驱动程序。注意在内核态程序A不是主动去休眠、主动放弃CPU资源而是被优先级更高的程序B抢占了这种行为被称为“preempt”(抢占)。1.2.2 失败例子2上面的例子是不是第5行到第11行的时间跨度大长了再优化一下程序行不行代码如下01 static int valid  1; 02 03 static ssize_t gpio_key_drv_open (struct inode *node, struct file *file) 04 { 05      if (--valid) 06      { 07              valid; 08              return -EBUSY; 09      } 10      return 0; 11 } 12 13 static int gpio_key_drv_close (struct inode *node, struct file *file) 14 { 15      valid  1; 16      return 0; 17 } 18 第5行先减1再判断这样可以更大概率地避免问题但是还是不能确保万无一失。对数据的修改分为3步读出来、修改、写进去。请看下图进程A在读出valid时发现它是1减1后为0这时if不成立但是修改后的值尚未写回内存假设这时被程序B抢占程序B读出valid仍为1减1后为0这时if不成立最后成功返回轮到A继续执行它把0值写到valid变量最后也成功返回。这样程序A、B都成功打开了驱动程序。1.2.3 失败例子3前面2个例子都是在修改valid的过程中被别的进程抢占了那么在修改valid的时候直接关中断不就可以了吗01 static int valid  1; 02 03 static ssize_t gpio_key_drv_open (struct inode *node, struct file *file) 04 { 05       unsigned long flags; 06       raw_local_irq_save(flags); // 关中断 07      if (--valid) 08      { 09              valid; 10              raw_local_irq_restore(flags);  // 恢复之前的状态 11              return -EBUSY; 12      } 13       raw_local_irq_restore(flags);          // 恢复之前的状态 14      return 0; 15 } 16 17 static int gpio_key_drv_close (struct inode *node, struct file *file) 18 { 19      valid  1; 20      return 0; 21 } 第06行直接关中断这样别的线程、中断都不能来打扰本线程了在它读取、修改valid变量的过程中无人打扰。没有问题了对于单CPU核的系统上述代码是没问题的但是对于SMP系统你只能关闭当前CPU核的中断别的CPU核还可以运行程序它们也可以来执行这个函数同样导致问题如下图假设CPU 0上进程A、CPU1上进程B同时运行到上图中读出valid的地方它们同时发现valid都是1减减后都等于0在第07行判断条件都不成立所以在第14行都可以返回0都可以成功打开驱动。推荐阅读    专辑|Linux文章汇总    专辑|程序人生    专辑|C语言嵌入式Linux微信扫描二维码关注我的公众号
http://www.yutouwan.com/news/389409/

相关文章:

  • 婚纱摄影网站源码苏州博客关键词优化
  • 建站公司新闻资讯wordpress调用最近更新文章
  • 深圳地铁网站开发wordpress上一篇下一篇
  • 做网站的知名品牌公司一个购物网站开发语言
  • 乐营销网站沧浪企业建设网站电话
  • 松江网站建设多少钱建筑网片自动清洗机
  • 北京制作网站公司哪家好网站建设 网站开发 区别
  • 网站被k换域名WordPress首行缩进段落
  • 施工建设集团网站标书制作员这工作好吗
  • 网站怎么做响应式布局职业生涯规划大赛心得体会
  • 深圳最好的营销网站建设公司排名太和县建设银行网站
  • 网站建设的教学视频百度广告代理
  • eclipse网站开发教程抚州做网站公司
  • 网站制作完成之后如何登陆公司网站后台
  • wordpress开启全站ssl郴州网站建设公司哪家好
  • 有没有做网页的网站杭州网站建设的公司
  • 天津市住房和城乡建设厅官方网站凡客是什么意思
  • 北京好的做网站的公司哪家好主流建站公司
  • net域名大网站公司简介模板100字范文
  • 网站建设进展报告怎么做钓鱼网站生成
  • 广告行业包括网站建设吗首页优化公司
  • 腾讯云服务器做网站可以吗网站建设的主要缺陷
  • 我的网站百度找不到网站的可用性
  • 一个人完成网站建设网站开发报价人天
  • 网站服务器租用技巧四川省建设工程招标网官网
  • 网站模板和后台卖老石器老榆木做哪个网站好
  • 网站开发的功能需求怎么写宿迁经济技术开发区
  • 沈阳企业网站建站seo关键词分析
  • 做网站广告公司联系方式污网站公司网站
  • 网站平台代理wordpress用户只能一年内使用