스택
FILO(First In Last Out)형태로 데이터를 액세스하는 데이터 구조이다. 즉, 가장 나중에 들어온 것부터 차례로 액세스하는 것이다.
Heap은 Stack과 반대로 FIFO형태로 데이터를 액세스한다.
스택은 한 곳으로만 액세스할 수 있으며, 이부분을 스택의 탑이라고 한다.
FILO의 액세스 순서 : 5 → 4 → 3 → 2 → 1
FIFO의 액세스 순서 : 1 → 2 → 3 → 4 → 5
중앙처리장치는 기억장치의 특정 영역을 스택 영역으로 지정하여 운영한다.
스택에 저장되는 데이터의 크기는 레지스터의 크기, 데이터 버스의 폭과 같다. 즉 스택은 컴퓨터의 단어(word)단위로 액세스 된다. 만일 기억장치가 바이트 단위로 구성되어 있고 레지스터의 크기가 16 비트이면, 두 개의 기억장소에 한개의 데이터가 저장된다.
또한 데이터가 스택에 추가 될수록 스택의 주소값은 점점 작아진다.
그 이유는 두가지가 있다.
(1) 스택이 항상 커널의 반대 방향으로 자라기 때문에 커널 영역에 침범하는 일이 없게된다.
(2) 힙 영역은 스택과 달리 새로운 데이터가 추가될수록 더 큰 메모리 주소를 할당 받는다. 때문에 메모리 공간을 알뜰하게 사용할 수 있게 된다.
스택 포인터
중앙처리 장치 안에는 스택에 데이터가 채워진 위치를 가리키는 레지스터인 스택 포인터(SP)를 갖고 있다. 스택포인터가 가리키는 곳까지가 데이터가 채워진 영역이고, 그 이후부터 스택 끝까지는 비어있는 영역이다.
스택에 새로운 항목이 추가되거나 스택에서 데이터가 제거되면, 스택 포인터의 값이 증가하거나 감소한다.
스택은 PUSH와 POP 두가지 동작에 의하여 액세스된다.
- PUSH : 스택에 데이터 추가
- POP : 스택에서 데이터 제거
PUSH 오퍼랜드 //오퍼랜드를 스택에 저장하라.
POP 오퍼랜드 //스택에서 제거한 데이터를 오퍼랜드에 저장해라.
※스택과 스택포인터의 작동 예시
다음 그림은 어느 한 순간 레지스터와 스택의 모습이다. 이 예는 다음과 같은 가정을 하고 있다.
- 범용 레지스터 R0와 R1의 크기는 16비트이다.
- 기억장치는 바이트 단위로 주소가 지정되며, 스택은 16비트 단위로 액세스 된다.
- 기억장치의 주소는 16비트이다. 따라서 SP의 크기도 16비트이다.
- SP의 값은 1008h이고, SP가 가리키는 장소까지 데이터가 저장되어 있다.
- 기억장치의 100ch번지부터 스택영역이고, 현재 세 개의 데이터가 스택에 저장되어 있다.
중앙처리 장치는 PUSH[오퍼랜드] 명령어를 다음과 같은 두 단계의 동작으로 실행한다.
SP ← SP - [단어의 크기] // SP를 단어 크기만큼 증가시킨다.
Mem[SP] ← 오퍼랜드 // 스택에 오퍼랜드를 저장한다.
(b) PUSH R0 실행 후
① 스택 TOP의 주소값인 스택포인터가 1008h 에서 1006h로 감소
② 기억장치 1006h번지에 R0의 값 4444h가 저장됨
중앙처리 장치는 POP[오퍼랜드] 명령어를 다음과 같은 두 단계의 동작으로 실행한다.
SP ← SP - [단어의 크기] // SP를 단어 크기만큼 증가시킨다.
Mem[SP] ← 오퍼랜드 // 스택에 오퍼랜드를 저장한다.
(c) POP R1 실행 후
① R1의 값이 4444h로 변경
② SP의 값이 1008h로 증가
* POP 이후로는 1008h (SP)위의 메모리는 사용하지 않는다. 1006h번지의 4444h값은 남아있으나, 무의미한 쓰레기값이며, 이후 다른 PUSH명령어가 실행되면 이 값은 다른 값으로 대체된다.
출처: https://hyem2.tistory.com/entry/스택포인터 [오늘도 나는:티스토리]
'CS > OS & 하드웨어' 카테고리의 다른 글
정규화 수행과정 #도부이결다조 (0) | 2024.06.20 |
---|---|
부동 소수점 오차 (개념) (0) | 2024.05.07 |
CISC / RISC 개념 및 차이 (0) | 2024.04.25 |
중앙처리장치(CPU) - 3 (CPU 명령어 사이클) (0) | 2024.04.18 |
중앙처리장치(CPU) - 2 (CPU 명령어) (0) | 2024.04.18 |