(C#) 컨텍스트 스위칭과 Event
포스트
취소

(C#) 컨텍스트 스위칭과 Event

컨텍스트 스위칭

컨텍스트 스위칭은 여러 프로세스가 실행되고 있을 때 기존에 실행되던 프로세스를 중단하고

다른 프로세스로 옮겨지는 중에 생기는 현상을 말한다.

실행 중인 프로세스가 변경되면 CPU의 레지스터 값을 변경하는데,

변경되기 전에 이전 프로세스가 지니던 데이터를 메모리에 저장시켜줘야 한다.

실행되는 프로세스의 변경 과정에서 발생하는 컨텍스트 스위칭은 시스템에 부담을 준다.

💻 Event 코드

Auto Reset Event (톨게이트 개념)

[ Source Code (Click) ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Lock
{
    // bool <- 커널
    AutoResetEvent _available = new AutoResetEvent(true);    // 애를 쓰는게 더 현명함!

    public void Acquire()
    {
        // 톨게이트를 통과하면 문이 자동으로 닫히는 개념
        _available.WaitOne();   // 입장 시도 ( _available.Reset(); 포함됨.)
    }

    public void Release()
    {
        _available.Set();       // 문을 열어준다.
    }
}

Manual Reset Event (방에 있는 문 개념)

[ Source Code (Click) ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Lock
{
    ManualResetEvent _available = new ManualResetEvent(true);

    public void Acquire()
    {
        // 방문에 들어가면 수동으로 닫는 개념
        _available.WaitOne();   // 입장 시도
        _available.Reset();     // 문을 닫는다.
    }

    public void Release()
    {
        _available.Set();       // 문을 열어준다.
    }
}


AutoResetEvent와 ManualResetEvent 차이점

AutoResetEvent는 .WaitOne() 실행 시 문도 같이 닫아주는 반면

ManualResetEvent는 .Reset()도 작성해줘야 한다.

이로 인해 AutoResetEvent는 결과가 정상적으로 나오지만

ManualResetEvent는 두줄의 코드로 입장과 문을 닫기 때문에 다른 결과가 나온다.

그러므로 AutoResetEvent를 사용하는 것이 더 현명하다.

Mutex

[ Source Code (Click) ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static int _num = 0;
static Mutex _lock = new Mutex();

static void Thread_1()
{
    for(int i=0; i<1000000; i++)
    {
        _lock.WaitOne();
        _num++;
        _lock.ReleaseMutex();
    }
}

static void Thread_2()
{
    for(int i=0; i<1000000; i++)
    {
        _lock.WaitOne();
        _num--;
        _lock.ReleaseMutex();
    }
}

Mutex 사용 이유

Mutex는 앞서 말한 Event와 기능면에서 다를 바가 없지만

int, bool, ThreadID 등 여러 정보를 제공한다.

이렇기 때문에 비용면에서 부담이 많이되기 때문에

이런게 있다 참고하고 AutoResetEvent를 사용하는게 더 좋다.


💡 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

(C#) SpinLock

(C#) ReaderWriterLock