컴퓨터(Computer Science)/시스템 프로그래밍(System Programming)

멀티스레드 환경에서의 동기화(Synchronization)

게임이 더 좋아 2020. 12. 9. 00:37
반응형
728x170

?? 동기화가 뭐지?? 

동기화의 목적은 스레드와 프로세스를 조정하는 것이다.

 

 

 

?? 왜 조정하는데...??

바로 Critical Section(single process; non kernel object)의 경우 때문이다.

뜻은 같은 자원을 접근하는 코드를 말한다. 

 

-> critical section은 반복적으로 동작하는 2개 이상의 스레드가 하나의 자원을 공유할 때 발생한다.

 

 

***Resource (자원)이란

Memory location이나 Data structure, file 등을 말한다.


 

Critical Section에 대해 조금 더 알아보자

이 말의 뜻은 "같은 자원을 접근하는 코드"이다.

 

얘도 또한 Object가 존재한다. (Win32 API가 제공)

또한 오직 하나의 스레드만 critical section에 접근이 허용된다.

** Kernel Object는 아니므로 핸들(handle)은 없다.

 

 

아래는 따른 메서드이다.

사실 밑에 내용은 그 떄 그 떄 찾아서 쓰면 된다. 굳이... 알 필요는 없다.

 

•Define critical section object

–CRITICAL_SECTIONcritical_section;

•Initializing critical section

–VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

•Deleting critical section object

–VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

•Entering the critical section

–VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

•Leaving the critical section

–VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

 


그렇다면 예를 들어봐야겠지??

 

CreateList 할 때 critical section을 만들어준다.

-> 그 영역이 바로 list다. 즉, 그 리스트에는 다른 스레드가 접근하지 못한다.

DeleteList 할 때 critical section을 지워준다.

->그 리스트를 삭제하면서 critical section도 지워줘야 한다.

AddHead를 할 때 critical section에 들어간 스레드만 오직 접근할 수 있게 한다.

또한 Leave를 해야 다른 스레드가 들어갈 수 있다.

 

** 다시 말해서 Critical Section을 정해주는 작업, Critical Section을 들어가게 해주는 작업, 나오게 하는 작업, 삭제하는 작업 4가지가 항상 필요하다.

물론 Critical Section 변수는 당연하고

 

 

**다시 영어로 요약

A critical section is the piece of program code that cannot be executed together with another critical section belonging to another process.

The critical section problem is the problem of programming in such a way that, for different critical sections, conditions of mutual exclusion, progress, and bounded waiting are met.

 

*참고

 

 

**주의사항

Lock time, 즉 스레드가 사용하는 자원에 접근하는 시간을 최소로 해야한다.

절대로 critical section에서 Sleep() 또는 Wait...() APIs를

선언해서는 안된다. 

 

그리고 critical section을 빠져나오게 해주는 작업이 항상 필요하다.

만약 스레드가 그 section을 빠져나오지 않고 끝나버리면 다시는 그 section에 접근할 수 없다.

 


그렇다면 위의 경우를 어떻게 처리해야할까??

3가지 방법이 있다.

 

1. 뮤텍스(mutexes)->링크

Mutually Exclusive의 줄임말로

mutex는 critical section과 같은 기능을 수행하며 차이점은 여러 갱의 프로세스에 속해있는 스레드들을 동기화한다.

 

 

 

2. 세마포(Semaphores)->링크

Resource에 동시에 접근할 수 있는 스레드의 개수를 제한한다.

 

 

 

 

3. 이벤트 객체(Event Objects) -> 링크

 

순차적으로수행해야하는두개이상의Threads 처리방법으로

공유데이터에 대한 접근을 제어하기 위한 Mutex나 Semaphore와는 달리

Event는 어떤 연산이 끝났을 때 Signal 시키기위한 것이다.

 

 

 

이 3가지에 대해서는 따로 글을 써야겠다.

반응형
그리드형