2009년 11월 7일 토요일

스레드 동기화 - 임계영역

스레드 동기화

 

 

임계영역

단일 태스킹 원영체제에서 실행되는 컴퓨터 프로그램은 자신의 활동을 조정하는 데 도움을 주는 교통 신호등이 필요하지 않다. 이들은 길을 소유한 것처럼 실행하며, 실제도로 그렇게한다. 이들이 하는 일을 방해하는 것은 없다.

 

멀티태스킹 운영체제에서도 대부분의 프로그램은 서로 독립적으로 실행되는 것처럼 보인다. 그러나 몇가지 문제가 발생할 수 있다. ( ex - 두 프로그램이 같은 파일을 동시에 읽고 쓸 때 )

 

멀티스레딩을 지원하는 운영체제에서도 상황이 난잡해지고 잠재적으로는 위험해질 수 있다. 예를 들면,  하나의 스레드가 하나 이상의 변수를 갱신하고, 또 다른 스레드가 그 변수들을 사용할 수 있다. ( 이것은 때로는 문제를 일으키고, 또한 때로는 문제를 일으키지 않는다. )

 

하지만 여러 개의 변수나 데이터 구조체를 스레드가 공유한다면, 이와 같은 여러 개의 변수나 구조체의 여러 필드는 자기들끼리의 일관성이 있어야 한다. 운영체제는 이 변수들을 갱신하는 도중에 스레드를 중단할 수 있는데, 그렇게 되면 이 변수들을 사용하는 또다른 스레드는 일관성이 없는 데이터를 다루게 될 것이다.

 

결과적으로는 충돌이 발생한다.

이때 우리에게 필요한 것은 프로그래밍에서 교통 신호등에 상응하는 것으로, 스레드 교통을 조정하고 동기화하는 것을 도와주는 "임계영역(critical section)"이다. 임계영역중단(interrupt)해서는 안되는 코드 블록이다.

 

 

임계영역을 사용하기 위한 네가지 함수

 

임계영역 함수들을 사용하려면 임계 영역 객체(critical section object)를 정의해야 한다.

이것은 CRITICAL_SECTION타입의 전역변수다.

CRITICAL_SECTION  cs;

1. 임계 영역 객체를 사용하기 전, 프로그램의 스레드 중 하나를 초기화 한다.

InitializedCriticalSection (&cs) ;

2. 스레드를 호출하여 임계 영역에 진입!

EnterCriticalSection (&cs) ;

3. 임계 영역을 탈출하는 함수

LeaveCriticalSection (&cs) ;

4. 프로그램에서 임계 영역 객체가 더 이상 필요하지 않으면, 다음 함수를 호출하여 삭제!

DeleteCriticalSection (&cs) ;

 

★ 임계 영역을 소유할 수 있는 스레드는 언제든 단 하나뿐이다.

댓글 없음:

댓글 쓰기