728x90
728x90
Thread Safe
- Race Condition 상황이 발생해도 실행에 문제가 생기지 않는 것을 의미한다.
- 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것을 의미한다.
Race Condition(경쟁 상태)
- 공유 자원에 대해 두 개 이상의 스레드가 동시에 읽거나 쓰는 상황을 의미한다.
- 접근의 순서에 따라 결과값에 영향을 주는 문제가 발생할 수 있다.
Thread Safe를 지키는 방법
- Re-entrancy(재진입성)
- 정적(전역) 변수를 사용하면 안 된다.
- 정적(전역) 변수의 주소를 반환하면 안 된다.
- 호출자가 호출 시 제공한 매개 변수만으로 동작해야 한다.
- 싱글톤 객체의 잠금에 의존하면 안 된다.
- 다른 비-재진입 함수를 호출하면 안 된다.
- Thread-local Storage
- 공유자원의 사용을 최대한 줄이고 각각의 Thread에서만 접근 가능한 저장소를 사용하여 동시 접근을 막는 것
- Mutual Exclusion
- Lock을 통해 공유자원을 제어하는 것
- 뮤텍스, 세마포어 등을 이용한다.(이전 글에서 설명함)
- Dekkers's Algorithm, Peterson's Algorithm 을 사용한다.
- Atomic Operation
- Atomic 연산을 사용하는 것
- 더이상 쪼갤 수 없는 가장 작은 단위의 명령어를 실행하는 것
- 도중에 인터럽트가 발생할 수 없다.
Dekker’s Algorithm
Mutual Exclusion을 지키기 위한 알고리즘이다.
flag와 turn 변수를 사용하여 Critical Section에 들어갈 프로세스(스레드)를 결정하는 방식이다.
- 2개의 스레드가 Critical Section에 진입하길 원하는 과정이다.
- flag : 초기값은 flag [0] = flag [1] = false이고 임계 영역에 들어가겠다는 표시는 true로 한다.
- turn : 임계 영역에 들어가는 순서로, 0 또는 1의 값을 갖는다. 0인 경우엔 P0의 순서, 1인 경우엔 P1의 순서이다.
작동 방식
- 함수가 실행되면 각 thread는 critical section에 접근하겠다는 표시로, 각자의 flag 를 true로 설정한다.
- 상대방의 순서라면 자신의 flag를 false로 바꾸고 turn이 넘어올 때까지 대기한다.
- 자신의 순서라면 Critical Section 작업을 실행한다.
- 작업이 끝나면 turn을 상대방에게 넘겨주고, flag를 false로 설정한다.
한계
- while 문에서 busy waiting 이 발생할 수 있다.
- 프로세스가 늘어나면 알고리즘이 복잡해진다.
Peterson’s Algorithm
Mutual Exclusion을 지키기 위한 알고리즘이다.
Dekker’s Algorithm과 마찬가지로 flag 와 turn 변수를 사용한다.
Dekker's Algorithm보다 단순하다.
- 2개의 스레드가 Critical Section에 진입하길 원하는 과정이다.
작동 방식
- 함수가 실행되면 각 thread는 critical section에 접근하겠다는 표시로, 각자의 flag 를 true로 설정한다.
- turn을 상대에게 양보한다. - 먼저 양보한 프로세스가 양보받게 된다.
- while 문의 조건으로 인해 양보한 스레드는 대기하고, 양보 받은 스레드는 Critical Section에 진입한다.
- Critical Section 작업이 끝나면 flag를 false로 설정하여 다른 스레드가 실행할 수 있게 된다.
한계
- 여전히 busy waiting 이 발생할 수 있다.
- 프로세스가 n(n>2)개일 경우 알고리즘이 매우 복잡해진다.
- 소프트웨어적 방법이기에 알고리즘을 알아야만 프로그래밍할 수 있다.
참고
728x90
728x90
'Computer Science > Operating System' 카테고리의 다른 글
내부 단편화, 외부 단편화 (0) | 2023.04.02 |
---|---|
Thread Pool(스레드 풀) / Monitor(모니터) / Fork-Join(포크-조인) (1) | 2023.03.08 |
IPC(Interprocess Communication) 프로세스 간 통신 (0) | 2023.03.08 |
Compile(컴파일) (0) | 2023.03.08 |
Deadlock(데드락) (0) | 2023.03.08 |