티스토리 뷰
스택(stack)이란?
- 후입선출(LIFO, Last-In-First-Out)의 원리를 따르는 자료구조로 데이터의 삽입과 삭제가 한쪽 끝에서만 일어나는 형태를 말합니다. Push를 통해 데이터를 삽입하고 Pop을 통해 데이터를 삭제합니다.
메모리에서 스택이란?
-컴퓨터 메모리의 일부 영역으로, 함수 호출과 관련된 데이터를 저장하는데 사용됨, 함수 생성을하면 PUSH로 함수내부 지역변수들을 넣고, 함수해제시 POP으로 제거함.
메모리 스택 특징
- 함수 생성되면 함수 내부의 데이터크기를 계산해 먼저 스택에 사이즈 할당함.
- 지역변수,매개변수들을 차례대로 하나씩 할당함. (매개변수->지역변수->return pc값 순서)
- 각 변수들의 사이즈는 독립적임 (사이에 들어가는것 불가능)
- 함수 생성시 마지막에 돌아가야할 주소를 삽입함
- %rbp는 해당 함수 시작점, %rsp는 해당 함수 끝점 (둘의 차를 이용해 스택크기 계산가능)
- base of stack은 스택의 시작점이며 메모리상 스택에서 가장위에 있음
- top of stack 은 스택의 끝점이며, 메모리상 스택에서 가장아래에 있음
- 스택은 아래로 늘어나며 진행됨.
한 함수에서 스택변화
struct{ int a=100; int b=20;} st;
int x=10;
double y=5.0;
위의 코드처럼 변수가 있다고할때 stack에 저장되는 방식은 다음과같습니다
.base가 가장 처음이고 top이 가장최근에 넣은 값이며, base에서 부터 차례대로 st구조체,int x, double y값이 들어가 있는걸 볼 수 있습니다. 여기서 한칸은 4byte이며, 중요한것은 x 저장할때 보면 8byte단위로 계산하기에 padding을 넣어서 잘못 계산하지 않기 위해 한다는 것입니다.
여기서 구조체 st를 보면 20이 가장위에 있습니다. 이는 STACK이 선입선출의 특징을 가지고 있어 메모리상 아래에 있는게 먼저나가므로 20이 위에 있습니다.
이는 함수가 시작하기 전에 먼저 공간을 할당하고, 이 공간들은 함수가 끝날 때까지 유효합니다.
여러 함수에서 스택 변화
int main() {
void test1() {
void test2() {
void test3() {
}
}
}
return 0;
}
위의 코드처럼 함수가 여러개가 있을때 stack에 저장되는 방식은 다음과같습니다. 한 함수가 다른함수를 내부에서 호출하면 그 내부에서 섞이는게아니라 그 다음공간에 차례대로 할당을 하게 됩니다. 이때 %rbp는 해당함수의 시작점이고, %rsp는 해당함수의 끝점입니다. 이제 각함수가 끝나면 스택 가장 아래서부터 차례대로 해제가 됩니다.
매개변수가 있을때 스택변화
void test1() {
int a = 10;
test2(a);
}
void test2(int a) {
int k=2;
a = a+k;
}
위의 코드를 실행했을때 변화는 다음과 같습니다. 먼저 test1함수를 실행하기전에 그 전함수에서 돌아갈 pc값을 스택에 넣습니다.
그다음에 test1을 실행하게 되는데 a변수의 값과, test2에서 a라는 매개변수의 값을 스택에 먼저 넣습니다. 그다음 test2함수를 실행하기전에 test1의 돌아올 pc값을 스택에 넣고 실행합니다.
여기서 중요한 것은 매개변수가 test2에서 만들어지는게아닌 test1에서 미리 만들어두고 실행된다는 점입니다.
'OS' 카테고리의 다른 글
동시성(Concurrency) (0) | 2023.05.29 |
---|---|
Shell(쉘) (0) | 2023.05.28 |
Address Translation 변환 과정 (VA -> PA) (0) | 2023.05.15 |
Copy-on-Write (mmap) (0) | 2023.05.08 |
가상 메모리(Virtual Memory) (0) | 2023.05.05 |
- Total
- Today
- Yesterday
- DB
- 배포
- 데이터
- 서버
- 스프링
- IP주소
- 소프트웨어공학
- 컴퓨터구조
- 보안
- 메세지큐
- 인공지능
- JPA
- 자바
- 자동화
- sql
- 데이터베이스
- 깃허브
- 클라우드
- 포트포워딩
- 프로토콜
- 웹소켓
- 깃
- 문법
- nat
- 도커
- 파인튜닝
- 네트워크
- 쿼리
- 테이블
- 컨테이너
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |