스레드는 프로세스를 구성하는 실행의 흐름 단위입니다.
하나의 프로세스는 여러개의 스레드를 가질 수 있어요. 스레드를 이용하게 되면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있습니다.
기존에는 하나의 프로세스는 한 번에 하나의 일만 처리했습니다.
하지만! 스레드가 등장하면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있어요!
스레드는 프로세스 내에서 각기 다른 스레드 ID, 레지스터 값, 스택으로 구성된다. 따라서 각기 다른 코드를 실행할 수 있어요.
스레드들은 실행에 필요한 최소한의 정보만 유지한 채 프로세스 자원을 공유하며 실행됩니다.
스레드 하나만의 코드/데이터/힙 영역이 있는 것이 아니에요!
🧐 하나의 프로세스에 여러 스레드가 있을 수 있다?
: 여러 프로세스를 동시에 실행하는 것
동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행
: 여러 스레드로 프로세스를 동시에 실행하는 것
하나의 프로세스를 여러 스레드로 실행
예를 들어 “hello, os”를 화면에 출력하는 프로그램이 있어요
이 프로그램을 세 번 fork해서 실행하는 것 / 프로그램에 스레드를 세 개 만들어서 실행하는 것
➡️ 둘 다 똑같이 화면에는 “hello, os”가 세 번 출력됩니다.
이 둘에는 큰 차이가 있어요.
💡 프로세스끼리는 기본적으로 자원을 공유하지 않아요.
스레드끼리는 같은 프로세스 내의 자원을 공유해요
프로세스를 fork 하게 되면 코드, 데이터, 힙 영역 등 모든 자원이 복제되어 메모리에 적재됩니다.
이는 같은 프로그램을 실행하기 위해 메모리에 동일한 내용이 중복해서 존재하게 되는 거에요.
이에 반해 스레드들은 실행을 위해 꼭 필요한 값들을 제외하고는 프로세스가 가지고 있는 자원을 공유한다. 스레드는 프로세스 자원을 공유하기 때문에 서로 협력과 통신에 유리합니다.
때로는 프로세스 자원을 공유하는 특성이 단점이 될 수도 있다.
멀티프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에 지장이 없다.
멀티스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.
🤩 프로세스 간 통신
프로세스끼리도 자원을 공유하고 데이터를 주고 받을 수 있다.
➡️ 프로세스 간 통신(IPC - Inter-Process Communication)