CS/OS
[운영체제] 스레드 동기화
seulll
2024. 12. 7. 15:13
스레드 동기화
- 다수의 스레드가 공유 데이터를 동시에 접근할 때 공유 데이터가 훼손되지 않게 스레드의 실행을 제어하는 기법
- 한 스레드가 공유 데이터 사용을 마칠 때까지 다른 스레드가 공유 데이터에 접근하지 못하도록 제어
‣ 임계구역과 상호배제
- 임계구역 : 공유 데이터에 접근하는 프로그램 코드들
- 상호배제 : 임계구역에 먼저 진입한 스레드가 임계구역의 실행을 끝낼 때까지, 다른 스레드가 진입하지 못하도록 보장
상호배제 구현 요구조건
- 상호배제가 강제되어야 함
- 임계구역에 접근하고자 하는 스레드의 수행이 무한히 미루어져서는 안 됨
- 임계구역이 비어 있을 때, 임계구역에 진입하려고 하는 스레드는 즉시 임계구역에 들어갈 수 있어야 함
- 일반 코드에서 수행이 멈춘 스레드는 다른 스레드의 수행을 간섭해서는 안 됨
- 스레드 개수나 상대적인 스레드 수행 속도에 대한 가정은 없어야 함
- 임계구역에 들어간 스레드는 일정한 시간 내에 임계구역에서 나와야만 함
‣ Lock 변수를 이용한 상호배제 시도
entry 코드: 임계구역에 진입할 때 lock 변수 값을 검사하여 0인 경우 1로 만든 후 진입 → 잠김
· Lock 변수 값이 1인 경우, 대기함(spin-waiting, busy-waiting)
exit 코드: 임계구역에서 나올 때 lock 변수를 0으로 만듦 → 열림
‣ lock 변수를 사용한 상호배제의 실패
- 갱신되는 공유 변수인 lock 변수 값을 읽는 명령과 lock 변수에 1을 저장하는 2개의 명령 사이에서 컨텍스트 스위칭이 될 때 문제 발생
해결책 : 원자적 명령 사용
- 원자적 명령: 같은 메모리 위치에 대한 읽기와 쓰기 또는 읽기와 테스트를 하나의 명령 인출 사이클 동안 처리하는 기계 명령 / TSL(Test and Set Lock)
운영체제 지원 멀티스레드 동기화 기법
· lock 방식 : 뮤텍스(mutex), 스핀lock(spinlock)
· wait-signal 방식 : 세마포어(semaphore)
1. 뮤텍스
· 잠김/열림 중 한 상태를 가지는 lock 변수 이용
· lock을 소유한 스레드만 임계구역에 진입시킴
· 진입을 시도하는 다른 스레드는 큐에 대기: sleep-waiting lock 기법
- 구성요소 : lock변수, 대기 큐, 연산
- 임계구역의 실행시간이 짧은 경우 비효율적
2. spinlock
- busy-waiting lock 기법
· 스레드가 큐에서 대기하지 않고 lock이 열릴 때까지 계속 lock 변수 검사
· 뮤텍스와 거의 같고 busy-waiting이라는 점에서만 다름
· 대기 큐 없음
· busy-waiting으로 인해 처리기를 계속 소모, 처리기가 다른 스레드를 실행할 수 없음 - lock을 소유한 스레드만 자원 배타적 사용 · 공유 자원 하나 당 하나의 spinlock 사용
- 단일처리기 시스템에서 비효율적 / 멀티처리기 시스템에서 적합
- 임계구역의 실행시간이 짧은 경우 효과적
3. 세마포어
- n개의 공유 자원을 멀티스레드가 공유하여 사용하도록 돕는 운영체제가 제공하는 자원 관리 기법
- 구성요소 : 자원, 대기 큐, counter 변수
- 세마포어 연산
- P 연산 (wait 연산): 자원 요청 시 실행하는 연산, 자원 사용 허가를 얻는 과정
- V 연산 (signal 연산): 자원 반환 시 실행하는 연산, 자원 사용이 끝났음을 알리는 과정