본문 바로가기
cs공부/운영체제

운영체제 - RaceCondition, Atomic

by 코딩하는 돼징 2023. 5. 11.
반응형

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 알아보러 가기

 

운영체제 - 문맥교환(Context switching)

1. 문맥교환 CPU를 다른 프로세스로 넘기는 작업이다. 실행이 정지되는 프로세스 문맥은 보존되고, 새로 실행되는 프로세스의 문맥이 활성화된다. 사용자 수준 문맥은 메모리에 남아 있으나(원래

code-piggy.tistory.com

실행중인 쓰레드나 프로세스가 대기 상태에 빠지면 운영체제는 다음으로 실행될 것을 선택하고 해당 쓰레드나 프로세스의 상태를 복원한다.


3. 문제를 예방하는 방법

Atomic(원소적) 실행

공유 변수를 통해 상호작용하는 프로세스 혹은 쓰레드 간에 문맥교환이 언제 일어나도 간섭이 없는 실행을 보장

- 공유 변수를 사용하는 코드 영역에 임계구역을 설정

- 한 쓰레드가 먼제 임계구역 내에 진입하여 실행 중 문맥 교환이 발생하여 상대 쓰레드에 선점되더라도 그 쓰레드가 임계구역에 진입 하는 것을 불허하고 대기하도록 한다.

 


Interlocked 알아보러 가기

 

운영체제 - Interlocked(Increment,Exchange,Add메서드 등)

Interlocked 다중 쓰레드에서 공유하는 변수에 대한 원자 단위 연산을 제공 장점 RaceCondition 알아보러 가기 운영체제 - RaceCondition, Atomic RaceCondition 여러개의 쓰레드들이 공유 변수 동시 접근 시 실행

code-piggy.tistory.com

 

 

 

 

 

참고 :  본 내용은 MMORPG  PART4 강의를 수강하여 작성하였습니다.

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

반응형

댓글