Computer Science/자료구조

컴퓨터 내부가 어떻게 돌아가는가

mitdog 2024. 7. 4. 12:23

우리는 코드를 치고 실행하며, 그 실행 결과를 본다.
그 코드에는 변수, 포인터, 연산 등 다양한 것들이 있다.
그렇다면 도대체 '실행하면'이라는 과정에서는 무엇이 일어나고 어떻게 동작하는가?
그것에 대한 답이 되겠다. (러프하게)

CPU, BUS, Memory, Variable and Pointer

참고 CPU: https://namu.wiki/w/%EB%AA%A8%EC%8A%A4%20%ED%85%8C%ED%81%AC%EB%86%80%EB%A1%9C%EC%A7%80%206502?rev=70

기본적으로 컴퓨터는 '계산해서 적는다.'
가장 간단하게 말하자면 저게 전부이다.
좀더 디테일하게 적어보자면
'메모리로부터 꺼내서 (BUS를 통해 전달하고) CPU에서 계산하고 메모리에 적는다.'이다.
우리는 전자회로를 만들진 못하더라도, 그러한 흐름을 읽을 수는 있어야 한다.
흐름을 읽으려면 다음과 같은 '약속'들을 알아야 한다.

bit, byte 그리고 컴퓨터

컴퓨터(메모리)는 기본적으로 byte 단위로 구성하고, 돌아간다.
1 bit = 0(또는 1)($2^1$)
1 byte = 8 bit = 0000 0000($2^8$) (0~255 10진수 값 표현 가능)
1 KB = 1,024 byte($2^{10}$ byte)
1 MB = 1,024 KB($2^{10}$ KB=$2^{20}$ byte)
1 GB = 1,024 MB($2^{10}$ MB=$2^{20}$ KB=$2^{30}$ byte)

형식(Data Type)=자료형
  • int, double, float와 같은 지정자.
  • 컴퓨터에게 알려주는 것이다. "이 값은 몇 byte짜리이다. 그러니까 ~형식이다."
  • 즉, 해석 방식과 크기를 알려주는 역할이다.
자료형 바이트
int 4
float 4
double 8
char 1
변수(Variable)
  • 이름, 형식(Data Type), 값으로 구성
  • 고유한 주소를 갖는다.
주소(Address)
  • 메모리 공간의 주소(메모리=아파트 -> 메모리 공간=집 -> 메모리 주소=호수(ex. 203호))
  • 자료형에 따라서 집이 몇호수 짜리인지 정해진다. (4 byte = 4호짜리(301, 302, 303, 304))
IP(Instructuon Pointer)

명령어 카운터라고도 불리며 명령어들이 저장된, 무엇을 해야하는지 저장되어있는 곳이다.

Example 1) 컴퓨터 내부 흐름 예
int main() {
    int a=0, b=5, c=5;
    a = b + c
    return 0;
}


(중간에 화살표에 뭐 없는 건, data와 control 화살표 합쳐서 의미하는 것이다)

포인터가 왜 필요할까?(Why do we need pointer?)

: 우리는 모든 변수를 미리 알 수 없기 때문에, 할당을 사용한다. 할당을 하는데 이름을 다 붙여줄 수 없으니, 주소로 지목한다. 그럼 주소를 저장하는 변수가 필요한데, 그게 바로 포인터다.

  • 포인터에 자료형을 지정하는 이유는?
    그 포인터에 int가 담기는지, double이 담기는지 알 수 없으니 형식을 지정해서 알려주기 위함.
    그래서 그것만 담아야 한다.
  • 포인터에서 별표랑, 엠퍼센드(&)가 뭘 의미하지?
    별표(*)의 의미: (변수의) 주소 꺼내서 그 주소로 간다. (가면 그 주소에 있는 값을 주겠죠?)
    앰퍼센드(&)의 의미: (변수의) 주소를 준다.

다음과 같은 코드를 예시로 포인터와 그 흐름에 대해 설명하겠다.

int a, *p, *q, *r, **pp;
a = 3;
p = &a;
cout << *p << endl;
r = p + q; r = p - q; // 첫 번째 거는 오류
pp = &p;
cout << **pp << endl;

a는 300(정확이는 int이니 4칸으로 301, 302, 303)이라는 주소와 그 공간에 3이라는 값을 가진다.
p = &a를 하면 a의 주소를 p에 준다는 의미. (*p = 3이 되겠죠?)
r = p + q는 주소에 주소+주소라서 오류이다. (단 r = p + 3 이런 것은 된다. p 시작 주소에서 3 더 간다는)
r = p - q는 오류 안난다. (int 개수로 대응한다)
pp = &p를 하면 pp에 p주소를 준다는 의미임은 자명하다.
**pp를 살펴보면,
*pp -> p가 가리키는 주소값(a의 주소)
**pp -> (p가 가리키는 주소값)의 값 = a의 값 = 3