티스토리 뷰
스래드 동기화
동일한 프로세스 내부에 생성된 스래드들은 병행적으로 실행되며 자원(프로세스의 코드 영역과 데이터 영역)을 공유한다. 따라서, 임계 영역의 문제(결정성)를 해결하기 위한 동기화 기법이 필요하다.
스래드 동기화 기법
1) 스래드 뮤텍스(mutex): 공유 자원의 개수가 오직 하나일 경우에만 사용.
2) 스래드 세마포어(semaphore): 공유 자원의 개수가 하나거나 그 이상일 경우에도 사용 가능.
* 표준 라이브러리가 아님으로 컴파일링시 “–lpthread”를 반드시 첨가해야 한다. (ex: $gcc thread.c –o thread –lpthread)
1) 스래드 뮤텍스(mutex):
뮤텍스(mutexes)는 “MUTual Exclusion locks”의 약자이다.
공유 자원에 대한 상호 배제적 접근을 허용한다.
사용법
① 뮤텍스 타입 변수를 선언한다. (ex: pthread_mutex_t mutex;)
② 변수의 속성을 초기화한다. (ex: pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutex_init(&mutex, &attr;)
③ 뮤텍스 변수에 잠금을 시도한다. (ex: pthread_mutex_lock(&mutex); )
④ 뮤텍스 변수의 잠금을 해제한다. (ex: pthread_mutex_unlock(&mutex); )
2) 스래드 세마포어(semaphor)
네덜란드 사람 Dijkstra가 제시한 방법으로, 세마포어는 초기 값을 부여한 후 P(Proberen), V(Verhogen) 연산자에 의해서만 변경이 가능한 정수형 변수.
사용법
① 세마포어 타입 변수를 선언한다. (ex: sem_t s; )
② 변수의 초기 값을 부여한다. (ex: sem_init(&s, 0, 5); 초기값=자원의 갯수(5))
③ P, V 연산을 시도한다. (ex: sem_wait(&s); sem_post(&s);)
P(S) 연산(S 값이 0이면 대기상태로 전환)
sem_wait(S) :
if (S == 0) then block();
S = S – 1;
V(S) 연산(S 값이 1이고, 대기상의 스래드가 존재하면 대기상태 스래드 중에서 하나를 준비상태로 전환)
sem_post(S) :
S = S + 1;
if((S == 1) && (waiting_threads)) then wakeup(t);
'cs > operating system' 카테고리의 다른 글
[운영체제/OS] 파이프/메시지 큐 (0) | 2021.04.17 |
---|---|
[운영체제/OS] 프로세스 간 통신(메시지 전송/공유 메모리 방식) (0) | 2021.04.17 |
[운영체제/OS] 임계 영역(critical section) (0) | 2021.04.02 |
[운영체제/OS] 결정성, 생산자/소비자 프로세스, 경쟁 조건 (0) | 2021.04.02 |
[운영체제/OS] 리눅스 프로세스 (0) | 2021.03.28 |