프로그래밍/Computer Science

[Overview] 02. Data Manipulation - (1) Computer Architecture and Machine Language

Churnobyl 2023. 7. 17. 11:11
728x90
반응형

Central Processing Unit


01. CPU 기초 (CPU Basics)

02. 기계어 (Machine Language)

RISC (Reduced Instruction Set Computer) VS. CISC (Complex Instruction Set Computer)

명령의 종류 (Type of Instructions)

 

 

 1장에서는 주저장장치인 메모리에 데이터를 어떻게 저장하는지에 대해 공부했다면 2장에서는 저장된 데이터를 컴퓨터가 어떻게 조작하는지에 대해서 공부할 것이다.

 

 데이터 조작을 제어하는 컴퓨터 안의 회로는 중앙처리장치(Central Processing Unit, CPU) 혹은 프로세서(Processor)라고 불린다. 초기의 ENIAC과 같은 컴퓨터에서 CPU는 선반 여러 개에 나누어진 큰 장치였으나 현대로 오면서 CPU의 크기가 비약적으로 작아졌다. 현재 CPU의 크기는 우표 크기 절반 정도이며 그 때문에 마이크로프로세서(Microprocessor)라고 불린다.

 


01. CPU 기초 (CPU Basics)

CPU는 데이터에 대해 덧셈이나 뺄셈 같은 연산을 수행하는 회로를 가진 연산장치(Arithmetic/Logic Unit, ALU), 컴퓨터의 동작을  제어하는 회로를 가진 제어장치(Control Unit), CPU 내에 정보를 임시로 저장하기 위한 레지스터 장치(Register Unit)로 구성되어 있다.

 

8008 microprocessor (출처: Ken Shirriff's blog)

 여기서 레지스터는 연산 입력 또는 연산 결과를 임시 저장하는 역할을 하는 범용 레지스터(General Purpose Register)다음 인출할 명령어나 명령어 주소를 임시 저장하는 용도가 분명하게 나뉘어진 용도 지정 레지스터로 구분된다.

 

 주기억장치에 저장된 데이터에 대한 연산을 수행하기 위해 제어장치가 데이터를 주기억장치로부터 범용 레지스터로 전송하고, 어느 레지스터가 데이터를 가지고 있는지 연산장치에 알려주고, 연산장치는 연산에 필요한 적절한 회로를 가동시켜 연산한 뒤에, 제어장치가 다시 연산장치에게 어떤 레지스터에게 결과를 주면 되는지 알려준다.

 

 주기억장치와 CPU가 비트 패턴을 서로 전달하기 위해 버스(Bus)라는 전선 묶음이 연결되어 있다. 초창기 컴퓨터는 이러한 전선 묶음을 직접 이동시켜 CPU 회로를 변경하는 방법이 사용되었다. 하지만 현대로 오면서 주기억장치에 프로그램을 로드해서 담고 실행하도록 설계해, 회로를 직접 변경하지 않고 주기억장치에 담을 프로그램을 바꾸는 것만으로 수행할 프로그램을 바꿀 수 있게 되었다. 이러한 개념을 프로그램 내장 개념(Stored Program Concept) 혹은 폰노이만 아키텍쳐라고 하며 현재 대부분의 컴퓨터는 이러한 방식으로 설계된다.

 

 현대로 와서 CPU의 성능이 훨씬 더 뛰어나지면서 CPU가 데이터를 처리하는 속도가 주기억장치에서 데이터를 불러오는 속도를 훨씬 능가하게 되었다. 이러한 속도 차이를 완화하기 위해 캐시 메모리(Cache Memory)라는 크기는 작지만 매우 빠른 메모리CPU 안에 추가로 장착한다. 캐시 메모리는 주기억장치에서 자주 사용되는 데이터를 CPU안에 복사해서 들고 있도록 해서 평균 메모리 접근 시간을 아낄 수 있도록 한다. 다시 말해서 CPU는 주기억장치에서 특정 주소의 데이터를 들고 오기 전에 먼저 캐시에 그 주소의 데이터가 있는지 먼저 살피고 만약 있다면 데이터를 캐시에서 직접 읽고, 없다면 주기억장치에 접근한다.

 

CPU와 메모리의 연도별 성능 차이 비교(출처: extremetech.com)

 

 캐시 메모리는 속도와 크기에 따라 여러 개가 장착될 수 있는데 각각 L1, L2, L3 등으로 불린다. 여기서 L은 Level을 의미하며 L1 캐시 메모리가 가장 비싸고 빠르다. L1 캐시 메모리는 보통 8~64KB의 용량을 가지며 데이터를 참조하기 위해 가장 먼저 접근하는 캐시다. L1에서 원하는 데이터가 없다면 L2 캐시로 넘어간다. L2 캐시는 64KB~4MB의 용량을 가지는데 L1보다는 느리지만 그래도 주기억장치보다는 빠르다. 여기에서도 원하는 데이터가 없으면 L3 캐시로 넘어가는 식이다.

 

 사실상 필요한 데이터가 캐시 안에 있는지 살펴봐야 하는 한 단계가 더 추가된 거라 시간이 더 늘어나는 게 아닌가 싶기도 하다. 실제로 캐시 안에 필요한 데이터가 없다면 바로 주기억장치에 접근하는 것보다 시간이 지연된다. 하지만 생각보다 적중률이 꽤 높다. 적중률이 높을 수 밖에 없는 이유는 데이터 지역성이라는 중요한 개념에 있다. 데이터 지역성은 한번 참조된 데이터는 또 참조될 가능성이 높다시간 지역성, 한번 참조된 데이터 근처의 데이터가 잠시 후에 사용될 가능성이 높다공간 지역성, JUMP하지 않는 이상 명령어들은 순차적으로 실행될 가능성이 높다순차적 지역성 등 세 가지로 분류되며 더 자세한 내용은 추후에 따로 정리해보자.

 

 


02. 기계어 (Machine Language)

실행할 프로그램은 주기억장치에 일련의 비트 패턴들로 인코딩되어 저장된다. 이러한 프로그램 내장 개념을 적용하기 위해 CPU는 비트 패턴들로 인코딩된 명령들을 해석할 수 있도록 설계되어 있다. 이 인코딩 체계와 명령 집합을 기계어라고 한다.

 

 CPU가 필수적으로 해석하고 실행해야 하는 명령의 개수는 많지 않고 기본적인 명령의 조합으로도 충분히 동작 가능하다. 하지만 더 복잡한 명령을 수행할 수 있는 CPU를 선호하는 철학도 있는데, 여기에서 CPU 구조에 대한 두 가지 철학이 생겨났다.

 

RISC (Reduced Instruction Set Computer) VS. CISC (Complex Instruction Set Computer)

RISC는 CPU가 최소한의 기계 명령 집합을 실행하도록 설계되어야 한다는 철학이며, CISC는 다수의 명령이 기능적으로 중복되어도 많은 수의 복잡한 명령들을 실행할 수 있어야 한다는 철학이다.

 

  대표적인 CISC 진영은 인텔 프로세서이며, RISC 진영은 초기 애플 매킨토시에 사용된 PowerPC 프로세서다. CISC는 초기에 비용이 꽤 들었지만 현대로 오면서 점차 제조 비용이 낮아져 현재 거의 모든 데스크톱이나 노트북에 사용되고 있다.

 

 CISC는 RISC에 비해 전력을 많이 소모한다는 단점이 있어 디지털 TV, 자동차 모듈, 스마트폰, 기타 전자제품과 같은 저전력 제품에는 RISC구조의 CPU가 사용된다.

 

 

명령의 종류 (Type of Instructions)

기계 명령의 종류는 RISC든 CISC든 데이터 전송(Data Transfer), 연산(Arithmetic/Logic), 제어(Control)로 나눌 수 있다.

 

데이터 전송 (Data Transfer)

 데이터를 한 장소에서 다른 장소로 옮길 것을 요청하는 명령. 사실상 옮기기 보다는 복제(copy)하는 경우가 많다. 주기억장치 메모리 셀의 데이터를 CPU 범용 레지스터로 옮기는 요청을 LOAD라고 하며, 반대로 CPU 범용 레지스터의 데이터를 메모리 셀로 옮기는 요청을 STORE라고 한다. 데이터 전송 명령은 CPU와 주기억장치 사이 뿐만 아니라 프린터, 화면, 키보드 등과 같은 입출력 장치에서도 중요하다.

 

연산 (Arithmetic/Logic)

 CPU의 제어장치가 연산장치에 어떤 연산을 하도록 요청하는 명령. 덧셈, 곱셈과 같은 기본적인 산술 연산 이외의 AND, OR, XOR과 같은 논리 연산 또한 포함한다. 추가적으로 레지스터의 내용을 왼쪽이나 오른쪽으로 이동시키는 명령이 있는데 이동시키면서 레지스터 바깥으로 나가버린 비트를 버리는 것은 SHIFT 명령, 나가버린 비트를 다시 반대편의 빈자리에 채우는 명령을 ROTATE명령이라고 한다.

 

제어 (Control)

 데이터를 조작하는 대신 프로그램의 실행을 조종하는 명령. CPU가 목록에 따라 명령을 실행하다가 아예 다른 명령으로 이동하는 경우 JUMP와 같은 명령을 실행할 수 있다. 예를 들어 나눗셈 연산에서 분모가 0인 경우에는 나머지 연산이 실행될 필요가 없으므로 '분모가 0일 경우 마지막으로 건너뛰어라(JUMP)'라는 명령을 수행할 수 있다.

 

 

 

반응형