User Stack(사용자 스택) 은 프로그램 실행 중 함수 호출과 지역 변수 관리에 사용되는 메모리 공간이다. 특히 프로세스의 스택 영역은 함수의 실행 흐름을 추적하고, 함수 간 데이터 전달을 위해 핵심적으로 사용된다.
운영체제와 컴파일러는 함수 호출 시 스택을 기반으로 작업을 수행하며, 사용자 스택은 이 구조의 중심이다.
프로세스 메모리 구조에서 스택은 일반적으로 가장 높은 주소에서 아래 방향으로 성장한다.
메모리 주소 ↓ 증가
---------------------
| Kernel 영역 |
|-------------------| ← 커널 스택
| 사용자 힙(Heap) |
|-------------------| ← break
| 사용자 스택(Stack) ↓
|-------------------|
| 코드 영역 |
---------------------
스택 프레임은 하나의 함수 호출에 대한 정보를 담고 있는 단위다.
| 구성 요소 | 설명 |
|---|---|
| Return Address | 함수 종료 후 돌아갈 주소 |
| Parameters | 인자로 받은 값 |
| Local Variables | 함수 내 지역 변수 |
| Saved Registers | 이전 함수의 레지스터 값 (예: rbp, rip) |
; 예: 함수 호출 시
push rbp ; 이전 프레임 포인터 저장
mov rbp, rsp ; 현재 스택 프레임 설정
sub rsp, N ; 지역 변수 공간 확보
main()이 끝나기 전까지 함수 호출이 계속 쌓이며, 마지막부터 차례로 종료되며 스택에서 제거됨
스택 공간은 제한적이다. 너무 많은 함수 호출 또는 무한 재귀 호출로 인해 스택 공간이 초과되면 시스템은 Segmentation Fault 또는 Stack Overflow 에러를 발생시킨다.
void recur() {
recur(); // 무한 재귀 → Stack Overflow 발생
}
| 항목 | User Stack | Kernel Stack |
|---|---|---|
| 위치 | 사용자 공간 (유저 모드) | 커널 공간 (커널 모드) |
| 용도 | 사용자 코드 실행 중 함수 호출 | 시스템 콜 처리, 인터럽트 처리 |
| 접근 | 사용자 코드에서 직접 접근 | 커널 내부에서만 접근 가능 |
| 보호 | 다른 프로세스에서 접근 불가 | 사용자 접근 불가 |
시스템 콜 진입 시, User Stack → Kernel Stack으로 전환되어 처리된다.
ulimit -s 명령으로 스택 크기 제한 확인 및 변경 가능pthread_attr_setstacksize() 함수를 통해 스레드 생성 시 스택 크기 지정 가능