Skip to main content

One post tagged with "Thread Safe"

View All Tags

Process & Thread

· 7 min read
Alex Han
Software Engineer

Operating Architecture Operating Architecture

배경

누군가한테 질문을 받았다. 분명 파이썬에서 멀티 프로세스를 사용하거나 고랭에서 멀티 쓰레드를 사용해 성능을 향상 시켰었는데 어떻게 사용해 봤다만 이야기 했습니다.

모르는데 해봤다고 말하니 모르고 막 사용한 거 같은 부끄러움이 밀려왔다. 다음부터는 좀 더 알아보고 사용해야지 싶어 간단히 정리해 봅니다.

Process & Thread

Process

운영체제로부터 자원을 할당받는 작업의 단위로서 프로그램이 메모리에 올라가 실행 중인 상태가 될 때 그 상태 단위를 프로세스라고 합니다.

Thread

할당 받은 자원을 이용하는 실행의 단위로서 하나의 process 내에 여러 개의 thread 가 생길 수 있습니다.

결론

process는 작업을 수행하기 위한 단위이고 thread는 process를 수행하기 위한 단위입니다.

Multi Process & Multi Thread

Multi Process

여러 개의 process로 하나의 작업을 처리하는 것입니다.

하나의 process에서 오류가 생겨도 프로그램은 동작하는 장점이 있고 context switching 비용이 발생하는 단점이 있습니다.

Multi Thread

여러 개의 thread로 하나의 process를 처리하는 것입니다.

시스템 자원 소모 감소와 처리 비용 감소, thread 간 자원 공유 등의 장점이 있고 debugging이 어렵고 동기화 이슈 발생, 하나의 오류로 process 문제 발생시키는 단점이 있습니다.

결론

multi process, multi thread 방식의 큰 차이점은 multi thread의 경우 하나의 process 내부에서 데이터를 공유하며 동작할 수 있다는 이점이 있어 비용을 감소시키고 메모리 공간도 적게 사용해 효율적이다. multi process는 하나의 작업을 수행하기 위해 프로세스 간 context switching을 거치게 되는데 multi thread는 공유 자원을 가지고 있어 context switching에 들어가는 비용이 절감되는 장점도 있습니다.

위의 장점만으로 보면 multi thread의 장점만 보이지만 공유 자원을 이용하는 만큼 공유 자원에 동시 접근에 의한 오류들이 생길 수 있고 debugging 또한 까다로워 신중하게 고려해야 하는 까다로움이 있습니다.

Thread Safe & Context Switching

Thread Safe

여러 thread 가 동시 동작해도 안전하다는 의미로서 함수 A, B가 여러 thread에서 호출되도 하나의 thread에서 호출됐을 때와 같은 결과가 보장되는 것을 말합니다.

Context Switching

여러 process나 여러 thread를 돌아가면서 작업을 처리하는 과정을 context switching이라 합니다.

Semaphore & Mutex

여러 process와 thread 작업을 수행 시 자원을 공유하게 되는데 이 때 공유 자원에 접근하는 부분을 Critical Section이라 함. 공유 자원에 대한 접근 처리를 제대로 하지 않으면 많은 문제들을 야기하게 되는데 이를 위해 사용하는 대표적인 방식으로 Semephore, Mutex가 있습니다.

Semaphore

공유 자원에 여러 개의 프로세스가 접근하는 것을 막는 것을 의미하는데 이를 위해 공유 자원의 상태를 나타내는 카운터 변수를 사용합니다. 이 변수는 실제 운영체제, 커널의 값으로 저장되어 각 프로세스가 이를 확인하고 변경할 수 있게 됨. 각 프로세스가 상태값을 보고 사용중인지 사용 가능한 상태인지를 인지해 사용 가능한 때를 기다렸다가 사용하는 방식임. Mutex와는 달리 0, 1 과 같은 이진수 외에 더 큰 숫자를 가지게 할 수 있어 1개의 프로세스만이 자원을 점유하지 않고 공유 자원에 접근할 수 있는 임계치가 되어 접근할 수 있는 process의 개수를 통제할 수 있습니다.

Mutex

상호 배제를 의미하는데 critical section을 가지는 thread들의 실행 시간이 겹치지 않게 해주는 방법을 사용합니다. semaphore와는 달리 1개의 thread만 critical section에 접근할 수 있게 함. Lock, Unlock 개념을 사용하고 Binary Semaphore와 같은 개념으로 쓰임. 하나의 therad가 자원을 사용할 때 Lock을 걸어 다른 thread 접근을 통제하고 작업이 끝나 Unlock하면 다른 thread들이 기다렸다가 접근해 Lock을 하며 동작하게 됩니다.

결론

Mutex는 Binary Semaphore의 일종으로서 가장 큰 차이점은 Mutex는 오직 1개의 thread만 공유 자원에 접근할 수 있고 Semaphore는 지정된 변수 값 만큼 접근할 수 있는 차이점이 있다는 것입니다.