[운영체제] Thread 동기화

Chloe Choi·2021년 3월 22일
0

운영체제

목록 보기
10/10

Why

여러 Thread가 한 번에 mutable 변수에 접근한다면?
-> 데이터의 일관성을 보장할 수 없음 🤢

How

이 문제를 어떻게 해결할 수 있을까

  • thread 간 공유자원을 없애자
  • 변수를 immutable하게 하자
  • 변수에 접근할 때 동기화를 하자

마지막 방법에 대해 자세히 알아보자
✔️ 동기화: Thread가 자원에 접근할 때 처리권한을 주거나 순서를 조정하는 기법

What

동기화 기법들에 대해 알아보자

모드에 따라 다음과 같이 나누어진다.

  • 유저모드 동기화
  • 커널모드 동기화 -> 이걸 알아보자!

뮤텍스

  • 임계영역 접근 시 mutex를 획득해야 접근할 수 있도록
  • locking 메커니즘
    • mutex object를 획득해야만 접근 가능
      • 여러 스레드가 동시에 소유할 수 없음
      • 상태: signabled / non-signabled
        signabled -> non-signabled: 임계구역에 접근하고자 하는 thread가 waitForsingleObject 시
        non-signabled -> signabled: 소유자 thread가 releaseMutex 시
    • mutex를 소유한 thread만 lock을 release할 수 있음
// Thread #1이 실행 
void* do_loop(void *data) 
{ 
    int i; 
    for (i = 0; i < 10; i++) 
    { 
        pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
        printf("loop1 : %d\n", ncount); 
        ncount ++; 
        if(i == 10) return;
        pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
        sleep(1); 
    } 
} 
 
// Thread #2가 실행 
void* do_loop2(void *data) 
{ 
    int i; 
 
    // 잠금을 얻으려고 하지만 do_loop 에서 이미 잠금을  
    // 얻었음으로 잠금이 해제될때까지 기다린다.   
    for (i = 0; i < 10; i++) 
    { 
        pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
        printf("loop2 : %d\n", ncount); 
        ncount ++; 
        pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
        sleep(2); 
    } 
} 

👆 일관성 있는 count 출력 확인
ref. https://www.joinc.co.kr/w/Site/Thread/Beginning/Mutex

세마포어

  • 뮤텍스와 유사하지만 count 기능이 있음
    • count 기능: 임계영역에 접근 가능한 thread 개수를 조절하는 기능
      따라서, 여러 스레드가 다른 버퍼에서 같은 때에 동작하도록 함
    • count > 0 => signabled
    • count == 0 => non-signabled
      임계영역을 빠져나온 thread는 releaseSemaphore를 통해 count++
  • signaling 메커니즘 (소유하지 않음)
    👉 락을 걸지 않은 스레드도 시그널을 보내 락을 해제할 수 있음

정리

구분mutexsemaphore
메커니즘lockingsignaling
타입objectinteger
subtypeXcounting semaphore, binary semaphore
소유OX
변화lock / unlockwait() / signal()

Q. mutex를 획득한 thread가 또 그 mutex를 획득하려 한다면?

👉 데드락 발생
해당 thread는 waiting list에 들어왔는데 다른 thread가 unlock할 수 없음

Q. mutex == binary semaphore?

👉 No
locking mechanism != signaling mechanism
근데 동작하는건 같아 보임

ref. https://www.geeksforgeeks.org/mutex-vs-semaphore/

profile
똑딱똑딱

0개의 댓글