프로세스는 실행 중인 프로그램이자 자원 할당의 단위이고, 스레드는 프로세스 안에서 실행되는 흐름의 단위입니다.
프로세스는 독립된 가상 주소 공간을 가지며, 같은 프로세스의 스레드는 코드·데이터·힙과 열린 파일 같은 자원을 공유합니다. 반면 각 스레드는 자신의 스택과 레지스터 상태, 프로그램 카운터를 가집니다.
따라서 프로세스 간 데이터 교환에는 IPC가 필요하고, 스레드 간에는 공유 메모리로 소통할 수 있습니다. 이 공유 구조 덕분에 스레드 간 통신은 간편하지만, 같은 데이터를 수정할 때는 동기화가 필요합니다.
스레드마다 스택과 프로그램 카운터가 필요한 이유는 무엇인가요?
각 스레드는 서로 다른 함수를 실행하거나 다른 위치에서 멈출 수 있기 때문입니다. 함수 호출 정보와 지역 변수를 담는 스택, 다음 실행 위치를 나타내는 프로그램 카운터를 각각 관리해야 합니다.
같은 프로세스의 다른 스레드가 내 스택에 접근할 수 있나요?
주소를 전달받으면 접근할 수 있습니다. 스레드별 스택은 개별 실행을 위해 나뉘지만 같은 가상 주소 공간에 있으므로, 프로세스처럼 메모리 보호 경계로 격리된 것은 아닙니다.
프로세스끼리는 메모리를 전혀 공유할 수 없나요?
공유 메모리 같은 IPC를 사용하면 같은 물리 메모리를 각자의 주소 공간에 매핑할 수 있습니다. 다만 공유 데이터에 동시에 접근할 때는 프로세스 사이에도 동기화가 필요합니다.
프로세스는 스택을 가지고 있지 않은 걸까요?
가지고 있습니다. 프로세스의 가상 주소 공간 안에 스택 영역이 있으며, 단일 스레드 프로세스라면 실행 스레드의 스택 하나가 대표적으로 보입니다. 멀티스레드 프로세스에서는 각 스레드가 자신의 사용자 스택과 실행 문맥을 가지므로, 메모리 구조에서 말하는 프로세스의 스택은 실제로는 프로세스에 속한 스레드들의 스택 영역입니다.
프로세스 간 데이터 교환은 어떻게 하나요?
파이프·메시지 큐·소켓처럼 커널을 통해 데이터를 전달하거나, 공유 메모리를 각 프로세스의 주소 공간에 매핑하는 IPC를 사용합니다. 전달 방식은 격리가 명확하지만 복사·직렬화 비용이 들 수 있고, 공유 메모리는 대용량 교환에 유리하지만 Race Condition을 막기 위한 별도 동기화가 필요합니다.