# 주의사향
* 자료구조 포스팅은 학교 강의를 토대로 정리해 놓은 글입니다.
(추후 공부하면서 내용이 수정될 수 있음)
* 자료구조의 코드는 C++를 바탕으로 쓰이며 C++의 아주 기본적인 것을 알고 있다는 전제하고 진행됩니다.(그렇다고 복잡한 문법이 쓰이지 않습니다. (약간의 시간 투자만 하면 이해가능할수 있음)
코드 자체는 돌아가는 것에 중점에 두는 것이 아닌 전반적인 흐름을 나타내므로 코드를 그대로 쓴다고 해서 실행이 되지않을 수 있습니다.
본격적으로 자료구조를 배우기 전에 먼저 컴퓨터의 구조와 컴퓨터가 어떠한 방법으로 실행되는지 알아보자!
우리가 흔히 컴퓨터 관련해서 메모리 용량이 몇 기가니 몇 메가니 이런 말들을 자주 한다. 그런데 과연 이 메모리가 정확히 무엇인가? 메모리 안에 무엇이 들어 있는가? 를 생각해본 적은 많이 없다.
그럼 메모리는 무엇이고, 메모리 안에는 무엇이 있을까? 메모리 안에는 무수한 바이트, 비트들이 있다.
* 비트(Bits) : 0과 1을 표시할수 있는 어떤 전자회로적인 도구
* 바이트(Bytes) : 8개의 비트
그래서 메모리는 어떤 방식으로 저장하고 동작하는 것인가?
프로그래밍을 할때 컴퓨터가 어떤 방식으로 작동하는지 설명하기 위해서 다음과 같이 간단하게 컴퓨터의 구조를 나타냈다.
밑에와 같이 간단한 코드를 컴퓨터에서 실행한다고 생각해보자. (간단한 C 코드이다.)
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
int main()
{
int a,b,c;
c= a+b;
return 0;
}
|
5번째 줄 코드가 실행되면 a, b, c는 메모리의 어딘가에 저장이 될 것이다. 다음 그림과 같이 말이다.
그런데 컴퓨터는 a,b,c 의 변수를 저장하는 메모리의 바이트들을 구분할 필요가 있다.
그럼 어떻게 바이트의 위치를 구별할까?
간단하다. 단순히 번호를 붙여서 구별한다.(0번 부터)
ex) 4GB Memory : 0번부터 4 Giga - 1번까지 (4 Giga : 4 x 2^30, 대략 40억 정도)
예를 들어 4바이트 a는 300,301,302,303 번지로 4개의 번호를 사용하고,
b와 c도 다른 연속된 4개의 숫자의 번호의 번지를 가지게 된다.
그다음으로 c = a+b 가 실행이 될 것이다. 메모리에 저장된 a와 b를 꺼내 CPU로 복사되어 가서 ALU란 곳에서 더해서 c로 넘어간다.
그런데 이 과정에서 두 가지 큰 질문이 생긴다.
1. 하드웨어에서 어떤 일이 생기는가?
2. CPU가 1을 하기 위해 적절한 순서로 어떤 일을 어떻게 알고 있는가?
그림과 같이 CPU와 Memory는 여러 개의 BUS (전선)라는 것에 연결되어 있다.
둘 사이를 연결하는 역할을 한다. 전압을 통해서 서로 주고받을 수 있다.
먼저 a에서 값을 읽어 와야 한다. address 버스에 300이라는 숫자를 CPU가 올린다.
그래서 메모리에서 기억을 하게 된다. 메모리는 300번지에 무슨 일이 일어날 것인지 알게 된다.
그리고 컨트롤 버스에 어떤 전압이 발생한다. CPU가 4바이트를 읽어라 라는 신호를 전압으로 띄운다.
메모리가 그걸 전달 받고 값을 읽게들이게 된다.
그 다음 메모리에서 값을 읽어서 data 버스에서 읽을 값을 CPU에 쪽으로 전압을 걸어 전달한다.
그것을 레지스터(임시 메모리)에 적재하게 된다.
이와 같이 b도 같은 과정으로 읽히게 되고 data 버스를 통해 CPU에 전달하게 된다.
그리고 나서 레지스터에서 두 개의 내용을 CPU에서 더하게 되는데 ,
두개의 내용이 ALU에 전달되고
ALU 출력 쪽에 두 개를 더한 값에 대한 전압이 발생해서 다시 다른 레지스터에 저장한다.
자 이제 c에 더한 값을 적어줘야 한다.
c의 주소가 뜨고 그곳에 값을 적고 싶다는 신호를 컨트롤 버스에 전달해서 c의 값이 정해진다.
CPU는 이러한 순서대로 일해야 하는지 어떻게 알까?
사실, 할 일과 그 순서도 메모리에 적혀있다.
실제 컴파일을 하면 아래와 비슷한 형식의 명령이 생겨난다.
LOAD 300 , X
LOAD 600, Y
ADD X, Y, Z
STORE 900, Z
** X, Y, Z는 레지스터 이름
** 300 600 900 이 a, b, c의 이름 역할을 하게 된다.
실제 기계(가상)는 이러한 프로그램 과정을 다음과 비슷하게 표현되어 있을 것이다.
285(LOAD라는 작업), 300, 1(X), 285, 600, 2(Y), 782, 1(X), 2(Y), 3(Z)
286(Store) 900, 3
그림으로 나타내면 다음과 같다.
그렇다면 저 숫자들의 나열이 메모리에 있다면, 저기의 주소를 CPU는 어떻게 알 수 있을까?
그건 바로 IP를 이용해서 알 수 있다.
IP(Instruction Pointer)로 다음 실행할 주소가 적혀 있어서 명령을 실행할 시점에 실행되어야 하는 주소를
알 수 있다.
이렇게 주소가 컴퓨터에서는 중요한 역할을 하고 있다는 것을 알 수 있다. 다음 포스터에서는 주소와 포인터에 대해서 자세히 알아보겠다.
'프로그래머, 보안 관련 지식 > 자료구조' 카테고리의 다른 글
자료 구조 : Selection Sort , Merge Sort (1) (0) | 2020.04.15 |
---|---|
자료구조 시작 전 알기 (5) Arrays, Algorithms, Complexity, and Recursion (0) | 2020.04.14 |
자료구조 시작 전 알기 (4) Arrays, Algorithms, Complexity, and Recursion (0) | 2020.04.11 |
자료구조 시작전 알기 (3) CPU-Memory Architeture, Variables ,Addresses, Pointers (0) | 2020.04.09 |
자료구조 시작전 알기 (2) CPU-Memory Architeture, Variables ,Addresses, Pointers (0) | 2020.04.09 |