※스택이란?


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

+ Recent posts