zoukankan      html  css  js  c++  java
  • Linux内核学习笔记六——并发和同步概念

    一 临界区和竞争条件

           临界区:访问和操作共享数据的代码段。

           竞争条件:多个执行线程处于同一个临界区中。

        

      处于竞争条件:造成访问的数据或者资源不一致状态:

    对资源i的访问:ProcessA和B访问后得到正确的结果应该是9:

                        

    进程是并发执行,有可能得到的结果是:8

         

        

    防止这种情况的发生:保证对资源的访问原子操作。

    二 加锁

           锁:采用原子操作实现,原子操作不存在竞争。

          

        

    造成并发原因:

      l  中断:随时可以打断当前执行的进程代码;

      l  软中断和tasklet:任何时刻能唤醒调度软中断和tasklet,打断当前正在执行的代码;

      l  内核抢占:当前任务被抢占;

      l  进程睡眠:唤醒调度程序,执行新的进程;

      l  多处理器:同时执行代码。

     

      针对资源并发竞争条件的存在,需要对资源进行保护,保证资源的访问操作是原子的。

    需要弄清楚哪些数据需要被保护,要试图弄清楚资源会不会被并发的访问操作。

     

    三 死锁

           多个执行线程互相等待被对方占用的资源,但永远不会释放各自拥有的资源,导致众线程永远无法得到执行。

        

    出现死锁是件很危险的事情,预防死锁:

      l  加锁顺序保持一致;

      l  防止发生饥饿措施;

      l  不要重复请求同一个锁;

      l  复杂加锁方案造成死锁概率较大——设计锁力求简单;

    四 锁的粒度

           加锁粒度:描述加锁保护的数据规模;

                  过粗的锁:保护大块数据,如子系统所有数据结构;

                  精细的锁:保护小块数据,一个大数据结构中的一个元素;

           在粗糙与精细之间需要平衡:精细的锁复杂开销大,良好扩展性:从单核到多核,为提高性能,锁得机制变得更细。

      保护数据不被并发的访问,加锁你的代码。恰当的加锁:满足不死锁、可扩展、清晰简洁。

  • 相关阅读:
    C#之app.config、exe.config和vshost.exe.config作用区别
    C#中decimal ,double,float的区别
    C#中取整,向上取,向下取
    mybatis中的#和$的区别
    mybatis在xml文件中处理大于号小于号的方法
    ORACLE分页查询SQL语法——高效的分页
    移除powerdesigner中Recent Files中无效链接的文件
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    ORA-12638: 身份证明检索失败 的解决办法
    态度决定一切《跟任何人都聊得来》
  • 原文地址:https://www.cnblogs.com/bastard/p/2694243.html
Copyright © 2011-2022 走看看