구글애드센스


재진입함수(Reentrant)와 Thread-Safe 함수의 차이점. STUDY



MicroC/OS-II 실시간 커널을 읽는중에 재진입 함수라는게 나왔다.

가끔 linux based 의 오픈소스 코드를 보다보면 Makefile에 Reentrant 옵션을 주는 경우가 있다.
한글로 표현하면 "재진입함수"이다. (재진입 함수라는 이름은 솔직히 지금 알았다.)

재진입함수라는 것은,
선점형 커널이고, 인터럽트가 활성화 되어있다고 가정할 때,
일반 우선순위의 태스크가 실행되고 있는 도중에 ISR이 불려 더 높은 우선순위의 태스크로 옮겨갔다가 다시 돌아와도
아무 문제없는 함수를 재진입가능 함수라고 부른다.

....음?
Thread-Safe 함수랑 언뜻 보면 은근 비슷해보이는데,
갑자기 급 궁금해졌다. 뭐가 다른거냐...

Wiki에 역시 관련 내용이 정리되어있었다.

http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29#Relation_to_thread_safety

위 링크의 Relation to thread safety라는 제목으로 되어있는 부분을 보면 아래와 같다.

It must not be confused with thread-safe. A function can be thread-safe and still not reentrant.
재진입 함수는 Thread-Safe 함수와 혼동되어선 안된다. 함수는 Thread-Safe 일지라도 여전히 재진입 함수는 아닐 수 있다.

For example, a function could be wrapped all around with a mutex which avoids problems in multi-threading environments, and if that function is used as reentrant in an interrupt service routing, could starve waiting for the first execution to release the mutex.
예를 들어, 멀티쓰레드 환경에서 모든 부분이 mutex 로 씌워져있고 만약 그 함수가 ISR의 재진입 함수로써 사용된다고 하면 첫번째 실행이 mutex를 놓을때까지 기아상태에 놓일 수 있다.

The key for avoiding confusion is that reentrant refers to only ONE thread executing.
혼동하지 않기 위해서 "재진입" 함수는 오직 단일 쓰레드 실행이라 생각해야한다.

It is a concept from the time when no multi-tasking operating systems existed.
멀티태스킹이 지원되지 않던 OS 시절에나 존재했던 개념이다.

Conversely a reentrant routine may or may not be thread-safe.
다르게 말하면, 재진입 함수는 Thread-Safe 일수도 있고 Thread-Safe가 아닐 수도 있다.


음.. 쉽게 말하면

function A가 있다고 치고 요놈은 MUTEX B로 둘러쌓인 부분을 갖고 있다.
일반 우선순위의 태스크가 function A를 호출하여 MUTEX를 잡고 들어가 있는 동안
ISR이 호출되고 높은 우선순위의 태스크가 생긴다. 그런데 공교롭게도 그 높은 우선순위의 태스크가 function A를
호출한다. 함수자체는 Thread-Safe인데 이건 재진입 함수가 아니다.

라는 것이다. 근데.. 비선점형일 경우에는 어떤 경우가 있을 수 있지 대체 -_-;;




덧글

댓글 입력 영역