[컴퓨터 구조] chap 1.3 Below your Program
본 포스팅은 아주대학교 Computer Organization and Architecture 강의 내용을 토대로 작성한 글입니다.
+ Computer Organization and Design : The Hardware/Software Interface Mips ver. 의 책을 참고하였습니다.
Q : 왜 chap 1.2는 건너뛰나요?
A. : chap 1.2 'Eight Great Ideas in Computer Architecture' 는 지난 60여년 동안 개발된 컴퓨터 아키텍트에 관한 포괄적인예시들이 있는 챕터로, 분량도 적고 크게 다룰만한 포인트는 아니여서 넘어간다. 궁금하면 본 원서를 읽어보기 바란다.
1.3 Below your Program
하드웨어인 컴퓨터는 아주 간단한 low-level 의 명령어(instruction)밖에 이해하지 못한다.
그러므로 우리가 복잡한 응용 프로그램(application)을 실행하는 과정에서 우리가 흔히 보는 'high-level 동작'을 컴퓨터가 이해할 수 있는 간단한 컴퓨터 명령어로 interpret 혹은 translate하는 몇 가지 단계가 진행된다.
이러한 과정은 내부적으로 진행되기에 사용자가 이러한 내부 구조를 잘 알지는 못한다. 그럼에도 우리는 컴퓨터를 잘 사용할 수 있는데, 이처럼 하위 계층의 구조를 숨겨 사용자가 하드웨어를 잘 사용도록 포장하는 방식을 Abstraction (추상화) 라고 한다.
위의 그림은 하드웨어(hardware)와 소프트웨어(software) 사이의 계층 구조(hierachical layers)를 간단하게 나타낸 것이다.
Application software (응용 소프트웨어)
게임, 파워포인트, 엑셀 등 우리가 흔히 실행하는 응용 소프트웨어를 의미한다.
고수준 언어로 작성되었기에 생산성이 좋고, 유지 보수가 용이하다.
System software (시스템 소프트웨어)
운영체제 (OS,Operatiog System), 컴파일러(Complier) 등 하드 웨어와 응용 소프트웨어 사이를 이어주는 소프트웨어이다.
앞서 언급한 OS, Complier 가 대표적인 예시인데
Operatiog System | ● 입력과 출력에 관한 동작을 제어한다. ( Handling I/O operation ) ● 메모리와 저장 공간을 제어한다. ( Managing memory and storage ) ● 작업(task)들을 스케줄링(scheduling)하고, 자원(resource)을 분배한다. |
Complier | ● HLL(High-Level Language)를 기계어로 번역한다. (translate HLL code to machine code) |
여기서 HLL (High level language) 은 우리가 흔히 작성하는 C, C++, JAVA 와 같은 언어를 이야기한다.
프로그램 코드의 단계
우리가 무엇인가 컴퓨터에게 명령을 하면 컴퓨터는 그것을 이해하고 실행한다. 이때 우리가 알파벳, 한글을 사용하여 대화하는 것처럼, 컴퓨터에게도 컴퓨터 고유의 언어를 사용해 일을 시키는데, 이때의 한 글자들을 우리는 비트 (bit, binary digit) 라고 한다. 그리고 우리가 컴퓨터 하드웨어에 일을 하도록 지시하는 지시문을 명령어( instructions )라고 하고, 이는 여러 비트들의 묶음으로 되어있다.
위의 그림은 명령어의 예시이다. 나중에 배우겠지만, 이는 두 가지 "숫자를 더하라" 라는 문구이며, 뒤의 ' 100000 ' 이 ' 더하기 ' 를 나타낸다.
초창기에는 이러한 이진수를 가지고 직접 컴퓨터에게 일을 시켰지만 너무 번거로웠고, 그렇기에 명령어를 대신할 상징적인 문구 (Symblic notation)을 만드는데, 이것을 어셈블리어(Assembly language) 라고 한다. 컴퓨터는 이진수를 통해서 명령을 받으므로 이러한 어셈블리어를 이진수, 즉 기계어(machine language)로 변환하는 프로그램을 만들었는데, 이것의 이름이 바로 어셈블러(Assembler)이다.
위의 그림은 C언어로 써진 'High-level 언어' 에서 기계가 이해할 수 있는 '기계어' 로 바뀌기까지의 과정을 담고 있다.
위에서부터 보면, C언어로 써진 프로그램이 컴파일러(Complier)를 통해 컴파일(Complie)이라는 과정을 거쳐서 어셈블리어가 된다. 어셈블리어는 어셈블러를 통해 이진수의 기계어(Binary machine language)로 바뀌면서 컴퓨터랑 향한 하나의 명령(Binary instruction)이 완성된다.
이렇게 번역된 low-level 언어로 HW(Hardware)한테 명령을 내려야되는데, 이때 ISA(Instruction Set Architecture)를 통해 HW와 SW를 매개한다. 위의 그림에 적혀있는 MIPS 또한 ISA의 한 종류이다. ISA는 명령어의 집합을 정의하는 아키텍처로, 쉽게 말해 프로세서와 SW를 매개하는 일종의 인터페이스이다. ISA는 더 쉽게 말하면 micro processor(마이크로프로세서), 즉 CPU가 기계어를 이해하는 방식이라고 보면 된다. 이러한 ISA를 통해 구현한 것이 Microarchitecture 인데, 프로세서의 내부 하드웨어 구조를 의미한다.
같은 ISA를 구현하더라도, 파이프라인의 깊이, 캐시의 크기 및 구조 등의 다양한 요인을 다르게 해서 다양한 프로세서를 만들 수 있다.