프로그래머는 본인이 만든 프로그램을 실행할 때 무슨 일이 일어나는지 알기 위해서 전형적인 시스템에서의 하드웨어 조직을 이해할 필요가 있다. 아래는 시스템의 하드웨어 조직 구성도이다.
버스(Buses) : 시스템 내를 관통하는 전기적 배선군을 버스라고 하며, 컴포넌트들 간에 바이트 정보들을 전송한다. 일반적으로 워드(word)라고 하는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계된다.
ex) 32bit OS : 4Byte, 64bit OS : 8Byte의 워드 크기를 가짐
입출력 장치(I/O) : 시스템과 외부세계와의 연결을 담당한다. 키보드와 마우스, 디스플레이, 디스크 드라이브 등이 I/O 버스에 연결되어 정보를 주고 받는다.
메인 메모리 : 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치다. 물리적으로 메인 메모리는 DRAM(Dynamic Random Access Memory) 칩들로 구성돼있고, 논리적으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있다.
CPU : 메인 메모리에 저장된 인스트럭션(컴퓨터가 알아들을 수 있는 기계어로 이루어져 있는 명령)들을 해독(실행)하는 엔진으로, CPU의 중심에는 워드 크기의 저장장치(레지스터)인 PC(Program Counter)가 있다. 시스템에 전원이 끊어질 때까지 CPU는 PC가 가리키는 곳의 인스트럭션을 반복적으로 실행하고 PC값이 다음 인스트럭션의 위치를 가리키도록 업데이트 한다. 이 모델에서 인스트럭션들은 규칙적인 순서로 실행되고, 한 개의 인스트럭션을 실행하는 것은 여러 단계를 수행함으로써 이루어진다.
(1) PC가 가리키는 메모리로부터 인스트럭션을 읽어온다.
(2) 이 인스트럭션에서 비트들을 해석하여 인스트럭션이 지정하는 간단한 동작을 실행한다.
(3) PC를 다음 인스트럭션 위치로 업데이트 한다.
적재(Load) -> 저장(Store) -> 작업(Operate) -> 점프(Jump)
적재(Load) : 메인 메모리에서 레지스터에 한 Byte 또는 Word를 이전 값에 덮어쓰는 방식으로 복사한다.
저장(Store) : 레지스터에서 메인 메모리로 한 Byte 또는 Word를 이전 값을 덮어쓰는 방식으로 복사한다.
작업(Operate) : 두 레지스터의 값을 ALU로 복사하고 두 개의 워드로 수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장한다.
점프(Jump) : 인스트럭션 자신으로부터 한 개의 Word를 추출하고, 이것을 PC에 덮어쓰기 방식으로 복사한다.
아래는 앞서 전형적인 시스템 하드웨어 구성에서의 상황별 동작 흐름을 나타낸 그림이다.
<그림 1.5> 키보드에 'hello'를 입력했을 때의 과정
<그림 1.6> 실행파일을 디스크로부터 메인 메모리로 로딩하는 과정
<그림 1.7> 출력 스트링을 메모리에서 화면으로 기록하는 과정
출처 : Computer Systems A Programmer's Perspective(3rd Edition)