※스택이란?
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명령어가 실행되면 이 값은 다른 값으로 대체된다.
[출처] 생능출판사 한눈에 보이는 컴퓨터 구조 - 전중남
'컴퓨터 공부 > 컴퓨터구조' 카테고리의 다른 글
인터넷 접속 과정과 nat (0) | 2016.08.11 |
---|---|
인터럽트 (0) | 2016.02.03 |