IV : 컴퓨터 구조에 대한 두번째 이야기
뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;)
컴퓨터 구조의 접근방법
컴퓨터 구조에 대한 보다 근본적인 이해는 프로세스와 쓰레드를 공부하는 데 큰 도움이 된다.
CPU의 특성을 알 필요가 있는 시스템 프로그래머 입장에서, CPU를 보는 관점 대부분은 레지스터에 집중된다.
레지스터를 디자인할 때 결정해야 할 중요 요소로는 다음과 같은 항목이 있다.
- 레지스터를 몇 비트로 구성할 것인가
- 레지스터를 몇 개 정도 준비할 것인가
- 레지스터 각각을 무슨 용도로 사용할 것인가
CPU 구성 형태에 따라서, 즉 레지스터 구성 형태에 따라서 명령어 구조가 달라진다.
만일 16비트짜리 레지스터가 있고, 명령어 길이를 만일 16비트로 일치시킨다고 하면, 명령어는 65536개가 될 수 있지만, 실제로 CPU의 명령어는 그만큼이 되지 않고, 명령어에 따르는 피연산자들을 또한 한 번에 처리할 수 있도록 공간을 분할하여 사용하는 것이 좋다.
명령어는 ir
이라는 레지스터에 저장되고 있고, 이는 다음 번에 실행하게 될 명령어를 미리 가져다 놓는 용도로 사용하고 있다.
이러한 명령어 시스템에서, 첫 번째 피연산자 위치에는 레지스터 이름이 와야 한다는 규칙이 있다.
메모리 주소가 만일 올 수 있게 한다면, 명령어 구조가 복잡해지고, 하드웨어 구성도 복잡해지며 명령어 처리 속도 또한 증가될 수 있기에 레지스터를 기반으로 연산을 수행하는 제약 사항이 정해졌다.
- CISC
- 명령어 종류가 다양할 수 있도록, 명령어 길이를 유동적으로 잡음으로서 프로그램 구현에 있어서 편리함을 가져다 준다.
- 하지만 명령어 수가 많고 크기가 일정치 않기 때문에 CPU가 복잡해지며 성능 제한이 생긴다.
- RISC
- 명령어 수를 대폭 줄이고, 길이를 일정하게 디자인하였다.
- 클럭당 처리할 수 있는 명령어의 개수를 늘릴 수 있게 되었다. (파이프라이닝)
- 인텔의 32비트, 64비트 및 임베디드 CPU 대부분이 RISC 구조이다.
LOAD & STORE 명령어 디자인
실제 변수를 읽어오거나 저장하기 위해서는 메인 메모리와의 데이터 저장과 로드가 가능해야 한다. 이를 위해 LOAD
와 STORE
명령어를 만들어야 한다.
int a = 10; // 0x10 번지 할당
int b = 20; // 0x20 번지 할당
int c = 0; // 0x30 번지 할당
c = a + b;
LOAD r1, 0x10
LOAD r2, 0x20
ADD r3, r1, r2
STORE r3, 0x30
C언어를 우리가 설계한 명령어 셋으로 변환하면 위와 같다.
Direct 모드와 Indirect 모드
하지만 위 경우에 하나의 명령어에 여러 정보를 담다 보니 표현하는 데이터 크기에 제한이 생기게 된다. 명령어의 일부로 직접 메모리 주소를 써 넣는 방법을 Direct 모드라고 하고, 이는 할당된 비트 수 안의 주소값만 접근이 가능한 한계를 가진다.
이를 해결하기 위해 Indirect 모드가 나왔는데, 이는 해당 주소를 타고 들어간 곳의 값이, 실제 목적지로 하는 곳의 주소가 되는 것이다.
이러한 모드의 구분을 위해서는 추가적인 플래그 비트의 할당이 필요할 것이다.
int a = 10; // 0x0010 번지 할당
int b = 20; // 0x0100 번지 할당
int c = 0; // 0x0020 번지 할당
c = a + b;
위의 경우에는, 0x0100
번지에 대한 참조를 위해서는 8비트로는 불가능하다. 따라서 Direct 모드가 아닌 Indirect 모드를 사용해야 한다.
LOAD r1, 0x0010
MUL r0, 4, 4
MUL r2, 4, 4
MUL r3, r0, r2
STORE r3, 0x0030
LOAD r2, [0x0030]
ADD r3, r1, r2
정리
- 명령어
- CPU에게 일을 시키기 위해 명령어가 만들어지는데, 연산자에 대한 정보 뿐만이 아니라 피연산자들에 대한 정보도 함께 들어간다. 이에 따라 명령어마다 피연산자를 담고 있는 방식도 다르게 된다.
- CPU의 내부 연산과 레지스터
- 명령어의 기본 설계 제약 사항에 따라 모든 연산은 레지스터 기반으로 되어야 하고, 동작 원리 상
ir
레지스터에 다음 명령어가 들어가고,pc
등 다양한 목적을 가진 레지스터가 존재한다.
- 명령어의 기본 설계 제약 사항에 따라 모든 연산은 레지스터 기반으로 되어야 하고, 동작 원리 상
- Direct vs Indirect
- CPU가 메모리에 접근하는 방식은 두 종류로 나뉘는데, 주소값을 이용해서 직접 접근하는 direct 모드와, 주소값을 저장한 주소값을 참조하는 indirect 모드가 존재한다. indirect는 곧 direct 모드가 가지는 주소값 표현 크기에 대한 한계를 극복하는데 도움을 준다.
'공부한 이야기 > 윈도우 OS' 카테고리의 다른 글
VI : 커널 오브젝트와 오브젝트 핸들 (0) | 2023.04.29 |
---|---|
V : 프로세스의 생성과 소멸 (0) | 2023.04.29 |
III : 64비트 기반 프로그래밍 (0) | 2023.04.29 |
II : 아스키코드 VS 유니코드 (0) | 2023.04.29 |
I : 컴퓨터 구조에 대한 첫번째 이야기 (0) | 2023.04.29 |