Thread-Safe 란?

혀누·2022년 9월 11일
0

Intro.

이전에 PintOS UserProgram 에 관한 글을 쓴적이 있었는데 그때 fork 시스템 콜에 대해 이야기 하면서 'fork 는 thread-safe 하지 않다.'라는 글을 인용했던 적이 있다.

그 당시에는 무슨뜻인지도 모르고 그냥 멋있어보여서 가져다 쓴것 같은데, 최근에 자바스크립트 엔진에 관해 공부를 하던중 자바스크립트는 single thread 라서 thread-safe 하다. 라는 문구를 보았다. 근데 아직도 무슨 뜻 인지 모른다는 사실을 깨닫고 간단하게 정리해보려고 한다.

Fork() and Thread Safe

간단하게 정리해보자. (너무 간단해서 중간 중간 생략하거나 틀린내용이 있을수 있으니 지적 부탁드립니다)

먼저 thread-safe 란 뭘까?

스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.

라고 한다. 여기서 포인트는 '동시에 함께 실행되더라도 수행결과가 올바로 나오는것' 이라 할 수 있겠다.

왜 fork 는 thread-safe 하지 않을까?

당연하게도 fork 는 multi-thread 라는 개념이 없던 시절에 만들어진 시스템 콜이어서 그렇다. 즉, 애초에 고려하지 않은 것이다. ( fork 에 관해 궁금하다면? )

  • thread => 메모리를 공유하며 실행된다.
  • process => 독립적인 메모리 공간을 점유하며 실행된다.

구체적으로 그러면 뭐가 문제가 될까?

POSIX 시스템에서 fork 시스템콜이 지니는 특성 때문에 문제가 된다.
fork 란 부모 프로세스에서 실행되어 정확히 동일한 자식 프로세스를 생성하고 병렬적으로 실행하게 되는데, 이때 fork를 호출한 스레드를 제외한 다른 스레드들을 모두 멈추고 죽이게 된다. 이때 fork는 실행하였기 때문에 부모 프로세스의 모든 메모리를 복사하여 가져오게되는데, 이 메모리 안에는 mutex나 conditional variable 등도 들어있다.

즉, 만약 fork를 실행하던 당시에 특정 critical section 의 mutex가 다른 스레드에 의해 점유된채로 (그것이 메모리에 기록된 채로) 분기해 나왔는데 그걸 가져간 스레드가 그냥 죽어버린다면 영영 mutex는 돌아오지 않게되는 것이다.
mutex 가 돌아오지 않으니 당연히 그 mutex가 막고있는 critical section 에도 접근할 수 없게된다.

이는 동시에 함께 실행되더라도 수행결과가 올바르게 나오지 않는 것이므로 (critical section 은 실행을 못하니) thread-safe 하지 않다. 라고 할 수 있다.

(여담이지만, 이건 마치 똑같은 열쇠를 사용하는 차가 두 대 있었는데 한 차 주인이 열쇠를 가져가놓고 돌려주기전에 불의의 사고로 죽어버려서 다시는 다른 차를 타지못하게 되버린 이야기 같다.)
key_in_the_car

Javascript and Thread Safe

그렇다면 자바스크립트 v8 엔진은 왜 thread safe 할까!?

당연하게도 싱글 스레드로 돌아가기 때문에 그렇다. 애초에 동시에 여러 스레드가 하나의 함수나 변수에 접근할 일이 없다.

( 자바스크립트 V8 엔진은 Memory Heap 과 Call Stack 으로 이루어져 있는데 이때 call stack 이 싱글 스레드다.)

profile
개발자(물리)

0개의 댓글