zoukankan      html  css  js  c++  java
  • 操作系统中的锁

    概述

      在多线程操作中,为了保证数据的一致性,保证临界代码的安全性,操作系统引入了锁机制。通过锁机制,能够保证多核多进程环境下,某一个时间点,只有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。

      虽然不同的语言会提供不同的锁接口,但是底层调用的都是操作系统提供的锁,不同的高级语言只是在操作系统锁机制上进行了封装,要真正理解锁,还是得要看操作系统是怎么实现锁的。

    锁的本质

       锁,在内存中就是一个整型的数,不同的数值表示不同的状态,比如0表示加锁状态,1表示空闲状态。

       加锁会有一定的操作:读内存表示锁的变量,判断锁的状态,加锁:如果已加锁,返回失败;如果修改数值成功,返回成功。上面的每句话对应一句汇编代码,但是整体上不是原子操作。

      由于中断 和多核 可能导致两个进程同时达到锁。

    • 中断:当线程A执行完第一步后,发生了中断,os调度线程B,线程B也来加锁并且加锁成功,此时又发生中断,OS调度线程A执行,从第二步开始,也加锁成功。
    • 多核:多个核心他们的锁操作是没有干扰的。

    解决

      核心是把以上几个操作查值,判断,设置等作为一个原子操作。

      (一)test and set指令

      该指令将读取内存、判断和设置值作为一个原子操作。这是一个硬件操作,不会被中断。但是多核情况下不能解决。

      (二)总线锁定和缓存一致性

       (在cpu芯片上有一个HLOCK Pin,可以通过发送指令来操作,将#HLOCK Pin电位拉低,并持续到这条指令执行完毕)cpu要执行操作时候,会发出一个 #LOCK信号,通过硬件操作,从而将总线锁住,这样同一总线上的其他CPU就不能通过总线来访问内存了。这就是总线操作,但是这个开销比较大。我们本来只是要对这步操作变成原子操作,但是现在总线锁定把CPU和内存的通信都锁住了。

      后来用了缓存一致性。是当某块CPU对缓存中的数据进行操作了之后,就通知其他CPU放弃储存在它们内部的缓存,或者从主内存中重新读取。

      

  • 相关阅读:
    JQueryEasyUI学习笔记(五)
    创建文本后,写入文本,报“正由另一进程使用,因此该进程无法访问该文件”
    Ogre wiki Application 运行我们的第一个程序
    我想在年前找一份工作
    C#+XAML的Metro应用开发入门(二)
    C#+XAML的Metro应用开发入门(一)
    疑难问题解决备忘录(1)——LAMP环境下WordPress无法发现themes目录下的主题问题解决
    C#+XAML的Metro应用开发入门(一)
    C#+XAML的Metro应用开发入门(三)
    Struts 2+Spring 3+Hibernate 3.3 在MyEclipse 10环境下的整合配置
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12744944.html
Copyright © 2011-2022 走看看