14.13.2 InnoDB 상호 배타적 잠금 및 읽기 / 쓰기 잠금 구현
MySQL 및 InnoDB
는 실행의 여러 스레드가 공유 데이터 구조에 액세스합니다. InnoDB
는 이러한 액세스를 상호 배타 락 과 읽기 / 쓰기 잠금 자신의 구현과 동기화합니다. InnoDB
는 종래 InnoDB
상호 배타 락을 사용하여 읽기 / 쓰기 잠금의 내부 상태를 보호하고 왔습니다. Unix 및 Linux 플랫폼에서는 IEEE Std 1003.1c (POSIX.1c)에있는 바와 같이, InnoDB
상호 배타 락의 내부 상태는 Pthreads 상호 배타 락에 의해 보호됩니다.
많은 플랫폼은 상호 배타적 잠금 및 읽기 / 쓰기 잠금을 구현하기위한보다 효율적인 방법이 존재합니다. 원자 작업을 사용하면 종종 Pthreads보다 효율적으로 다중 스레드 작업을 동기화 할 수 있습니다. 락을 취득 또는 해제 할 각 작업을 더 적은 CPU 명령으로 실행할 수 있기 때문에 공유 데이터 구조에 대한 액세스를 위해 스레드가 충돌하는 경우 낭비 시간이 줄어 듭니다. 멀티 코어 플랫폼에서, 이것은 또한 확장 성을 향상시킵니다.
InnoDB
는 이전에 사용 된 Pthreads 방식을 사용하는 대신 원자 메모리 액세스를위한 GNU 컴파일러 컬렉션 (GCC)에 의해 제공되는 내장 함수 를 사용하여 상호 배타 락과 읽기 / 쓰기 잠금을 구현 합니다. 보다 구체적으로는 GCC 버전 4.1.2 이상에서 컴파일 된 InnoDB
는 pthread_mutex_t
대신 원자 내장을 사용하여 InnoDB
상호 배타적 잠금 및 읽기 / 쓰기 잠금을 구현합니다.
32 비트 Microsoft Windows에서는 InnoDB
는 손으로 쓰여진 어셈블러 명령을 사용하여 (읽기 / 쓰기 잠금이 아니라) 상호 배타 락을 구현하고있었습니다. Microsoft Windows 2000에서는 GCC에서 제공되는 내장 함수와 같은, 연동 된 변수 액세스 를위한 함수를 사용할 수 있습니다. Windows 2000 이상에서는 InnoDB
는 연동 된 함수를 사용합니다. 손으로 쓰여진 옛날 어셈블러 코드와는 달리 새로운 구현에서는 읽기 / 쓰기 잠금 및 64 비트 플랫폼이 지원됩니다.
Solaris 10에서는 원자 연산을위한 라이브러리 함수가 도입되고, InnoDB는 기본적으로 이러한 함수를 사용합니다. 원자 메모리 액세스를위한 GNU 컴파일러 컬렉션 (GCC)에서 제공하는 내장 함수 를 지원하지 않는 컴파일러를 갖춘 Solaris 10에서 MySQL이 컴파일 된 경우 InnoDB
는 라이브러리 함수를 사용합니다.
이로 인해 멀티 코어 시스템에서 InnoDB
의 확장 성이 향상됩니다. 이 기능은 자신이 지원되는 플랫폼에서 표준으로 사용됩니다. 성능 향상을 제공하기 위해 매개 변수와 옵션을 설정할 필요가 없습니다. 원자 메모리 액세스를위한 GCC, Windows 또는 Solaris 함수를 사용할 수없는 플랫폼에서는 InnoDB
는 상호 배타 락과 읽기 / 쓰기 잠금을 구현하기 위해 기존의 Pthreads 방법을 사용합니다.
MySQL이 시작되면 InnoDB
는 원자 메모리 액세스가 상호 배타적 잠금 사용되거나 상호 배타 락과 읽기 / 쓰기 잠금에 사용되거나 어느 쪽에도 사용 여부를 나타내는 메시지를 로그 파일에 기록 합니다. 적절한 도구를 사용하여 InnoDB
가 구축되어 있으며, 또한 대상 CPU가 필요한 원자 연산을 지원하는 경우, InnoDB
는 상호 배타적 잠금 내장 함수를 사용합니다. 또한 스레드 식별자 ( pthread_t
)에서 비교 및 스왑 작업을 사용할 수있는 경우, InnoDB
는 읽기 / 쓰기 잠금을위한 명령도 사용합니다.
소스에서 빌드하는 경우 그 빌드 프로세스 플랫폼의 기능을 제대로 활용하고 있는지 확인하십시오.
락의 성능에 미치는 영향 대한 자세한 내용은 섹션 8.10 "잠금 작업의 최적화" 를 참조하십시오.