>  기사  >  운영 및 유지보수  >  어떤 유형의 Linux 잠금이 있습니까?

어떤 유형의 Linux 잠금이 있습니까?

青灯夜游
青灯夜游원래의
2022-06-16 19:20:155133검색

Linux 잠금 유형: 1. 언제든지 하나의 스레드만 객체에 액세스할 수 있도록 하는 뮤텍스(뮤텍스 잠금) 2. rwlock(읽기-쓰기 잠금)은 읽기 잠금과 쓰기 잠금으로 구분됩니다. 데이터를 읽는 빈도가 데이터를 쓰는 빈도보다 훨씬 큰 상황에 적합합니다. 3. 스핀 잠금(스핀 잠금), 언제든지 하나의 스레드만 객체에 액세스할 수 있습니다. 4. seqlock(순차 잠금), In을 구별하는 데 사용됩니다. 읽기 및 쓰기의 경우 읽기 작업이 많고 쓰기 작업이 적으므로 쓰기 작업의 우선순위가 읽기 작업의 우선순위보다 높습니다.

어떤 유형의 Linux 잠금이 있습니까?

이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.

Linux의 여러 잠금 메커니즘

Mutex: mutex

Mutex: mutex, 언제든지 하나의 스레드만 개체에 액세스할 수 있도록 하는 데 사용됩니다. 잠금 획득 작업이 실패하면 스레드는 절전 모드로 전환되고 잠금이 해제될 때까지 기다리면서 깨어납니다.

읽기-쓰기 잠금: rwlock

 읽기-쓰기 잠금: rwlock, 읽기 잠금과 쓰기 잠금으로 구분됩니다. 읽기 작업 중에는 여러 스레드가 동시에 읽기 작업을 수행하도록 허용할 수 있습니다. 그러나 동시에 하나의 스레드만 쓰기 잠금을 얻을 수 있습니다. 쓰기 잠금을 획득하지 못한 다른 스레드는 쓰기 잠금이 해제될 때 깨어날 때까지 절전 모드로 전환됩니다.

참고: 쓰기 잠금은 다른 읽기 및 쓰기 잠금을 차단합니다. 스레드가 쓰기 잠금을 획득하고 쓰는 중이면 다른 스레드가 읽기 잠금을 획득할 수 없습니다. 쓰기가 읽기보다 우선순위를 가집니다. 쓰기가 있으면 후속 읽기가 기다려야 하며 깨어날 때 쓰기에 우선순위가 부여됩니다.

  • 데이터를 읽는 빈도가 데이터를 쓰는 빈도보다 훨씬 더 큰 상황에 적용됩니다.

스핀 잠금: spinlock

  스핀 잠금: 스핀 잠금, 언제든지 하나의 스레드만 개체에 액세스할 수 있습니다. 그러나 잠금 획득 작업이 실패하면 절전 모드로 전환되지 않고 잠금이 해제될 때까지 제자리에서 회전합니다. 이를 통해 절전 상태에서 절전 모드 해제까지 스레드 소비를 절약할 수 있어 잠금 시간이 짧은 환경에서 효율성이 크게 향상됩니다. 그러나 잠금 시간이 너무 길면 CPU 리소스가 많이 낭비됩니다.

RCU

  RCU: 읽기-복사-업데이트. 데이터를 수정할 때는 먼저 데이터를 읽은 다음 복사본을 생성하고 복사본을 수정해야 합니다. 수정이 완료되면 기존 데이터를 새 데이터로 업데이트합니다.

RCU를 사용할 때 리더는 동기화 오버헤드가 거의 필요하지 않으며 잠금 경쟁을 일으키지 않는 원자적 지침을 사용할 필요도 없으므로 교착 상태 문제를 고려할 필요가 없습니다. 작성자의 동기화 오버헤드는 상대적으로 큽니다. 수정된 데이터를 복사해야 하며 잠금 메커니즘을 사용하여 다른 작성자의 수정 작업을 동기화하고 병렬화해야 합니다. 읽기 작업 수가 많고 쓰기 작업 수가 적을 때 매우 효율적입니다.

세마포어: semaphore

리눅스 커널의 세마포어는 사용자 모드 SystemV IPC 메커니즘 세마포어와 개념 및 원리는 동일하지만 커널 외부에서는 절대 사용할 수 없으므로 동일하지 않습니다. SystemV IPC 메커니즘은 세마포어와 아무 관련이 없습니다.

세마포어는 생성될 때 초기값을 설정해야 하는데, 이는 여러 작업이 동시에 세마포어로 보호되는 공유 리소스에 액세스할 수 있다는 것을 의미합니다. 초기값 1은 뮤텍스(Mutex)가 됩니다. 태스크는 동시에 하나만 가능하며 세마포로 보호되는 공유 리소스에 액세스할 수 있습니다. 작업이 공유 리소스에 액세스하려면 먼저 세마포어를 얻어야 합니다. 세마포어를 얻는 작업은 세마포어의 값을 1만큼 감소시킵니다. 세마포어의 현재 값이 음수인 경우 이는 세마포어를 나타냅니다. 세마포어의 대기 큐는 세마포어의 현재 값이 음수가 아닐 때까지 기다립니다. 이는 세마포어를 얻을 수 있다는 의미입니다. 따라서 세마포어에 의해 보호되는 공유 리소스에 즉시 액세스할 수 있습니다. 작업이 세마포어에 의해 보호되는 공유 리소스에 대한 액세스를 완료한 후에는 세마포어의 값에 1을 더하여 세마포어를 해제해야 합니다. 현재 세마포어를 기다리는 작업이 있음을 나타내므로 해당 세마포어를 기다리고 있는 모든 작업도 깨웁니다.

rw_semaphore(세마포 읽기 및 쓰기)

읽기 및 쓰기 세마포는 방문자를 독자 또는 작가로 세분화합니다. 독자는 읽기 및 쓰기 세마포를 유지하면서 읽기 및 쓰기 세마포로 보호되는 공유 리소스만 읽고 액세스할 수 있습니다. 공유 리소스에 액세스하기 전에 작성자로 분류되어야 합니다. 작성자는 쓰기 액세스가 필요하지 않다고 판단되면 리더로 다운그레이드할 수 있습니다. 읽기-쓰기 세마포어가 동시에 가질 수 있는 리더 수에는 제한이 없습니다. 즉, 읽기-쓰기 세마포어를 동시에 소유할 수 있는 리더 수는 제한이 없습니다. 읽기-쓰기 세마포어가 현재 작성자의 소유가 아니고 리더가 세마포어를 해제할 때까지 기다리는 작성자가 없으면 모든 리더는 읽기-쓰기 세마포어를 성공적으로 획득할 수 있습니다. 그렇지 않으면 리더는 작성자가 해당 세마포어를 해제할 때까지 일시 중지되어야 합니다. 세마포어. 읽기-쓰기 세마포어가 현재 리더나 라이터의 소유가 아니고 세마포어를 기다리는 라이터가 없다면 라이터는 읽기-쓰기 세마포어를 성공적으로 얻을 수 있습니다. 그렇지 않으면 라이터는 방문자가 더 이상 없을 때까지 일시 중지됩니다. . 그러므로 작가는 배타적이고 배타적이다.
읽기 및 쓰기 세마포어에는 두 가지 구현이 있습니다. 하나는 보편적이며 하드웨어 아키텍처에 의존하지 않습니다. 따라서 새 아키텍처를 추가하면 이를 다시 구현할 필요가 없습니다. 그러나 단점은 성능이 낮고 획득에 따른 오버헤드가 높습니다. 읽기 및 쓰기 세마포어 해제. 다른 하나는 아키텍처와 관련되어 있어 읽기 및 쓰기 세마포어 획득 및 해제에 대한 성능이 높고 오버헤드가 낮지만 새 아키텍처를 추가하려면 다시 구현해야 합니다. 커널 구성 중에 옵션을 사용하여 어떤 구현이 사용되는지 제어할 수 있습니다.

읽기 및 쓰기 세마포: rw_semaphore

읽기 및 쓰기 세마포는 방문자(리더 또는 작성자)를 세분화할 수 있으며, 동시에 읽기 및 쓰기 세마포는 공유 리소스에 대한 읽기 액세스 권한을 유지합니다. 작업에 읽기 외에 쓰기가 필요한 경우 작성자로 분류되어야 합니다. 공유 리소스에 액세스하기 전에 작성자는 쓰기 권한이 필요하지 않다고 판단하여 리더로 다운그레이드할 수 있습니다. 읽기-쓰기 세마포어가 동시에 가질 수 있는 리더 수에는 제한이 없습니다. 즉, 읽기-쓰기 세마포어를 동시에 소유할 수 있는 리더 수는 제한이 없습니다. 읽기-쓰기 세마포어가 현재 작성자의 소유가 아니고 리더가 세마포어를 해제할 때까지 기다리는 작성자가 없으면 모든 리더는 읽기-쓰기 세마포어를 성공적으로 획득할 수 있습니다. 그렇지 않으면 리더는 작성자가 해당 세마포어를 해제할 때까지 일시 중지되어야 합니다. 세마포어. 읽기-쓰기 세마포어가 현재 리더나 라이터의 소유가 아니고 세마포어를 기다리는 라이터가 없다면 라이터는 읽기-쓰기 세마포어를 성공적으로 얻을 수 있습니다. 그렇지 않으면 라이터는 방문자가 더 이상 없을 때까지 일시 중지됩니다. . 그러므로 작가는 배타적이고 배타적이다.

읽기 및 쓰기 세마포어에는 두 가지 구현이 있습니다. 하나는 보편적이며 하드웨어 아키텍처에 의존하지 않습니다. 따라서 새 아키텍처를 추가해도 다시 구현할 필요는 없지만 성능이 낮고 및 가져오기에 대한 오버헤드가 있다는 단점이 있습니다. 읽기 및 쓰기 세마포어 해제 대형, 다른 하나는 아키텍처와 관련되어 있으므로 성능이 높고 읽기 및 쓰기 세마포어 획득 및 해제에 따른 오버헤드가 적지만 새 아키텍처를 추가하려면 다시 구현해야 합니다. 커널 구성 중에 옵션을 사용하여 어떤 구현이 사용되는지 제어할 수 있습니다.

seqlock****(순차 잠금)

읽기와 쓰기가 구분될 수 있고 읽기 작업이 많고 쓰기 작업이 적으며 쓰기 작업의 우선순위가 읽기 작업보다 높은 상황에서 사용됩니다. 운영. seqlock의 구현 아이디어는 증가하는 정수를 사용하여 시퀀스를 나타내는 것입니다. 쓰기 작업이 임계 섹션에 들어가면 시퀀스++가 사용되며 쓰기 작업이 임계 섹션을 종료하면 시퀀스는 다시 +++가 됩니다.

쓰기 작업에는 잠금(예: 뮤텍스)도 필요합니다. 이 잠금은 동시에 최대 하나의 쓰기 작업이 진행되도록 하기 위해 쓰기-쓰기 상호 배제에만 사용됩니다. 시퀀스가 홀수이면 쓰기 작업이 진행 중이라는 의미이며, 임계 영역에 진입하려면 시퀀스가 ​​짝수가 될 때까지 읽기 작업을 기다려야 합니다. 읽기 작업이 임계 영역에 진입하면 현재 시퀀스의 값을 기록해야 하며, 임계 영역을 빠져나갈 때 기록된 시퀀스와 현재 시퀀스를 비교하면 쓰기 작업이 발생했음을 의미합니다. 읽기 작업이 임계 영역에 진입하는 동안 읽기 작업 읽기 작업이 잘못되었으므로 반환하고 다시 시도해야 합니다.

seqlock 쓰기는 상호 배타적이어야 합니다. 그러나 seqlock의 적용 시나리오 자체는 읽기는 많고 쓰기는 적은 상황이므로 쓰기 충돌 가능성은 매우 낮습니다. 따라서 기본적으로 쓰기-쓰기 뮤텍스에는 성능 손실이 없습니다. 읽기 및 쓰기 작업은 상호 배타적일 필요가 없습니다. seqlock의 적용 시나리오는 쓰기 작업이 읽기 작업보다 우선한다는 것입니다. 쓰기 작업의 경우 차단이 거의 없으며(쓰기-쓰기 충돌과 같은 작은 확률 이벤트가 발생하지 않는 한) 시퀀스++의 추가 작업만 필요합니다. 읽기 작업을 차단할 필요는 없지만 읽기-쓰기 충돌이 발견되면 다시 시도해야 합니다. seqlock의 일반적인 응용 프로그램은 시계 업데이트입니다. 시스템에서는 1밀리초마다 시계 인터럽트가 발생하며 해당 인터럽트 핸들러는 시계를 업데이트합니다(쓰기 작업).

사용자 프로그램은 gettimeofday와 같은 시스템 호출을 호출하여 현재 시간을 가져올 수 있습니다(읽기 작업). 이 경우 seqlock을 사용하면 너무 많은 gettimeofday 시스템 호출이 인터럽트 핸들러를 차단하는 것을 방지할 수 있습니다(seqlock 대신 읽기-쓰기 잠금을 사용하는 경우가 이에 해당합니다). 인터럽트 핸들러는 항상 우선순위를 가지며 gettimeofday 시스템 호출이 인터럽트 핸들러와 충돌하는 경우 사용자 프로그램이 대기하는지 여부는 중요하지 않습니다.

뮤텍스 잠금과 읽기-쓰기 잠금의 차이점:

1) 읽기-쓰기 잠금은 판독기와 기록기를 구별하는 반면, 뮤텍스 잠금은 구별하지 않습니다.

2) 뮤텍스 잠금은 동시에 하나의 스레드만 객체에 액세스하도록 허용합니다. , 읽기 또는 쓰기에 관계없이 읽기-쓰기 잠금은 동시에 하나의 작성기만 허용하지만 여러 판독기가 동시에 객체를 읽을 수 있도록 허용합니다.

관련 추천: "Linux 비디오 튜토리얼"

위 내용은 어떤 유형의 Linux 잠금이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.