컴퓨터가 작동하기 위해 물리적으로 하드웨어(Hardware)가 필요하다. 이러한 하드웨어 위에서 이루어지는 수행 명령을 통칭해서 소프트웨어(software)라고 한다. 소프트웨어도 OS와 같은 시스템 소프트웨어와 현재 사용 중인 웹 브라우저와 같은 응용 소프트웨어로 나눌 수 있다.
하드웨어의 구성
메인 보드(main board, mother board): IC 칩들, 메모리 모듈 등 주요 장치가 부착되며 대표적으로 CPU, GPU, 메인 메모리 모듈, 확장 보드가 포함된다.
그 외 전원 장치, CD와 같은 광 저장장치, HDD, SSD, 입출력 장치 등이 모두 하드웨어에 속한다.
CPU(Central Processing Unit)는 프로세서(processor)라고도 불리며 컴퓨터에서 발생하는 실행과 처리를 담당한다. 일반적으로 컴퓨터의 성능은 CPU의 영향을 크게 받는다. CPU가 한 번에 처리하는 데이터를 단어(word)라고 표현하며, 크기에 따라 32-bit, 64-bit 등으로 분류된다.
주기억장치(main memory)는 CPU가 처리할 데이터를 일시적으로 저장하는 공간으로 빠른 읽기/쓰기가 가능하다. 보조저장장치(auxiliary storage device, 2차 기억장치)는 영구적으로 데이터를 저장할 수 있지만, 속도가 느리고 CPU가 별도의 제어기를 통해 접근해야 한다. 최근 사용되는 SSD(solid-state drive)가 보조기억장치에 속한다.
기계어
우리가 사용하는 대부분의 프로그래밍 언어는 고수준(high-level) 언어이다. 예를 들어, C lang은 컴파일러(compiler)를 통해 어셈블리어(assembly language)로 번역된다. 어셈블리어는 니모닉(mnemonics)을 활용한 대표적인 저수준(low-level) 언어이며 어셈블러(assembler)를 통해 기계어로 번역된다. 여기서 기계어는 CPU가 이해할 수 있는 0, 1의 조합으로 이루어진 형태이다. 정리하면 아래와 같다.
*니모닉: CPU가 수행하는 명령을 쉽게 추상화한 표현. 예를 들어, 데이터 불러오기를 'LOAD'로, 더하기 연산을 'ADD'로 표현한다.
고수준 언어 → 어셈블리어 → 기계어
기계어의 명령어 형식을 살펴보면 연산 코드와 오퍼랜드로 구성된다. 연산 코드(operation field)는 CPU가 수행할 명령을 나타내며, 오퍼랜드(operand field)는 데이터의 주소를 나타낸다.
연산 코드 | 오퍼랜드1 | (오퍼랜드2) |
mov ebx, eax
위 코드는 eax를 eba에 복사(mov)하는 명령이다.
시스템 버스
시스템 버스(system bus)는 CPU와 다른 요소들이 데이터와 신호를 교환하는 물리적인 통로이다. 구체적으로는 아래와 같은 서브 버스(sub-bus)를 가진다.
- 주소 버스(address bus): 데이터의 주소를 전달하는 선들이다. 따라서 주소 선의 개수는 CPU가 접속할 수 있는 최대 기억 장치의 수를 의미한다. 추가로 주소를 표현하는 비트 수는 폭(width)이라고 표현한다. 또한 CPU에서 단방향으로 통신한다.
- 제어 버스(control bus): 메모리 읽기/쓰기 신호나 IO 등 신호 등을 전달해 시스템 내 동작을 제어한다.
- 데이터 버스(data bus): CPU가 다른 요소들과 데이터를 주고받는 역할을 한다. 따라서 양방향 통신을 한다.
예시: CPU - 키보드 통신
CPU는 I/O 장치에 직접 접근하지 않고 제어기(controller, interface)를 통해 접근한다.
// 키보드
WHEN `key`가 눌림
데이터 레지스터에 입력한 `key` 저장
상태 레지스터 1(입력 상태)로 변경
// CPU
상태 레지스터 읽기
IF 상태 레지스터가 1(입력 상태) THEN
데이터 레지스터 읽기
위 과정을 반복하며 키보드에 입력된 값을 CPU로 불러온다. 보조저장장치도 유사한 방식으로 데이터를 주고받지만 키보드와 달리 한 번에 많은 양(블록 단위)의 데이터가 오간다. 따라서, 제어기 내부에 데이터를 저장할 수 있는 디스크 버퍼(disk buffer)를 가지기도 한다.