프로세스와 스레드의 구조를 정리해보면, 멀티 스레드는 하나의 프로세스 안에서 여러 실행 흐름이 동시에 존재하는 방식이었습니다.
이때 운영체제는 CPU 시간을 여러 스레드에 번갈아 할당하면서 실행을 이어가고, 그 과정에서 컨텍스트 스위칭이 발생한다고 했습니다.
Q. 같은 프로세스 안에서 메모리를 공유하는데, 스택은 스레드마다 독립적으로 할당하는 이유
이번 포스트에서는 이 질문을 중심으로 정리해보겠습니다.
1. 스택은 실행 흐름의 상태를 담는 공간
스택에는 주로 다음 정보가 들어갑니다.
- 함수 호출 순서(콜 스택)
- 리턴 주소(어디로 돌아갈지)
- 매개변수
- 지역 변수
- 임시 계산 값
스택은 단순한 메모리 공간이 아니라 지금 이 스레드가 어디까지 실행했는지를 저장하는 실행 기록입니다.
2. 스레드마다 실행 흐름이 다르다
멀티 스레드 환경에서는 스레드마다 실행 흐름이 서로 다릅니다.
예를 들어 같은 프로세스 안에서도,
- 스레드 A는 main → foo → bar를 실행 중일 수 있고
- 스레드 B는 main → baz를 실행 중일 수 있습니다.
만약 스택을 공유한다면
- A가 쌓아둔 호출 프레임 위에 B가 호출 프레임을 덮어써버리는 일이 발생하게 됩니다.
그 순간부터 함수 리턴이 불가능해지고, 프로그램은 정상 동작할 수 없습니다.
따라서 스레드가 독립된 실행 흐름이라면, 그 실행 흐름을 담는 스택도 반드시 독립이어야 합니다.
3. 컨텍스트 스위칭이 가능하려면 스택이 분리되어야 한다
컨텍스트 스위칭을 할 때 운영체제는 다음을 저장/복원한다고 했습니다.
- 레지스터
- 프로그램 카운터(PC)
- 스택 포인터(SP)
여기서 핵심은 스택 포인터(SP)입니다.
스레드 A가 멈출 때 A의 SP를 저장해두고
스레드 B를 실행할 때 B의 SP를 복원해야
B는 자기 함수 실행 지점으로 정확히 복귀해서 이어서 실행할 수 있습니다.
하지만 스택이 공유된다면,
- 어느 스레드의 SP가 맞는지 지금 쌓여 있는 프레임이 누구 것인지 자체가 성립하지 않습니다.
즉, 컨텍스트 스위칭은 실행 상태를 저장했다가 다시 복원하는 것인데 그 실행 상태의 핵심이 스택 기반 호출 프레임이기 때문에
스택은 스레드마다 분리되어 있어야 합니다.
결론
정리해보면,
- 스레드는 독립적인 실행 흐름
- 스택은 그 실행 흐름의 상태(호출/리턴/지역변수)를 담는다
- 스택을 공유하면 실행 상태가 섞여서 정상 동작이 불가능
스택은 스레드의 실행 상태를 저장하는 공간이기 때문에, 스레드마다 독립적으로 할당되어야 합니다.
'운영체제' 카테고리의 다른 글
| [운영체제] 복습 (2) | 2026.02.16 |
|---|---|
| [운영체제] 프로세스와 스레드 (0) | 2026.02.06 |