소년코딩

컴퓨터 시스템 구조

컴퓨터의 주요 구성 요소:

  • 중앙처리장치(CPU)
  • 주기억장치(Main Memory)
  • 주변장치(Peripheral Device)

1. 시스템 버스(System Bus)

시스템 버스란 컴퓨터를 구성하는 주요 모듈을 연결하여 정보를 주고받는 통신 선로를 말하는데, 디지털 정보인 경우 보통 선 하나에 0 아니면 1의 두 가지 정보 즉, 1 비트(Bit) 정보를 전달할 수 있다.

- 어드레스 버스

어드레스 버스(Address Bus)는 CPU가 메모리의 정보를 읽거나 메모리에 정보를 쓰고자 할 때, 메모리 위치 즉, 주소를 전달하기 위한 버스로서 CPU가 지원할 수 있는 메모리 용량에 따라 선의 개수가 결정된다.

- 데이터 버스

데이터 버스(Data Bus)는 메모리에 기록할 데이터나 메모리에서 읽힌 데이터를 전달하는 용도로 사용되는데, 하드웨어 설계상 어드레스 버스와 데이터 버스가 동시에 사용되지 않dmaus 어드레스 버스의 일부를 데이터 버스로 활용하는 경우도 있다.

데이터 버스의 크기는 한꺼번에 실어 나를 수 있는 최대 바이트 수에 따라 결정된다.

- 제어 버스

각종 제어 신호를 전달하기 위한 제어 버스(Control Bus)가 있다.


2. 주기억 장치(Main Memory)

CPU가 접근하여 실행할 프로그램을 저장할 목적으로 사용되는 메모리를 메인 메모리라고 한다. 메모리는 보통 읽거나 쓸 수 있는 최소 단위인 바이트(8 비트)의 연속으로 이루어진다. 다시 말하면, 메모리는 바이트 단위로 주소가 배정되어 있으므로 비트 단위로 읽거나 쓸 수 없다.

따라서 어느 번지의 바이트에 포함된 비트를 수정하려면 해당 바이트 전체를 CPU로 읽어온 후, 원하는 비트를 비트 연산으로 수정하고 그 바이트를 다시 기록해야 한다.

CPU 특성에 따라 한 번에 읽거나 쓸 수 있는 최대 바이트 수가 다양한데, 보통 1, 2, 4, 8 바이트를 읽을 수 있는 기계 명령어를 각각 가지고 있어서 프로그래머에서 편의를 제공한다.

만약 CPU에 2 바이트 읽기/쓰기 기계 명령어까지만 있다면 4바이트 정수값을 참조하기 위해서는 두 번의 메모리 접근이 필요하므로 불편하고 성능이 낮아진다.

또한, 어떤 CPU에서는 2 바이트 혹은 4 바이트 읽기•쓰기는 반드시 2 혹은 4의 배수인 주소에서만 가능하게 되어있는데 이를 메모리 얼라인먼트(Memory Alignment)라고 한다.

3. 기계 명령어(Machine Instruction)

기계 명령어는 프로그램 일부로 메모리에 저장되어 있다가 CPU에 의해 하나씩 읽히고 읽어진다. 기계 명령어의 전형적인 포맷은 연산코드(Operatiion Code)와 피연산자(Operand)로 구성된다.

연산 코드는 CPU에게 지시하는 명령어를 의미하고, 이 부분이 크면 기계 명령어의 종류를 많이 가지고 있다는 의미이다. 피연산자는 연산이 적용될 대상을 지시하는 부분으로, 변수에 대응되는 메모리 주소, 상수, 임시 값을 저장하고 있는 CPU 레지스터 번호 등이 기입될 수 있는데 이들은 연산 코드에 따라 가장 적절한 유형의 피연산자로 해석된다.

  • 기계 명령어는 연산코드와 피연산자로 구성되고, 연산코드 부분의 크기는 연산 종류의 개수를, 피연산자 부분의 크기는 최대 메모리 용량을 결정한다.
  • 피연산자는 연산코드에 따라 주소, 상수, 레지스터 번호 등 다양하게 해석된다.

4. 기계 사이클(Machine Cycle)

CPU는 전원을 받은 순간부터 같은 활동을 끊임없이 반복하는데 이를 기계 사이클이라 한다.

CPU는 메모리에서 명령어를 인출하여 CPU 내부로 가져오고(Fetch Cycle), 그것이 어떤 명령어인지를 알기 위해 연산 코드를 해독하고(Decoding Cycle), 연산을 위한 피연산자 준비가 필요한 경우 메모리에 다시 접근하여 피연산자를 인출한 다음(Operand Cycle), 연산을 처리한다(Excecution Cycle).

이와 같은 기계 사이클 단계는 발진 회로에 의해 발생하는 톱니바퀴 형 파형(Clock)에 따라 진행되고, 하나의 명령어 처리를 위한 기계 사이클이 끝나면, CPU는 자동으로 다음 명령어에 대한 기계 사이클을 개시한다. 이때, 처리할 명령어가 저장된 메모리의 주소는 CPU 내의 PC(Program Counter) 레지스터에 의해 관리된다.

  • 기계 사이클은 CPU가 반복적으로 처리하는 동작의 패턴으로서, 명령어 인출(Fetch), 명령어 해석(Decoding), 피연산자 인출(Operand), 연산 처리(Excution) 주기 등 크게 4개의 주 스텝으로 구성된다.
  • 하나의 명령어 연산이 완료되면 CPU는 자동적으로 PC 레지스터가 가리키는 다음 명령어 처리를 개시한다.

5. 레지스터(Register)

컴퓨터 학문에서 레지스터는 값을 저장할 수 있는 곳을 말한다. 따라서 메모리도 넓은 의미에서 레지스터에 해당하지만 일반적인 레지스터는, 메모리와 달리 규칙적이지 않으면서 소량이고, 단순한 값의 저장 기능뿐만 아니라 저장되는 값에 따라 특별한 기능이 이루어지는 곳을 말한다.

크게 CPU 레지스터와 특수 기능 레지스터(SFR: Special Function Register) 혹은 특수 목적 레지스터(Special Purpose Register), 그리고 입•출력 레지스터 등 세 가지로 분류할 수 있다.

CPU 내에 존재하는 CPU 레지스터들은 연산을 위해 피연산자를 임시 저장하는 용도가 대부분이고, 특수 목적 레지스터는 컴퓨터의 상태 설정 등 특수 용도로 사용된다.

입•출력 레지스터들은 입•출력 장치와 연결되어 그곳에 값을 저장하면 해당 장치로의 출력이 이루어지고, 읽으면 장치로부터 입력된 값이 얻어진다.

  • 레지스터란 소량의 데이터를 특별한 용도로 저장하는 곳으로, 크게 CPU 레지스터와 특수 기능 레지스터, 그리고 입•출력 레지스터로 분류된다.
  • CPU 레지스터는 주로 연산을 위한 피연산자의 임시 저장 용도로, 특수 목적 레지스터는 컴퓨터의 상태 설정 등 특수 용도로, 그리고 입•출력 레지스터는 주변 장치와의 입•출력 창구 용도로 사용된다.

6. 주소 지정 모드(Adressing Mode)

기계 명령어 포맷 중, 피연산자 부분은 메모리 주소뿐만 아니라 상수나 레지스터 번호 등 연산 코드에 따라 다르게 해석될 수 있다고 했다.

이처럼 기계 명령어의 피연산자 부분에 허용될 수 있는 값의 유형을 주소 지정 모드라 하는데, 크게 직접 • 간접, 절대 • 상대, 주소 • 상수 등 세 가지 관점에서 살펴볼 수 있다.

- 직접 • 간접(Direct • Indirect) 주소 지정 모드

기계 명령어의 피연산자 값이, 연산이 적용될 값이 저장된 메모리 주소로 사용되면 이를 직접 주소라 부르는데, 가장 자주 사용된다. 이와 다르게, 피연산자 값이, 연산이 적용될 값이 저장된 곳의 주소가 저장된 메모리 주소로 사용될 때는 간접 주소라 부른다.

- 절대 • 상대(Absolute • Relative) 주소 지정 모드

피연산자에 주어진 주소만으로 메모리를 참조하면 절대 주소라 부른다. 그런데 기계 명령어의 피연산자 주소값을 제 3의 저장 장소인 베이스 레지스터에 설정된 값에 더하여 메모리 참조 주소를 결정하는 방식이 있다. 이를 다르게 표현하면, 베이스 레지스터에 기준이 되는 주소값을 설정해 두고, 기계 명령어에는 그 기준 주소로부터 거리만을 표시하는 것으로 설명할 수 있다.

즉, 목적 주소를 기준 주소와 그로부터의 상대적 거리의 합으로 표현하는 방식인데, 이런 방식을 상대 주소라 부른다. 상대 주소 기법의 최대 장점은 기계 명령어를 수정하지 않고, 기준 레지스터값의 조정만으로 참조 메모리 영역을 쉽게 변경할 수 있다는 것이다.

- 주소 • 즉시(Address • Immediate) 주소 지정 모드

위에서 살펴본 주소 지정 모드의 공통점은 피연산자에 주어진 값들이 모두 메모리 참조를 위한 주소로 사용된다는 것이다.

피연산자를 주소가 아닌 상수로 사용하는 경우를 상수(Constant) 혹은 즉시 주소라 부른다.


컴퓨터시스템

'컴구 이야기' 카테고리의 다른 글

4. 훑어보는 입/출력 장치  (0) 2020.09.02
3. 훑어보는 인터럽트  (0) 2020.08.30
1. 훑어보는 운영체제  (0) 2020.08.16
정수의 표시  (0) 2019.02.16
동시성과 병렬성 훑어보기  (2) 2019.02.12
댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기