본문 바로가기

CS 모음

[CS모음]CPU의 구조와 동작 방식, 메모리(Heap, Stack)구조

안녕하세요 인포돈 입니다.


CPU의 구조와 동작 과정

CPU의 구조와 어떻게 동작하는지에 대해서 이해해본다.

 

CPU의 구조에는 크게 제어 장치(Control Unit) // 산술 논리 장치(ALU) // 레지스터(Register)

3가지로 구성되어 있다. 각각의 담당하는 역할을 아래와 같다.

 

제어 장치(Control Unit) : 제어

산술 논리 장치(ALU) : 계산

레지스터(Register) : 저장

 

그렇다면 이렇게 3가지의 구성품들이 도대체 어떻게 동작하여 컴퓨터를 동작하게 하는지 알아야 한다. 이때 우리는 좀 더 자세히 레지스터를 나누어 보아 생각해 보아야 한다.

 

CPU에 존재하는 레지스터 종류

  1. 프로그램 카운터 (PC) : 다음에 실행할 소스 코드 라인 주소 정보 저장
  2. 명령어 레지스터 : 현재 실행 중인 명령어 저장
  3. 메모리 주소 레지스터 : 현재 실행할 소스 코드 라인 주소 정보 저장
  4. 메모리 데이터 레지스터 : 메모리 주소 레지스터에 저장되어 있는 주소 정보에 저장되어 있는 데이터를 저장
  5. 어큐뮬레이터 : 계산 결과

그러면 이제 본격적으로 CPU가 어떻게 동작하는지 이해해 보자. 하나의 예시로 아래의 그림을 참고해 보자 아래의 그림의 흐름도를 이해해보면 CPU가 어떻게 동작하는지 쉽게 알 수 있다. 

  1. 주소(100)를 프로그램 카운터에 저장한다. (첫 코드 실행을 100이라고 가정)
  2. 저장된 주소(100)를 메모리 주소 레지스터에 저장한다.
  3. 메모리 주소 레지스터에 저장되어 있는 주소(100)를 기반으로 해당 주소(100)에 저장되어 있는 데이터(LOAD 10)를 메모리 데이터 레지스터에 저장한다.
  4. 메모리 데이터 레지스터에 있는 데이터(LOAD 10)를 명령어 레지스터에 저장한다.
  5. 다음에 실행할 주소(101)를 프로그램 카운터에 저장한다.
  6. 명령어 레지스터에 있는 데이터(LOAD 10)를 제어 장치를 통해 해석한다.
  7. 해석 결과 주소 10에 있는 데이터를 LOAD 하라는 해석을 했다. (제어 장치에서)
  8. 해석 결과에 따라 메모리 주소 레지스터에 주소(10)를 저장한다.
  9. 해석 결과에 따라 주소(10)에 자정 되어 있는 데이터(3)를 메모리 데이터 레지스터에 저장한다.
  10. 해석 결과에 따라 데이터(3)를 어큐뮬레이터에 저장한다.

이것으로 처음 코드 실행된 주소 100번째를 CPU에 흐름도에 따라 해석해 보았습니다. 이제는 5)에서 설명했듯이 PC에 다음 명령어를 실행할 주소를 저장해 주었습니다. 다시 한번 실행해 보겠습니다.


  1. 앞선 2) ~ 6)를 다시 한번 실행한다. (이때 저장되는 데이터는 ADD 11 // 다음 실행할 주소는 102를 저장한다.)
  2. 해석 결과 주소 11에 있는 값을 ADD 하라는 해석을 했다. (제어 장치에서)(이때 ADD 더하기 위해서 앞선 값을 이용한다.)
  3. 어큐뮬레이터에 저장되어 있는 데이터(3)를 ALU에 옮겨 놓는다.
  4. 앞선 8) ~ 10)를 다시 한번 실행한다. (이때 주소는 11 // 가져오는 데이터는 4이다.)
  5. 이제 어큐뮬레이터에 저장된 값을 ALU에 이미 들어있는 데이터(3)와 ADD를 해준 후 결과 데이터(7)를 어큐뮬레이터에 저장한다.

천천히 흐름도를 따라왔다면, 마지막 STORE 12는 혼자서 스스로 해볼 수 있을 것이다.

 

*** 추가 설명**

  • JAVA로 생각해보자, 자바의 경우 LOAD 10이라는 명령어는 존재하지 않는다. 그렇다면 저 LOAD10은 무엇일까?

 기계어 ——→ 자연어를 생각하면 된다. 우리가 쉽게 작성할 수 있는 자연어에 가까운 고급 언어들을 좀 더 기계어에 가깝게 바꿔준 언어(컴파일러 후 메모리에 저장된 데이터(?))라고 생각하면 될 것 같다. (사실 CPU 자체에서는 LOAD 10이라는 것보다는 ‘010100001010101’ 요런 식으로 되어있을 것이다.) ⇒ 우리가 이해하기 쉽도록 변경

  • 사실 흐름도를 이해해보면, 제어 장치가 어떻게 명령어를 해석하지? // 어떻게 산순 논리 장치에 값이 넣어지고 ADD와 같은 계산이 되는 거지?라는 본질적인 궁금증이 날 수도 있지만, 현재 우리는 전체적인 컴퓨터 동작 과정을 이해하고 백엔드 스쿨을 학습하는 입장에서 너무 깊숙한 공부는 해가 된다고 생각한다!!! 우선 전체적인 숲을 이해하고 훗날 자세히 다루어야 할 때가 오면 학습하면 그만이다! (끝도 없이 파고든다면,,, 결국 반도체, 전기공학과 같은 학습을 해야 할 거 같다… )

메모리 구조 (Heap, Stack)

정말 유명한 메모리 구조 Heap과 Stack이다. 이러한 메모리 구조를 이해하는 것은, 사실 초보자에게는 의미가 없는 일이라고 생각한다. 초보의 경우 구현이 우선시되기 때문이다. 이러한 개념은 메모리의 효율을 높이기 위해 사용한다.

stack : 지역 변수 (매개 인자도 포함)

heap : 참조형 데이터( ex) 객체 )

data : 전역 변수

text(code) : 나머지 ( ex) 함수, 제어문, 상수)

 

 지금 단계에서는 어떠한 변수가 어디에 저장되는지 이해하는 정도로 그쳐 본다.

public class Main {
    static int a;/*data*/
    public static void main(String[] args) {
	        int b; //stack
					Car f = new Car();/*heap*/
    }
    public int sum(int c/*stack*/, int d/*stack*/){
        return 0;
    }
}
class Car{
	int e;/*stack*/
}

주석에 쓰여있는 데로 메모리 할당 위치에 저장이 된다.