暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[Oracle]Latch工作原理(一)

数据老匠 2016-05-09
841


导读:

 Latch是Oracle数据库中一个非常重要的轻量级内存锁,它是一个复杂且非常重要的概念,涉及到操作系统、Oracle内存结构、工作原因以及性能优化等多个方面的知识,这里以读书笔记的形式,通过一个知识系列,来全面学习Latch的工作原理。

本文是第一部分,介绍Latch基础知识:



什么是Latch:

        Latch是Oracle提供的轻量级锁资源,被称为锁存器。它用于快速、短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源。


Latch组成:

        它由三部分组成:PID(process id)、memory address、length


Latch的类型:

        Latch有三种类型:parent、child、solitary。

        parent和solitary是固定在oracle内核代码中的,child latch是在instance启动时创建的。

        v$latch_parent和v$latch_children视图包含了parent和child latch的信息;

        v$latch包含了solitary latch的信息同时包含了前两者的信息


Latch锁对象:

        Latch只工作在内存当中,主要锁定两种对象:内核代码、内存数据。锁定内核代码是指任何内核代码在执行前必须获取latch,执行完后释放latch。其目的是确保内核代码序列执行。

        锁定内核数据是指进程在读取、修改内存中的数据块之前必须先将之Latch,然后再进行相关操作,最后释放Latch。如果Database buffer cache中的某个块要被读取,我们会获得这个块的latch,这个过程叫做pin。如果,另外一个进程恰好要修改这个块,它也要pin这个块。此时他必须等待当前一个进程释放latch后才能pin住,然后修改,如果多个进程同时请求的话,他们之间将出现竞争。对内核数据加锁主要目的是防止因缓存区崩溃导致的物理块的坏块。


Latch获取锁的方式:

        latch通常通过两种方式来获取:immediate和willing to wait。当进程以immeidate方式请求latch失败时,控制权将会转到进程并产生一次immediate miss;

        当进程以willing to wait方式请求latch时将以”spinning and sleeping”的循环方式重复请求获取latch,spin一次如果仍然不能得到latch则sleep一定间隔(间隔时间成指数级增长)直至获得latch或达到spin_count次数(此时产生一次miss)。


操作系统锁:

        对于操作系统来说,可以划分为三种Lock,我们称之为OS Lock。

spinlock:它是最轻量级的lock,当获取不到时,发生自旋,不用发生上下文切换。

        mutex:它是互斥量。当获取不到时,将发生上下文切换。好处是,不会使CPU发生空转。但是如果频繁的切换严重消耗资源。

semaphores:它是信号量。与mutex类似,当获取不到时,发生上下文转换。

但是与mutex的区别是,mutex互斥量,同一时间只能被一个进程获取,而信号量,可以同时好几个进程获取。


Latch:

        spinlock是最轻量级的操作系统锁,而oracle的latch是封装在系统的spinlock之上。因此,使用Latch是相当快捷的实现方式。


Mutex:

        在11g中,oracle引入了更轻量级的mutex,以取代某些latch。但spin才是最轻量的啊,不用发生上下文转换,mutex要上下文转换的,怎么可能比spin轻量?oracle引入的mutex不是上面所说的OS mutex!而是同样构建于spin之上KGX mutex。


文章转载自数据老匠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论