|
: 저는 원래 크리티컬 섹션은 아예 진입이 안되는줄 알았거든요
음, 뭔가 혼동을 하신 듯 하네요. 진입이 선점(preemption)을 말하는 것인가요?
앞부분에서 재진입에 대해서 상세히 말씀을 드리지 않았는데...
재진입은 다음과 같은 경우에서,
void func();
thread A()
{
func();
}
thread B()
{
func();
}
쓰레드 A가 먼저 수행되고 그 후에 쓰레드 B가 쓰레드 A를 선점(Preemption)했다고 가정했을 때 쓰레드 B가 종료된 후 쓰레드 A가 중단됬던 작업을 끝마쳤을 때에 func() 이 제대로 된 결과를 내었느냐 그렇지 않느냐를 따지는 것입니다.
대부분의 경우 함수와 임계영역과의 관계는 아래와 같이 가정하는 것이 편합니다.
func()
{
....
critical section code
....
}
임계 영역도 구성에 따라서 선점, 비선점 될수도 있구요 각각의 특징이 있습니다.
만약 위의 예에서 func()가 임계 영역을 가지고 있다면 상황이 복잡해지죠. 쓰레드 A가 쓰레드 B에 의해서 선점당할 때 임계 영역에 있었느냐 아니냐에 따라서 양상이 매우 달라지게 됩니다. 만약 임계 영역에 있었다면 쓰레드 B는 쓰레드 A가 임계 영역을 빠져나올 때까지 block 되어야 하죠. 물론 임계 영역에서도 선점이 가능하도록 되어 있을 때입니다.
|