반응형
RaceCondition
여러개의 쓰레드들이 공유 변수 동시 접근 시 실행 순서에 따라 결과값이 달라지는 문제
static int number = 0;
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
number++;
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
number--;
}
static void Main(string[] args)
{
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(number);
}
현재 number가 0이라고 할 때, 코드가 번갈아 실행되면 number가 0이 나와야하는데 다른 값이 나오는 문제가 발생한다.
2. 왜 RaceCondition이 발생했을까?
01 number++의 원리
int temp = number; // 1번 number 주소에 있는 값을 temp에 옮기기
temp += i; // 2번 temp 값 1 늘리기
number = temp; // 3번 number 주소 값에 temp 값 넣기
number++;를 실행하면 세가지 어셈블리 언어로 이루어져있다.
세개의 명령어 중 어느 하나라도 끼어들게 되면 쓰레드 간의 실행 순서가 바뀌어서 잘못된 결과를 도출하게된다.
02 위의 Thread_1과 Thread_2 실행 순서를 표에 정리
Thread_1과 Thread_2가 동시다발적으로 실행 됐다고 가정
1) ContextSwitch가 안일어난 경우
최종적인 number값이 0이 나온다.
2) ConstextSwitch가 일어난 경우
최종적인 number 값이 -1이 나와 RaceCondition이 일어났다.
03 Contextswitch
Contextswitching 알아보러 가기
실행중인 쓰레드나 프로세스가 대기 상태에 빠지면 운영체제는 다음으로 실행될 것을 선택하고 해당 쓰레드나 프로세스의 상태를 복원한다.
3. 문제를 예방하는 방법
Atomic(원소적) 실행
공유 변수를 통해 상호작용하는 프로세스 혹은 쓰레드 간에 문맥교환이 언제 일어나도 간섭이 없는 실행을 보장
- 공유 변수를 사용하는 코드 영역에 임계구역을 설정
- 한 쓰레드가 먼제 임계구역 내에 진입하여 실행 중 문맥 교환이 발생하여 상대 쓰레드에 선점되더라도 그 쓰레드가 임계구역에 진입 하는 것을 불허하고 대기하도록 한다.
Interlocked 알아보러 가기
참고 : 본 내용은 MMORPG PART4 강의를 수강하여 작성하였습니다.
https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4
반응형
'cs공부 > 운영체제' 카테고리의 다른 글
운영체제 - 프로세스 시스템 (0) | 2023.05.16 |
---|---|
운영체제 - Interlocked(Increment,Exchange,Add메서드 등) (0) | 2023.05.15 |
운영체제 - 캐시(Cache)이론 (0) | 2023.05.02 |
운영체제 - 쓰레드(Thread), 기아상태,쓰레드풀(Thread Pool) (0) | 2023.04.28 |
운영체제 - 문맥교환(Context switching), 프로세스의 상태 (0) | 2023.04.28 |
댓글