LISTORY
[윈도우즈 시스템 프로그래밍] 2부 복습 (1) 본문
명뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다.
이번 주는 이제까지 했던 내용 중, 2부를 다시 정리해보려고 한다.
2부 내용은 다음과 같았다.
2부. 프로세스와 IPC
4장. 컴퓨터 구조에 대한 두 번째 이야기
5장. 프로세스의 생성과 소멸
6장. 커널 오브젝트와 오브젝트 핸들
7장. 프로세스간 통신(IPC) 1
8장. 프로세스간 통신(IPC) 2
9장. 스케줄링 알고리즘과 우선순위
일단 이번 포스팅에서 정리할 부분은 4장. 컴퓨터 구조에 대한 두 번째 이야기 부분이다.
4장. 컴퓨터 구조에 대한 두 번째 이야기
CPU를 디자인 하고자 하면, HW 전문가는 물론 SW 프로그래머도 필요하다.
SW 프로그래머들이 CPU를 디자인에서 맡는 역할은 명령어 디자인이다.
명령어를 어떻게 구성하냐에 따라 레지스터 SET이 결정되고, 레지스터 SET이 결정됨에 따라 하드웨어 구성을 결정하기 때문이다.
⊙ 레지스터 디자인
레지스터 디자인의 핵심
1. 레지스터는 몇 비트로 구성할 것인가?
2. 레지스터 종류는 어떻게 구성할 것인가?
3. 각각의 레지스터 용도는 무엇인가?
1. 레지스터는 몇 비트로 구성할 것인가?
보통 n 비트 시스템에서 명령어의 길이는 n비트이다. 레지스터는 하나의 명령어를 저장해야하기 때문에 이와 동일한 크기를 갖고 있다.
2. 레지스터 종류는 어떻게 구성할 것인가?
많으면 많을 수록 좋지만 무조건 수를 늘릴 수는 없다.
3. 각각의 레지스터 용도는 무엇인가?
레지스터는 목적이 있는 저장 공간 장치이다. 각각의 용도를 정하면 명령어가 단순해지고 속도도 빨라지기 때문이다.
보통 몇몇의 레지스터는 범용 레지스터, 즉 연산을 위한 레지스터이고 나머지는 역할이 있는데
이는 앞으로 찬찬히 설명하도록 하겠다.
레지스터는 앞서 말한 것과 같이 명령어를 담는 저장 장치이다.
그렇다면 레지스터에 담는 명령어는 어떻게 구성이 되어야할까?
일단 하나의 레지스터에 하나의 명령어가 들어갈 수 있어야 하므로 명렁어와 레지스터의 크기는 동일한 경우가 많다.
만일 레지스터가 16비트라면 명령어도 16비트이고, 이 16비트의 명령어 안에는 어떠한 연산을 할 것인지,
결과는 어디 저장 할 것인지, 연산의 피연산자는 무엇인가에 대한 정보가 담겨있어야 한다.
<16비트 명령어 예제>
명령어가 어떤 것이냐에 따라 명령어의 내부 구조는 바뀔 수 있다.
⊙ 문제점
위와 같이 명령어를 디자인 했을 때, 생길 수 있는 문제가 있다.
피연산자 1에 숫자 1, 즉 0001을 넣고싶다. 근데 여기서 이게 레지스터인지, 숫자인지 어떻게 구분할 수 있을까?
이를 구분하기 위해 앞에 하나의 비트를 약속을 위한 비트로 사용한다.
0001 : 레지스터 001
1001 : 숫자 001
하지만 이렇게 했을 경우 다룰 수 있는 숫자의 수가 너무 적다. 이 문제에 관해선 뒤에서 다루도록 하겠다.
⊙ CISC & RISC
명령어가 단순한 CPU 구조를 RISC, 복잡한 구조를 CISC라고 한다.
CISC는 복잡한 구조를 가지고 있지만 명령어 조합을 다양하게 할 수 있다.
반면에 RISC는 명령어 자체가 단순하기 때문에 조합이 다양하지 못하다.
즉, CISC로 한줄이면 처리하는 것을 RISC는 수십 줄로 표현해야 할 수 있다.
하지만 오늘날 대부분의 CPU는 RISC이다. 이는 속도의 향상 때문이다.
⊙ 클럭
명령어 하나를 처리하기 위해선 Fetch -> Decode -> Execution 단계를 거친다.
이 각각의 단계를 지나갈때, RISC는 명령어가 간단해서 한 클럭에 하나의 단계를 거칠 수 있지만
CISC는 명령어에 따라 제각각이다.
이 때 파이프 라인을 사용하는데, CISC는 위와같은 이유로 명령어를 처리하는 과정을 단순화시키지 못하므로
CISC보다 RISC가 더 빠르게 된다.
⊙ Load & Store 명령어
CPU에서 연산한 결과는 바로 메모리에 저장되지 않고 레지스터를 통해서 빠져나간다.
RISC에서는 명령어에 그냥 최종 목적지 메모리 주소를 쓸 수 있지만, CISC에서는 성능의 문제로 레지스터를 반드시 통해야 한다.
하지만 메모리 주소만으로는 메모리 주소에 있는 값에 직접 어드레싱 할 수 없다.
이를 보완하기 위해 나온 명령어가 LOAD와 STORE이다.
RAM에 있는 데이터를 레지스터로 옮기는 명령어를 LOAD, 반대를 STORE라고 한다.
⊙ Load & Store 명령어 필요성
명령어에는 다음과 같은 제한이 존재한다.
명령어의 제한
- 사칠연산의 피연산자는 숫자 또는 레지스터이다.
- 연산결과는 레지스터에 저장해야 한다.
- 즉, 레지스터를 통해 모든 연산을 진행해야 한다.
즉, RAM 등에 있는 메모리 주소값이 명령어에 직접 들어갈 수 없다.
메인메모리에서 값을 가져오기 위해선 데이터를 레지스터에 옮겨야 하고, 연산 뒤에는 그 값을 다시 다른 곳으로 옮겨야 한다.
이때, LOAD와 STORE를 쓴다.
'IT > 윈도우 프로그래밍' 카테고리의 다른 글
[윈도우즈 시스템 프로그래밍] 2부 정리 (3) (0) | 2018.09.01 |
---|---|
[윈도우즈 시스템 프로그래밍] 2부 정리(2) (0) | 2018.09.01 |
[윈도우즈 시스템 프로그래밍] 1부 정리(3) (0) | 2018.08.19 |
[윈도우즈 시스템 프로그래밍] 1부 정리(2) (0) | 2018.08.19 |
[윈도우즈 시스템 프로그래밍] 1부 정리 (0) | 2018.08.19 |