운영체제 | User Stack

성수당·2025년 9월 12일

운영체제

목록 보기
12/31
post-thumbnail

🥔 User Stack란?

User Stack(사용자 스택) 은 프로그램 실행 중 함수 호출과 지역 변수 관리에 사용되는 메모리 공간이다. 특히 프로세스의 스택 영역은 함수의 실행 흐름을 추적하고, 함수 간 데이터 전달을 위해 핵심적으로 사용된다.

운영체제와 컴파일러는 함수 호출 시 스택을 기반으로 작업을 수행하며, 사용자 스택은 이 구조의 중심이다.

🥔 스택 메모리 구조

프로세스 메모리 구조에서 스택은 일반적으로 가장 높은 주소에서 아래 방향으로 성장한다.

메모리 주소 ↓ 증가
---------------------
|   Kernel 영역     |
|-------------------| ← 커널 스택
|   사용자 힙(Heap) |
|-------------------| ← break
|   사용자 스택(Stack) ↓
|-------------------|
|     코드 영역     |
---------------------
  • 스택은 LIFO(Last In First Out) 방식으로 동작
  • 함수가 호출되면 스택 프레임(Stack Frame) 이 생성됨
  • 함수가 종료되면 해당 스택 프레임이 제거됨

🥔 스택 프레임(Stack Frame)

스택 프레임은 하나의 함수 호출에 대한 정보를 담고 있는 단위다.

📦 스택 프레임 구성

구성 요소설명
Return Address함수 종료 후 돌아갈 주소
Parameters인자로 받은 값
Local Variables함수 내 지역 변수
Saved Registers이전 함수의 레지스터 값 (예: rbp, rip)
; 예: 함수 호출 시
push   rbp             ; 이전 프레임 포인터 저장
mov    rbp, rsp        ; 현재 스택 프레임 설정
sub    rsp, N          ; 지역 변수 공간 확보

main()이 끝나기 전까지 함수 호출이 계속 쌓이며, 마지막부터 차례로 종료되며 스택에서 제거됨

🥔 스택 오버플로우(Stack Overflow)

스택 공간은 제한적이다. 너무 많은 함수 호출 또는 무한 재귀 호출로 인해 스택 공간이 초과되면 시스템은 Segmentation Fault 또는 Stack Overflow 에러를 발생시킨다.

void recur() {
    recur();  // 무한 재귀 → Stack Overflow 발생
}

🥔 User Stack vs Kernel Stack

항목User StackKernel Stack
위치사용자 공간 (유저 모드)커널 공간 (커널 모드)
용도사용자 코드 실행 중 함수 호출시스템 콜 처리, 인터럽트 처리
접근사용자 코드에서 직접 접근커널 내부에서만 접근 가능
보호다른 프로세스에서 접근 불가사용자 접근 불가

시스템 콜 진입 시, User Stack → Kernel Stack으로 전환되어 처리된다.

🥔 User Stack의 역할 요약

  • 함수 호출 시 매개변수, 리턴 주소, 지역 변수 등을 저장
  • 프로그램의 흐름 제어(제어 흐름) 를 가능하게 함
  • 스택 구조를 통해 재귀 함수 처리, 백트래킹, 함수 종료 후 복귀 등을 수행
  • 멀티스레드 환경에서는 스레드마다 독립적인 스택이 할당됨

🥔 스택 관련 시스템 호출 및 설정

  • Linux에서는 ulimit -s 명령으로 스택 크기 제한 확인 및 변경 가능
  • pthread_attr_setstacksize() 함수를 통해 스레드 생성 시 스택 크기 지정 가능

🥔 마무리

  • User Stack은 함수 호출 흐름과 변수 저장을 위한 중요한 구조다
  • 과도한 재귀나 잘못된 메모리 접근은 스택 오버플로우를 유발할 수 있다
  • 스택 구조를 잘 이해하면 함수 호출, 재귀, 메모리 오류 디버깅에 큰 도움이 된다
profile
말하는 감자🥔

0개의 댓글