Interlocked계열이 성능도 빠르고 우수하지만 정수만 사용할 수 있다는 단점이 있다.
임계구역 (Critical Section)
Atomic 실행을 위하여 각 프로세스 혹은 쓰레드가 공유변수, 자료구조, 파일 등을 배타적으로 읽고 쓸 수 있도록 설정한 코드 세그먼트 또는 영역
임계 구역에 진입하는 쓰레드는 다른 쓰레드와의 동시 접근으로부터 상호배제(Mutal Exclusive) 되야 한다.
예시 - 화장실에 들어갈 때 문을 잠그고, 나올때에 여는 것
임계구역에 대한 요구사항
01 상호 배제(mutal exclusion)
한 프로세스가 임계 구역을 실행 중일때, 다른 어떤 프로세스도 임계 구역을 실행할 수 없다.
02 진행(Process)
임계구역 안에 반드시 하나의 프로세스를 선택하여 진입시키는 올바른 결정 기법이 있어야 하고, 이러한 결정은 무한정 미루어 져서는 안된다.
03 제한된 대기(bounded waiting)
한 프로세스가 임계 구역에 대한 진입 요청 후부터 요청의 수락까지의 기간 내에, 다른 프로세스가 임계 구역을 실행할 수 있는 회수에는 제한이 있어야 한다.
동기화(Synchronization)
임계 구역을 관리하기 위해 필요한 동기화
코드 상에 임계구역을 설정하여 진입/진출을 순서화(Serialize) 하는 것 - 코드 상으로는 독립적이지만 실행 상황에서 선행 제약을 만드는 것에 해당
Monitor 클래스
C#에서 동기화를 구현하기 위해서 사용되어지는 Monitor 클래스
1. Monitor.Enter
임계구역에 진입 - 화장실 문을 잠금
public static void Enter (object obj);
매개변수
obj - 열쇠 역할
2. Monitor.Exit
임계구역에서 나옴 - 화장실에서 나오면서 잠금을 해제
public static void Exit (object obj);
매개변수
obj - 열쇠 역할
Code 예시
static void Thread()
{
Monitor.Enter(_obj);
number--;
Monitor.Exit(_obj);
}
만약 임계구역 안에서 return이 된다면 어떻게 될까?
화장실로 예를 들자면 화장실 문을 잠그고 잠들어 버린 상황이다. 그러므로 문이 영영 잠겨버리면서 DeadLock(무한히 대기 하는 상황)이 발생한다.
static void Thread()
{
Monitor.Enter(_obj);
number--;
return;
Monitor.Exit(_obj);
}
예방하는 방법
01 try - finally문
finally를 통해서 무조건 임계구역에 빠져나오게 한다.
try
{
Monitor.Enter(_obj);
number++;
return;
}
finally
{
Monitor.Exit(_obj);
}
02 lock문 사용
lock문은 암묵적으로 Monitor 클래스의 Enter를 호출하여 lock을 획득하고 코드 블록을 실행한 후 finally에서 Monitor.Exit메서드를 호출하여 lock을 해제한다.
lock(_obj)
{
number++;
return;
}
위의 코드는 아래와 같이 컴파일러에의해 변환된다.
try
{
Monitor.Enter(_obj);
number++;
return;
}
finally
{
Monitor.Exit(_obj);
}
이러한 암묵적인 호출 덕분에 코드를 간결하게 작성할 수 있다.
참고 : 본 내용은 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공부 > 운영체제' 카테고리의 다른 글
운영체제 - DeadLock(데드락) (0) | 2023.05.22 |
---|---|
운영체제 - Peterson's Solution, Bakery 알고리즘(상호배제 문제 해결) (0) | 2023.05.16 |
운영체제 - 프로세스 시스템 (0) | 2023.05.16 |
운영체제 - Interlocked(Increment,Exchange,Add메서드 등) (0) | 2023.05.15 |
운영체제 - RaceCondition, Atomic (0) | 2023.05.11 |
댓글