`

Oracle Mutex实现机制

阅读更多

我们都知道Latch是Oracle用来在内存中做串行控制的机构,从10g R2开始,Oracle引入了一个新的技术-Mutex。Mutex并不是Oracle的发明,而是系统提供的一个底层调用,Oracle只是利用它实现串行控制的功能,并替换部分Latch。

Mutex中有两个变量:分别是Holider identifer和Reference count,Holider identifer记录持有mutex的SID,而Reference count是一个计数,记录了当前正在以share方式访问mutex的数量,每当session以share方式持有mutex时,计数会加1,而释放时会减1。如果Reference count大于零,则表示该内存结构正在被Oracle pin住。

我们看一段伪代码,演示mutex的申请过程:

Function Mutex_get(mutex_name)
{
  if mutex.holder:=SID
    case mode:
    'exclusive':
      if mutex.ref_count=0
        return TRUE
      else
        mutex.holder.clear;
        reture FALSE
      end if
    'share':
      mutex.ref_count++
      mutex.holder.clear
      return TRUE
    end case
  else
    reture FALSE
  end if
}

Mutex是如何实现串行控制的,实际上它是利用了操作系统的一个原子操作CAS(compare-and-swap)实现的。我们看到函数的开始处:mutex.holder:=SID,将SID赋值给mutex的Holider Identifer,这里就是一个原子的CAS操作,首先比较mutex.holder是否为空,如果不为空则赋值session的SID。CAS操作由OS来保证其原子性,在同一时刻这个操所是串行的。如果这个赋值操作失败,整个申请过程失败。赋值成功后,如果是share方式,则mutex.ref_count加1,并清空mutex.holder,如果是exclusive方式,需要判断mutex.ref_count是否为零(是否被pin住),如果大于0,则失败,并清空mutex.holder,如果等于0,则成功,这时不清空mutex.holder,保持当前session对mutex的exclusive占用,直到释放为止。

Mutex相比latch带来了以下的好处:

1.更少的资源消耗,mutex与latch不同,它不是独立存在的,而是在每个内存结构中,并随着内存结构创建和释放,mutex同时也被创建和释放。mutex暂用的空间比latch小很多,创建和释放消耗更少的资源。

2.有效降低竞争,因为mutex是每个内存结构中的一部分,这样意味着mutex的数量可以有很多,而不同于latch,一个latch需要管理很多个内存结构,当你访问同一latch管理的不同内存结构时,也会发生竞争,而mutex则不会。另外,因为latch的数量有限,很多时候latch本身的竞争会很厉害,之前,我们只能增加latch数量或者减少latch持有的时间,而现在,mutex是一个更好的选择。

3.更快的pin,当block被访问时,它必须被pin在buffer cache中,当一个cursor执行时,它也必须被pin在library cache中,如果大量并发频繁执行同一个cursor,library cache pin会耗费大量的CPU资源。而mutex使用reference count来解决并发访问的问题,只要它大于零,就表示它已经被pin在了内存中,不能被交换出去。而且mutex.ref_count++这个操所是非常快的,只占用非常少的资源。

Mutex申请的过程和latch类似,同样需要spin和sleep,不同的是Oracle硬编码了mutex spin的次数为255次(Latch spin的次数默认为2000,由隐含参数_spin_count控制)。latch sleep会随着等待次数的逐步增加,每次sleep的时间也会逐步增加。而mutex sleep则比较特别,它有三个选项,分别是yield CPU,sleep或者block other process,允许开发人员来决定采用哪种选项。

由于在某些RISC的操作系统中(HP-UNIX),由于系统不支持CAS操作,Oracle通过创建一个latch pool来模拟了CAS操作,被称为KGX latch,如果你发现系统中存在这种latch竞争,说明操作系统不支持CAS操作,可以通过_kks_use_mutex_pin关闭mutex。

mutex主要使用在library cache中,用来取代原来的library cache pin和library cache lock,关于library cache中锁的实现机制,我会在另外一篇文章中说明。

分享到:
评论

相关推荐

    ORACLE MUTEX

    Oracle Mutex 是Oracle数据库中一种重要的同步机制,用于在多线程环境下保护共享资源的安全访问。在Oracle数据库中,Mutex(互斥锁)是实现并发控制的关键组件,它确保在任何时候只有一个线程能够访问特定的内存结构...

    oracle mutex internal

    在Oracle数据库中,latch和mutex都是用于保护共享资源的同步工具,但它们在实现和使用上有区别。Latches是轻量级的保护机制,一般用于保护内存结构中的短期锁定资源,而mutex则更加复杂和精细,用于更长时间的锁定和...

    图文并茂Mutex性能问题解析

    Mutex机制主要用于保护Oracle数据库的共享池中的对象,避免多个进程同时访问同一个资源而导致的数据不一致问题。在高并发场景下,Mutex机制的有效性直接影响到系统的性能和稳定性。 - **Mutex的作用**: - Mutex...

    Oracle数据库latch和mutex等待事件全面解析

    - 自Oracle 8.0起,可以实现共享Latch,用于某些AQ操作(如检查缓冲区链时获取的Cache Buffers Chains Latch)。 **1.2 Mutex简介** - **定义**:Mutex是一种更高层次的同步机制,用于保护更复杂的内存结构。 - *...

    VC多线程操作ORACLE数据库

    为了实现线程同步,VC++提供了多种同步机制,如临界区、事件、信号量等。例如,可以使用临界区来保护共享的数据库连接对象,确保同一时间只有一个线程能使用这个连接。同时,线程间的通信可以通过事件对象实现,当...

    Oracle性能优化与故障诊断案例分享

    在Oracle中,基数反馈是优化器用来调整执行计划的一个机制。它基于实际的基数信息(即查询返回的行数)来调整后续执行的基数估计。基数反馈可能因查询条件不一致或会话级别优化器参数设置不同而出现问题。例如,...

    Oracle的锁内幕解惑

    本文旨在深入探讨Oracle锁机制的内部原理,特别是针对DML锁、DDL锁以及Latch等锁机制进行详细解析,帮助DBA更好地理解和应对实际工作中遇到的各种锁问题。 #### 二、Oracle锁机制概览 Oracle的锁机制可以大致分为...

    Oracle数据库性能优化实务_闩锁及闩锁优化.pptx

    Oracle数据库性能优化实务主要关注的是闩锁(LATCH)及其优化,这关乎数据库系统的稳定性和效率。...通过以上策略,可以有效地提升Oracle数据库的性能,降低由于闩锁竞争导致的系统瓶颈,从而实现更高效的数据库操作。

    oracle常用oci函数说明

    通过上述三个步骤,我们可以有效地初始化OCI环境并准备好必要的句柄,从而实现与Oracle数据库的连接和交互。这些函数是使用OCI进行数据库开发的基础,掌握它们对于开发高效稳定的Oracle应用程序至关重要。

    使用OCI编写多线程的ORACLE应用软件

    在实际应用中,为了实现资源的有效利用,通常会使用锁等机制来控制对共享资源的访问。 ##### 2. OCI与多线程安全 OCI(Oracle Call Interface)是Oracle提供的一个C语言级别的接口库,用于高效地与Oracle数据库交互...

    Oracle Solaris 11.3 Programming Interfaces Guide-336

    3. **并发与多线程**:Solaris支持多线程编程,通过pthread库提供了丰富的线程API,如pthread_create(), pthread_join(), pthread_mutex_t等,允许开发者创建和管理线程,实现并发执行。 4. **内存管理**:Solaris...

    Maclean 讲 Oracle SQL 调优精要【技术文档】

    调优的主要目的是通过各种手段降低SQL语句消耗的资源,如逻辑读、物理读、CPU时间、热点争用以及Latch/Mutex的争用等。通常,80%的性能问题是由10%的Top SQL引起的。因此,识别并优化这些高消耗的SQL语句是提高...

    某超市进销存管理系统(C++_Oracle开发源码)

    此外,系统可能还利用了异常处理机制来确保程序的健壮性,以及线程同步技术如mutex或condition_variable来实现多线程并发操作。 Oracle数据库作为后台存储,提供了强大的数据管理和事务处理能力。超市进销存管理...

    Oracle Solaris 9 - man pages section 9: DDI and DKI Kernel Funct

    6. **同步与互斥**:描述如何使用 DKI 提供的同步原语,如 mutex(互斥锁)、condition variables(条件变量)和 semaphores(信号量)。 7. **电源管理**:讲解如何实现设备的节能模式,如 D3冷态、D3热态等。 8. *...

    Latch和Lock的区别

    在Oracle数据库系统中,了解和区分Latch(锁存器)和Lock(锁)是非常重要的,因为它们都是数据库并发控制的关键机制,确保数据的一致性和完整性。以下是对这两个概念的详细解释: 1. Latch(锁存器) - 目的:...

    Oracle Solaris 8 man pages section 3: Threads and Realtime Libra

    3. `pthread_mutex_*`:这一系列函数提供了互斥锁,用于保护共享资源免受并发访问。 4. `pthread_cond_*`:条件变量允许线程在满足特定条件时阻塞,直到其他线程改变了条件。 5. `pthread_rwlock_*`:读写锁提供了一...

    使用Quartz.net定时备份SQL Server.pdf

    Mutex是一种用于控制对共享资源的互斥访问的同步机制。在***定时备份SQL Server的软件中,使用Mutex来确保任何时候只有一个备份进程运行,这有助于防止进程间的竞争条件,并能有效管理资源。 7. 计划任务的实现与...

    2013Oracle技术嘉年:MYSQL并发控制

    MySQL中的全局锁问题(例如Spinlock、RWLock和Mutex等)可能导致系统的整体性能下降。过多的全局锁会增加锁争用,尤其是在高并发场景下,这会影响系统的响应时间和吞吐量。 **2.2 并发控制是关键** 并发控制是...

    程序进程条 delphi 源码 数据库 多线程

    - Delphi提供了如Synchronize、CriticalSection、Mutex等机制来保证数据安全。 综上所述,这个主题涵盖了程序进程条的使用、Delphi的源码学习、数据库操作以及多线程编程等多个IT核心概念。通过深入研究和实践,...

Global site tag (gtag.js) - Google Analytics