예전부터, CS강의를 듣고 컴퓨터의 근본 개념에 대해서 꼭 공부해야겠다고 생각했었는데 유튜브에 보석같은 강의를 발견했고 들었다. 그리고 마침 또 친구 개발자가 이것저것 컴퓨터의 작동원리를 설명 해 주었는데 CS강의와 연관되는 내용이 있어서 이 깨달음이 증발하기 전에 정리해야겠다고 생각해서 정리한다. 아주 간략하게.(보석같은 강의의 링크를 달아둔다. 아래에)
컴퓨터는 모든것을 0,1로 해석해서 정보를 저장하고 처리한다. 이진수를 기본 베이스로 깔아두는 것이다.
변수나 함수를 선언하면 그 인간의 언어를 컴퓨터는 전부 0,1로 바꿔서(compile해서) 이해하고 메모리에 저장을 해둔다. 인간이 쓴 영어로된 코드를 source code라고 하고 그걸 compile해서 컴퓨터가 이해할 수 있도록 0,1 로 바꾼 0,1을 machine code라고 한다. (이 개념은 상당히 low level 까지 파내려간 경우다.)
그리고 machine 코드는 ram이라는 메모리에 저장된다.
그리고 그 메모리 안에 있는 모든 장소에는 '주소'가 있다. 저장될 때 우리는 그 저장된 곳의 주소를 따로 변수에 저장해서 사용할 수 있다. 이때 포인터의 개념이 들어가는 것이다. 예를 들어, swap을 할때 int x= 1 / int y = 2를 swap(a,b)
에 넘겨주었다고 하자. 이때 a,b에 x,y 변수가 메모리에 저장된 주소를 넘겨주어야 x,y가 바뀐다 그렇지 않으면 x,y의 복사본이 넘어가고 복사본만 바뀌고 원본은 바뀌지 않는다.
한마디로, x,y의 포인터를 변수에 담고. 그 변수를 따라가면 x,y의 위치를 알고 그 안에 들어있는 원본에 접근 할 수 있게 되는 것이다.
메모리 맨위에는 machine code가 저장, 그밑에는 변수 그밑에는 heap이 저장된다.
또한 c언어에서는 malloc(memory allocation) 을 통해 메모리안에 어떤 크기만큼 공간을 할당 받고 거기에 다른 공간에 저장된 정보를 복사할 수 있다. 하지만 나중에 free를 통해 내가 할당 받았던 공간을 다시 반납해야한다. 그래야 불 필요한 메모리 소모를 줄일 수 있기 때문이다.
컴퓨터 구조에 대해서 또 간략하게 설명해보려고 한다. 컴퓨터는 cpu, cachememory, ram, ssd, hdd로 크게 구성이 되어져 있는데, cpu가 hdd에 저장되어있는 정보를 ram에 저장해놓고 필요할 때 마다 꺼내서 쓴다.
cpu는 ram에 필요없는 것은 삭제하여 나중에 더 중요한 정보가 저장되도록 항상 ram을 최적화 시켜놓는다. 그래서 cpu는 빛의 속도만큼 매우 빠르게 움직이며 운반, 저장, 연산, 관리와 같은 작업을 하는 것이다.