제3자에게 부탁하기(event)
리소스 접근 제어 방식중 하나이다. 특정 이벤트가 발생할때까지 대기한 다음 이벤트가 발생하면 제3자가 알려주는 방식으로 작동한다. 제3자가 커널레벨에 존재하는 경우 이벤트가 발생한 경우 사용자에게 알려주러 올때 context switching이 일어나므로 매우 느리다는 단점이 있다.
1. AutoResetEvent
문이 자동으로 잠긴다.
AutoResetEvent autoResetEvent = new AutoResetEvent(true);
public void Auquire()
{
autoResetEvent.WaitOne(); // 입장하면서 문을 닫음
}
public void Release()
{
autoResetEvent.Set(); // 문을 열음
}
01 생성자
초기 상태를 문이 열려있는 상태인지, 문이 닫혀있는 상태인지 여부를 사용하여 인스턴스를 초기화한다.
public AutoResetEvent (bool initialState);
매개변수
initialState : 초기 상태가 true인 경우 문이 열린 상태, false인 경우 문이 닫힌 상태
02 WaitOne()
AutoResetEvent가 신호를 받을때 까지 현재 쓰레드를 대기시킨다. 이는 문을 닫히게 만든다.
public virtual bool WaitOne ();
03 Reset
AutoResetEvent 객체를 재설정하여 대기 상태로 되돌린다. 이는 문을 닫히게 만든다. WaitOne메서드안에 Reset의 기능이 포함되어 있다.
public bool Reset ();
04 Set
AutoResetEvent 객체에 이벤트를 보내는 역할을 한다. 이는 대기 중인 쓰레드 중 하나가 깨어나고 작업을 진행할 수 있다. Set을 통해서 다른 쓰레드가 들어갈 수 있도록 문을 연다.
public bool Set ();
2. Manualresetevent
문이 수동으로 잠긴다.
ManualResetEvent manualResetEvent = new ManualResetEvent(true);
public void Auquire()
{
manualResetEvent.WaitOne(); // 입장 시도
manualResetEvent.Reset(); // 문을 닫음
}
public void Release()
{
manualResetEvent.Set(); // 문을 열음
}
01 생성자
초기 상태를 문이 열려있는 상태인지, 문이 닫혀있는 상태인지 여부를 사용하여 인스턴스를 초기화한다.
public ManualResetEvent (bool initialState);
매개변수
initialState : 초기 상태가 true인 경우 문이 열린 상태, false인 경우 문이 닫힌 상태
02 문 닫기
AutoRestEvent와 달리 입장을 하고 나서 문을 자동으로 닫지 않는다. 그러므로 Reset을 사용해서 수동을 문을 닫아 준다.
public void Auquire()
{
manualResetEvent.WaitOne(); // 입장 시도
manualResetEvent.Reset(); // 문을 닫음
}
03 문 열기
public void Release()
{
manualResetEvent.Set(); // 문을 열음
}
결과를 확인해보면 0이 나오지 않는다는 것을 알 수 있다. 이는 입장을 하고 나서 바로 문을 닫는것이 한번에 이루어져서 실행이 안되기 때문이다. Lock을 이용할때는 AutoResetEvent를 사용하는 것이 더 좋다
Manualresetevent이 사용되는 경우
입장을 한번에 한번씩 안하는 경우, 예를 들어 여러개의 쓰레드가 특정 작업을 동시에 수행할때 사용된다.
3. Mutex와 Event 차이점
Mutex 알아보러 가기
01 목적
Mutex : 공유 자원의 상호 배제를 위해 사용된다. 오직 한 번에 하나의 프로세스 또는 쓰레드만이 임계구역에 진입할 수 있도록 한다.
Event : 리소스 접근 제어 방식중 하나이다. 특정 이벤트가 발생할때까지 대기한 다음 이벤트가 발생하면 제3자가 알려주는 방식으로 작동한다.
02 동작 방식
Mutex : Lock과 Unlock 연산을 사용한다.
Event : set과 WaitOne연산을 사용한다.
03 가지고 있는 정보
Mutex : 상태(잠김 여부), Mutex를 보유하고 있는 쓰레드 id, 대기 중인 쓰레드 수
Event : 상태(신호 여부), 대기 중인 쓰레드 수
참고 : 본 내용은 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공부 > 운영체제' 카테고리의 다른 글
운영체제 - TLS(Thread Local Storage) (0) | 2023.06.06 |
---|---|
운영체제 - ReaderWriterLockSlim(RWLock), 사용자 정의 Lock구현 해보기 (0) | 2023.06.01 |
운영체제 - 캐시메모리, 캐시 컨트롤러,레지스터, RAM의 상호 작용(캐시 미스(Cache Miss),캐시 히트(Cache Hit) ) (0) | 2023.05.26 |
운영체제 - 커널(Kernel), 커널모드, 사용자모드 (0) | 2023.05.26 |
운영체제 - Backoff(Thread.Sleep(0), Thread.Yield()) (0) | 2023.05.26 |
댓글