멀티 프로세스와 멀티 스레드
우리는 컴퓨터를 할 때 일에 집중할 때를 제외하고는 병렬 처리를 습관처럼 하고 있다. 정말 간단한 예로 브라우저에 여러 개의 tab을 켜두는 것 조차도 병렬 처리이다. 그렇다면 동시에 이렇게 실행하는 방법은 어떻게 진행되는 것일까? 여러 프로세스를 동시에 실행하는 것. 멀티 프로세스다.
프로세스는 기본적으로 자원을 공유하지 않고, 독립적으로 실행한다. 같은 작업을 하더라도 PID값이 다르고, 프로세스 별로 파일과 입출력 장치등의 자원이 독립적으로 할당되어 다른 프로세스에 영향을 미치지 않는다.
멀티 프로세스는 여러가지 프로세스를 동시에 수행하는 것이다. 그런데 한 프로세스안에는 여러 코드가 존재하는데, 이 여러 코드들을 동시에 실행할 수 있는 방법이 바로 멀티 스레드다. 여러개의 스레드를 활용해서 한 프로세스 내 코드를 병렬 적으로 수행한다. 하나의 스레드는 스레드 ID와 프로그램 카운터, 레지스터 값, 스택 등으로 구성된다. 즉 스레드 마다 다음에 실행할 주소를 가질 수 있고, 연산 과정의 임시 저장 값을 가질 수 있어서 각각을 실행하고 임시 저장하는, 병렬 처리가 가능하다.
멀티 프로세스와 멀티 스레드의 가장 큰 차이는, 자원의 공유 여부이다. 서로 다른 프로세스들은 기본적으로 자원을 공유하지 않기 때문에, 독립적으로 실행되는 반면, 같은 프로세스를 실행하는 여러 스레드들은 프로세스의 자원을 공유하기 때문이다.
스레드들은 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스의 자원을 공유하기 때문에 쉽게 협력 및 통신할 수 있다. 다만, 멀티 프로세스 환경에서는 한 프로세스에 문제가 생겨도 다른 프로세스에 지장이 없지만, 멀티 스레드 환경에서는 한 스레드에 지장이 생기면 연쇄적으로 전체의 문제가 될 수 있다.
멀티 프로세스 및 멀티 스레드는 많은 프로그램 언어에서 사용을 하고 있다. 필자인 나를 기준하면 python
에서도 많이 사용하고, 이를 활용하는 것이 python
다운 코드라고 많이 들 말한다. 아래의 코드 예제를 확인해보자.
import treading
import os
def foo():
pid = os.getpid()
tid = threading.get_native_id()
print(f"foo: PID={pid}, Thread ID={tid}")
def bar():
pid = os.getpid()
tid = threading.get_native_id()
print(f"bar: PID={pid}, Thread ID={tid}")
def baz():
pid = os.getpid()
tid = threading.get_native_id()
print(f"baz: PID={pid}, Thread ID={tid}")
if __name__ == "__main__":
thread1 = threading.Thread(target=foo)
thread2 = threading.Thread(target=bar)
thread3 = threading.Thread(target=baz)
thread1.start()
thread2.start()
thread3.start()
위의 소스 코드를 통해 결과를 보면, 3개의 스레드가 실행하는 각기 다른 함수를 통해 출력되는 PID 값은 동일할 것이다. 하지만 스레드 ID는 다르다. 한 프로세스를 여러 스레드로 나누어 동시 작업을 하면 여러 작업을 동시에 수행할 수 있는 소스 코드를 작성할 수 있다.
thread.join()
이라는 method가 있다. 이는 스레드가 종료될 때 까지 실행되지 않고 대기 하도록 한다. 예를 들어 main 스레드가 a 스레드를 생성할 때, join
을 호출했다면, main 스레드는 생성한 a 스레드가 종료될 때 까지 대기해야 한다.
스레드 안전
스레드 안전이란, 멀티스레드 환경에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태를 의미한다. 레이스 컨디션이 발생했다면 이는 스레드가 안전하지 않는 다는 상황이다. 반대로 스레드가 안전하다면 여러 스레드에 의에 호출되어도 레이스 컨디션이 발생하지 않는 다는 것을 의미한다.
참고자료
※ 이 글은 『이것이 컴퓨터 과학이다』 책을 기반으로, 다양한 자료를 참고해 작성했습니다.