码迷,mamicode.com
首页 > 其他好文 > 详细

同步机制

时间:2020-02-07 00:58:27      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:bsp   私有   锁定   data   写入   例子   通过   ptr   实现   

  什么是同步机制?

    同步机制 :在并发程序设计中,各进程对公共变量的访问必须加以制约,这种制约称为同步。(引用百度百科,题外话:虽然百度百科并不那么可信,但也是有准确的东西,注意自己甄别就好了。)

  为什么需要同步机制?

    当计算机只运行一个线程的时候,自然不需要同步。所有的资源都是这个线程独享。那么就不会有任何竞争。

    但是当计算机出现了多个线程的时候,那么就出现了各种麻烦,为了处理这些麻烦我们就需要使用一些办法来解决这些麻烦。

    多线程引出的麻烦(对资源的竞争导致的出错) : 

      设想存在A,B两个线程。对同一数据C进行修改。首先A读取数据C,得知C=13。这时候发生了线程切换。切换为B,然后B读取C,得知C=13。然后修改C,将C减少1,最后保存C。这时候C为12。执行结束后,又切换回A,A将C增加1,但是A得知的C是13,于是C=13+1=14。保存C。这时候C=14。

      将上述例子代入生活中来说 :首先A本来是从存钱罐里塞进去了一块钱,B拿出了一块钱。但是最终结果确实C从13元变成14元了。莫名其妙多了一块钱了!

  如何实现同步机制?

    原子操作 : 原子操作的意思就是不可切割,不可打断的操作。

      CPU层面的原子操作 : 对于CPU而言,一条机器指令(机器指令和汇编指令是一一对应的关系,所以后面的例子我会采取汇编指令代替机器指令)就是一个原子操作。因为中断随时有可能发生,但只会发生在两句机器指令之间,而不会在一句机器指令执行到一半就发生,这是不被允许的(被动的进程切换就是通过时钟中断处理程序来实现的)。

      CPU层面如何实现原子操作?

        多种情况分析:

        例1) 多核CPU对自己的寄存器进行修改不存在公共资源的竞争,因为寄存器是CPU私有的(每个CPU都有自己的寄存器),其它的CPU无法直接访问。

        例2) 单核CPU对自己的寄存器进行修改 : 同上

        例3) 单核CPU对内存(公共变量)进行修改 : 因为只有一个CPU,一个内存,也就可以理解为内存是CPU私有的。

        例4) 多核CPU对同一地址的物理内存(公共变量)进行修改 :

            这时候会存在公共资源的竞争,我们可以简单地把CPU修改内存的内容分为三步 : 

              1) 读取对应内存上的内容

              2) 用内容进行计算

              3) 将结果写入对应内存

        cpu0的任务是将内存1111的值+1:inc word ptr ds:[1111]

        cpu1的任务是将内存1111的值-1 : dec word ptr ds:[1111]

        那么就回到了我们之前提到的例子 : 多线程引出的麻烦(对资源的竞争导致的出错)

        什么是总线锁 : 就是使用处理器提供的一个LOCK信号,当一个处理器在总线上输此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。      

        解决策略 : 在进行操作 1)之前,先使用总线锁锁定这段内存(例如 : 1111 ~ 1113)。使得其他CPU无法对该内存操作,当操作 3) 结束,就释放这段内存的总线锁。

      那么CPU层面的原子操作的支持也就形成了 : 一条机器指令就是一个原子操作

    软件层面的原子操作 : 

      原子整数 : 既然机器指令允许直接对内存进行算术运算,那么直接设置一个宏或内联函数,使用汇编操作该变量即可达成原子整数了。

      

同步机制

标签:bsp   私有   锁定   data   写入   例子   通过   ptr   实现   

原文地址:https://www.cnblogs.com/vizdl/p/12247200.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!