컴퓨터 하드웨어의 구성.---------------------------------------------------------------------------------------

  컴퓨터 하드웨어와 시스템 프로그래밍을 게임프로그래머가 왜 공부해야 하는가. 

  부터 시작한다면 책에 써있는 바가 아닌 내 생각을 이야기해보고 싶다.

  이는 우리가 무엇을 이용하여 결과를 낼 수 있느냐에 대한 근본을 배우는 것이다. 우리가 코드를 만들어 내는 곳은 결국 컴퓨터이고 컴퓨터는 는 우리의 코드를 자신이 알아들을수 있는 언어를 통해서 이해한다. 컴퓨터를 이해하면 우리의 코드의 깊은 곳을 이해할 수 있다. 단순히 코드를 통해서 화면에 발생하는 움직임이 아니라 좀더 깊은 의도를 파악하고 그저 사용하기만 했던 코드들도 다른 방향에서 바라볼수 있는 시각을 가지게 된다.

  이는 핸드폰게임 개발자가 핸드폰의 하드웨어적인 한계에 대해서 알아야 하는 것과 같다. 보드게임을 만드는 사람은 자신의 말과 자신이 사용할 수 있는 재료에 대해서 알아야 하는 것과 같고 TRPG를 만드는 사람은 일반적인 사람의 사고능력과 성격에 대해서 흥미등에 대해서 탐구해야하는 것과 같다고 볼 수 있다.


 CPU의 개요.------------------------------------------------------------------------------------------------

  CPU란? 우리가 흔히 말하는 중앙처리 장치. CPU는 프로그램의 실행에 대해서 핵심적인 역할을 담당하므로 개인용PC라는 플랫폼을 기반으로 개발을 진행하는 소프트웨어 프로그래머라면 당연히 CPU에 대해서 좀더 구체적으로 이해하려는 노력이 필요하다.


 메인메모리와 입출력 버스--------------------------------------------------------------------------------------

  메인메모리(Main Memory) = 컴파일이 완료된 코드가 올라가서 실행되는 영역이다. 좀더 쉽게 이야기한다면 게임아이콘을 더블클릭하면 하드디스크의 데이터가 바로 이곳으로 올라가서 게임이 실행되게 된다고 생각하면 된다.

 입출력버스(I/O BUS) = 컴퓨터를 구성하는 구성요소들 사이에서 데이터를 주고받기 위해서 사용하는 경로이다. 종류에 따라서 다음과 같이 분류된다. 어드레스버스(Address Bus), 데이터버스(Data Bus), 컨트롤버스(Control Bus) 


  CPU의 구조------------------------------------------------------------------------------------------------

  ALU(Arithmetic Logic Unit) = 말그대로 컴퓨터연산의 기본이 되는 주체이다. 덧셈이나 뺄셈같은 산술연산과 AND OR같은 논리연산을 실행한다.

  컨트롤 유닛(Control Unit) = 하지만 ALU는 10001111000이런녀석이 덧셈을 하라는 건지 뭘하라는 건지 잘 알아듣지 못한데 이것을 ALU가 알아들을수 있게 해석하여 ALU가 작동하게 도와주는 것이 컨트롤 유닛이다. 요약하자면 CPU가 처리해야할 명령어들을 해석한다.

 "덧셈이군 뺄셈이군 논리연산이군 ALU야 내가 해석한대로 연산을 실행하렴."

  레지스터(Register Set) = ALU와 컨트롤유닛이 처리하기 이전에 잠깐 2진데이터(바이너리 데이터 Binary Data)를 저장해 두는 역할을 한다. CPU에 따라서 16비트 32비트 64비트를 저장이 가능하다. 또한 CPU에 따라서 종류와 개수가 다양하다.

  버스인터페이스(Bus Interface) = 명령어와 데이터들을 입출력버스를 통해 CPU로 이송해주는 녀석이 필요하다. 버스인터페이스는 입출력버스의 통신방식을 이해하고 있는 녀석이 필요하고 이를 통해서 입출력버스에 데이터를 받아오거나 혹은 입출력버스에 데이터를 송수신할 수 있는 녀석이 필요한데 그게 이녀석이다.


  클럭신호 ------------------------------------------------------------------------------------------------

  데이터를 전송하는 속력은 CPU가 연산하는 속력과 동일하다고 할수가 없다. CPU가 처리하는 속력에 맞춰 모든 주변기기가 동기화 해줘야 한다고 생각하면 된다. 즉 한번 입력되면 다음 한번은 출력하고 한쪽이 늦어진다면 입력이나 출력하는 쪽에서 CPU의 클럭신호에 맞춰서 자신의 연산을 늦추거나 낮춰 모든 연산이 한번에 돌아가게 해줘야 한다는 것이다. 이는 CPU의 처리는 순차적으로 실행되어야 함을 의미한다.


  프로그램의 실행과정 -----------------------------------------------------------------------------------------

  전처리기 -> 컴파일러 -> 어셈블러 -> 링커

  전처리기에 의한 치관작업 -> #define이나 #include 같은 지시자의 지시에 따라서 소스코드를 치환하고

  컴파일러에 의한 번역 ->  우리가 고급언어로 짠 코드들을 컴파일러가 어셈블리코드로 번역해준다음

  어셈블러에 의한 바이너리코드 생성 -> 10010101010110식으로 코드를 2진수하 시킨다. 그리고 이것을 0001은 덧셈 0010은 뺄셈 따른 녀석은 곱셈등으로 생성해준다.

  링커에 의한 연결과 결함. 메모리상에 존재하는 명령어를 cpu로 옮겨서 실제적으로 실행되어야 하는 실행파일로 만들어 준다. 그리고 이 실행파일은 Fetch Decode Execition이라는 과정을 거치게 된다.


  Fetch Decode Execition ------------------------------------------------------------------------------------

  Fetch = 메모리상의 존재하는 명령어를 cpu로 가져오고

  Decode = 가져다 놓은 명령어를 cpu가 해석한다음

  Execition = 명령어 대로 cpu가 실행하게 된다.


  Fetch 이녀석이 어떻게 명령어를 옮기지?------------------------------------------------------------------------

  어드레스버스(Address Bus), 데이터버스(Data Bus), 컨트롤버스(Control Bus)  우리가 나설 차례군!

  데이터버스 : 이름 그대로 데이터를 이동하기 위해서 필요한 버스이다. 이때 데이터는 명령어 연산에 필요한 피연산자가 될수도 있다. 

  어드레스버스  : 데이터는 주소가 있다고 생각하면 편하다. x 번지에 데이터1, xx번지에 있는 데이터2 그 주소값을 이동시키기 위해서 필요한 버스이다.

  컨트롤버스 : cpu가 원하는 바를 메모리에 전달할때 사용되는 버스이다. 데이터를 보냅니다. 데이터를 주세요 등등 말그대로 cpu가 메모리에 필요한 용건을 말할때 역할을 해주는 버스를 의미한다.



Posted by JJOREG