스레드 동기화 자물쇠에 대한 용어 소개
4055 단어 스레드 동기화
1. 자물쇠의 구체적인 실현 원리:
(1).상호 배타적 잠금(Mutex)
'상호 배척 자물쇠' 의 대상을 사용하면, 언제든지 하나의 라인만 이 대상에 접근할 수 있다. 즉, 코드를 하나의 임계 구역으로 나누는 것이다.Linux에서 위조 코드는 다음과 같습니다.
pthread_mutex_t mutex;
pthread_mutex_init (&mutex, NULL); /* */
pthread_mutex_lock(&mutex); /* , */
... /* */
pthread_mutex_unlock(&mutex); /* */
그림에서 보듯이 중간의 임계 구역은 잠금을 실현하고 매번 한 라인만 접근할 수 있다.기본적으로 우리 라인이 동기화되는 것은 모두 상호 배척 자물쇠이다.
2. 스핀 잠금(Spin Lock)
상호 배척 자물쇠 유형과 같이 서로 배척하여 특정한 대상을 방문하기 위한 것이지만 상호 배척 자물쇠는 자원이 점용될 때 수면에 들어가고 자전거 자물쇠는 자원을 얻을 수 있는지 없는지를 계속 순환적으로 탐지한다. 어떤 의미에서 보면while 순환 탐지이다.그래서 자전거 자물쇠는 cpu를 너무 많이 차지하기 쉬우나 라인의 휴면 스케줄링이 필요하지 않아 효율이 높고 잠금 시간이 짧은 경우에 적용된다.
3. 읽기 및 쓰기 잠금(RWLock)
읽기 자물쇠는 특수한 자전거 자물쇠로 임계 구역에 들어가야 하는 방문자를 독자와 쓰기자로 나눌 뿐이다. 쓰기는 배타적이지만 여러 독자가 동시에 존재할 수 있다.즉, 독자와 작가가 없다면, 작가는 즉시 읽기 자물쇠를 얻을 수 있다. 그렇지 않으면, 그 어떠한 작가나 독자도 없을 때까지 그곳에서 자전해야 한다.만약 읽기 자물쇠에 쓴 사람이 없다면 다른 독자가 있어도 이 독자는 즉시 이 읽기 자물쇠를 얻을 수 있다. 그렇지 않으면 독자는 반드시 그 자물쇠가 풀릴 때까지 그곳에서 자전해야 한다.
상호 배척 자물쇠와 자전거 자물쇠는 몇 가지 장단점이 있다.
Spinlock의 장점: 비싼 시스템 호출이 없고 사용자 상태이며 실행 속도가 빠르다.
Spinlock 단점: cpu를 계속 사용하고 실행 과정에서 버스 버스를 잠그며 버스를 잠글 때 다른 프로세서가 버스를 사용할 수 없습니다.
Mutex의 장점: 기다리지 않고 자물쇠를 얻지 못하면 sleep이 된다.
Mutex 단점: sleep 시 내부 핵 상태에 빠지기 때문에 비싼 시스템 호출이 필요합니다.
2. 자물쇠의 일부 분류
1. 반복 잠금(Recursive Lock) 및 비반복 잠금(Non-Recursive Lock)
두 가지 유일한 차이점은 하나의 라인이 여러 번 자물쇠를 얻을 수 있지만, 자물쇠가 사라지지 않고, 비자물쇠를 여러 번 얻으면 자물쇠가 사라진다는 것이다.다음과 같습니다.
mutex_init(&mutex);
void fun()
{
lock(&mutex);
//do something1
fun2();
unlock&mutex);
}
void fun2()
{
lock(&mutex);
//do something2
unlock(&mutex);
}
fun () 함수에 자물쇠를 추가하면 fun2 () 를 호출하고, fun2 () 도 자물쇠를 추가합니다. 비귀속 자물쇠라면 fun이 mutex를 가져오고, fun2가 mutex를 가져오면 자물쇠가 사라집니다.
2. 낙관 자물쇠(Optimistic Lock)와 비관 자물쇠(Pessimistic Lock)
주로 관계형 데이터베이스 저장에 쓰인다.낙관적 자물쇠는 대부분 데이터 버전(Version) 기록 메커니즘을 바탕으로 이루어진다. 즉, 데이터에 버전 표지를 추가하는 것이다.데이터를 읽을 때 이 버전 번호를 함께 읽고 업데이트할 때 이 버전 번호에 1을 추가합니다.이후에 제출한 데이터의 버전 데이터는 데이터베이스 테이블에 대응하는 기록의 현재 버전 정보와 비교하고 제출한 데이터의 버전 번호가 데이터베이스 테이블의 현재 버전 번호보다 크면 업데이트한다. 그렇지 않으면 기한이 지난 데이터로 간주한다.장점은 병발된 데이터베이스 읽기에 있어 장시간의 잠금 비용 대기를 피하고 단점도 뚜렷하여 부정확한 데이터를 데이터베이스에 저장할 수 있다.비관적 자물쇠는 비교적 이해하기 쉽다. 즉, 전체 데이터베이스 조작에서 데이터가 모두 잠긴 상태에 있다.즉 데이터가 한 번 읽는 업무에서 모든 데이터에 대한 수정이 이루어지지 않는다는 것이다.
3. 고정 잠금(Dead Lock) 및 고정 잠금(Live Lock)
사쇄는 모두가 잘 알고 있을 것이다. 쉽게 말하면 사대기에 들어가는 것이다. 예를 들어 P1이 자원 A를 점용하고 자원 B를 요청한다. P2가 자원 B를 점용하고 자원 A를 요청하면 쌍방이 계속 기다린다.그러나 자물쇠는 자원이 자기가 사용할 차례가 되지 않아 계속 굶주린다. 예를 들어 사무T1이 데이터 R을 봉쇄하면 사무T2가 R을 봉쇄해 달라고 요청해서 T2가 기다린다.T3도 R의 봉쇄를 요청했다. T1이 R의 봉쇄를 풀자 시스템이 먼저 T3의 요청을 승인했고 T2는 여전히 기다렸다.그리고 T4는 R을 봉쇄해 달라고 요청했다. T3가 R의 봉쇄를 풀자 시스템은 T4의 요청을 비준했다.T2는 영원히 기다릴 수 있다. 이것이 바로 자물쇠의 상황이다.
주로 일부 개념의 소개로 구체적인 것은 구체적으로 써야만 체득할 수 있다.
가르쳐 주셔서 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스레드 동기화 - 핵심 코드 세그먼트텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.