프로세스와 스레드의 이해
스레드는 프로세스를 구성하는 실행의 흐름 단위로, 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
핵심 내용 요약
- 프로세스와 스레드: 스레드는 프로세스를 구성하는 실행의 흐름 단위로, 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
- 멀티프로세스와 멀티스레드: 여러 프로세스를 동시에 실행하는 것을 멀티프로세스,
여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 합니다. - 자원 공유: 스레드는 프로세스 내에서 자원을 공유하지만, 프로세스끼리는 기본적으로 자원을 공유하지 않습니다.
- 운영체제 차이: 리눅스와 같은 운영체제는 프로세스와 스레드를 명확히 구분하지 않고, 둘을 태스크(task)로 통일하여 사용합니다.
스레드란 무엇인가?
스레드(thread)는 실행의 단위입니다.
스레드는 프로세스를 구성하는 실행의 흐름 단위로, 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있습니다.
프로세스와 스레드의 차이
전통적으로 하나의 프로세스는 한 번에 하나의 일만을 처리했습니다.
그러나 스레드 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었습니다.
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성됩니다.
스레드는 프로세스의 자원을 공유합니다.
프로세스 내의 모든 스레드는 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유합니다.
멀티프로세스와 멀티스레드
멀티프로세스(multiprocess)는 여러 프로세스를 동시에 실행하는 것을 의미하며,
멀티스레드(multithread)는 여러 스레드로 프로세스를 동시에 실행하는 것을 의미합니다.
예를 들어, “hello, os”를 출력하는 프로그램을 세 번 fork하여 실행하면 화면에 “hello, os”가 세 번 출력됩니다.
같은 프로그램 내에 “hello, os”를 출력하는 스레드를 세 개 만들어 실행해도 동일한 결과가 나옵니다.
그러나 프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유한다는 점에서 차이가 있습니다.
자원 공유의 차이
프로세스를 fork하여 실행하면 모든 자원이 복제되어 메모리에 적재됩니다.
반면, 스레드는 프로세스의 자원을 공유하기 때문에 메모리를 더 효율적으로 사용할 수 있습니다.
또한, 스레드는 프로세스 자원을 공유하기 때문에 협력과 통신에 유리합니다.
스레드와 프로세스의 통신
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 프로세스 간 통신(IPC; Inter-Process Communication)을 통해 데이터를 주고받을 수 있습니다.
예를 들어, 프로세스 A가 파일에 데이터를 쓰고 프로세스 B가 파일을 읽는 경우, 두 프로세스는 파일을 통한 통신을 하게 됩니다.
공유 메모리, 소켓, 파이프 등을 통해서도 프로세스 간 통신이 가능합니다.
리눅스에서의 스레드와 프로세스
리눅스는 프로세스와 스레드를 명확히 구분하지 않고, 둘을 태스크(task)로 통일하여 사용합니다.
리눅스 창시자인 리누스 토르발스(Linus Torvalds)는 “스레드와 프로세스는 그저 실행의 문맥(context of execution)”이라고 설명합니다.
확인 문제
- 스레드와 관련한 설명으로 옳지 않은 것을 고르세요.
- 스레드는 프로세스 내의 실행의 흐름 단위입니다.
- 프로세스 내의 스레드들은 각기 다른 코드/데이터/힙 영역을 가지고 있습니다.
- 프로세스 내의 스레드들은 각기 다른 프로그램 카운터 값을 가지고 있습니다.
- 프로세스 내의 스레드들은 각기 다른 스택을 가지고 있습니다.
- 멀티프로세스와 멀티스레드의 차이를 설명하는 내용입니다. 아래 글에서 제시된 단어 중 옳은 것을 고르세요.
- 프로세스끼리는 기본적으로 자원을 (공유하지 않지만, 공유하지만),
프로세스 내의 스레드끼리는 같은 프로세스 내의 자원을 (공유하지 않습니다, 공유합니다).
- 프로세스끼리는 기본적으로 자원을 (공유하지 않지만, 공유하지만),