컴퓨터 시스템은 하드웨어와 소프트웨어로 구성되어 있습니다.
"컴퓨터 구조"는 하드웨어를 구성하는 각 장치의 특성과 동작 원리를 다루는 학문입니다.
하드웨어와 관련된 여러 장치와 개념을 알아보겠습니다.
01. 하드웨어 구성
하드웨어는 "중앙처리장치", "기억장치", "입출력장치"로 구성되어 있으며, 각 장치는 "시스템 버스(System Bus)"로 연결되어 있습니다. 컴퓨터는 데이터를 입력받아 저장한 상태에서 이를 처리한 후 출력하는 일을 합니다.
1) 시스템 버스
시스템 버스는 컴퓨터에 있는 중앙처리장치, 주기억장치, 입력장치, 출력장치 간 데이터를 서로 주고 받기 위해 사용되는 경로입니다. 시스템 버스는 데이터가 이동하는 길인 만큼 선의 폭이 넓을수록 한 번에 전송할 수 있는 데이터 양도 많아집니다. 즉, 데이터 전송 속도와 버스의 대역폭은 밀접한 연관이 있고, 버스의 크기나 데이터 전송 속도는 시스템 성능을 좌우합니다.
시스템 버스는 전송되는 데이터 종류에 따라 "데이터 버스", "주소 버스", "제어 버스"로 나뉩니다.
중앙처리장치와 다른 장치(주기억장치, 입출력장치 등) 사이 또는 중앙처리장치 내부의 모듈들 사이에서 데이터가 이동하는 경로입니다.
(2) 주소 버스
중앙처리장치가 사용하고자 하는 데이터의 주소가 이동하는 경로입니다. 주소 버스의 비트 수, 즉 버스의 대역폭이 주기억장치의 용량을 결정합니다.
(3) 제어 버스
중앙처리장치가 기억장치나 입출력장치에 제어 신호를 전달하는 통로입니다. 중앙처리장치에서 발생하는 제어 명령이나 상태 신호가 이 버스를 통해 이동합니다.
2) 폰 노이만 구조
초창기 개발 컴퓨터에는 소프트웨어가 존재하지 않아 인간이 외부에서 배선들을 직접 연결해 프로그램을 세팅했습니다. 이 방식을 "하드와이어드 프로그래밍"이라고 합니다. 이 방식의 프로그래밍은 복잡한 문제를 해결하기 어려웠고 이로 인해 폰 노이만의 "내장형 프로그램 개념"이 고안되었습니다. 폰 노이만의 내장형 프로그램 개념으로 설계된 컴퓨터를 "폰 노이만 구조" 라고 합니다.
폰 노이만 구조는 중앙처리장치, 주기억장치, 입력장치, 출력장치가 버스로 연결되어 있는 형태입니다. 하드웨어는 그대로 둔 채 주기억장치에서 작업용 프로그램만 교체해 실행하는 방식입니다. 그렇기에 폰 노이만 구조는 모든 프로그램이 주기억장치에 올라와야 실행이 가능한 구조입니다.
폰 노이만 구조에서의 프로그램 작성 방식과 로딩 과정
- C, Java, Python 등 고급 프로그래밍 언어로 프로그램 소스코드를 작성한다.
- 컴파일러와 어셈블러 등을 이용해 고급 프로그래밍 언어로 작성된 소스 프로그램을 기계어 프로그램으로 변환한다.
- 사용자의 프로그램 실행 명령을 통해 보조기억장치에 저장된 기계어 프로그램을 주기억장치로 로드한다.
- 주기억장치로 로딩된 프로그램의 명령어 하나하나가 폰 노이만 구조에 따라 수행된다.
02. 중앙처리장치(CPU)
1) 중앙처리장치 구성
중앙처리장치는 기계어로 된 명령어들을 해독한 후 해당 명령어를 수행하기 위한 세부 작업을 실행하는 장치입니다.
3개의 세부 모듈인 "연산 장치", "제어 장치", "레지스터"로 구성되어 있으며 이들은 각각 "내부 버스"로 연결되어 있습니다.
(1) 연산 장치
연산 장치는 중앙처리장치 내부에서 실제 연산을 담당합니다. 산술 연산과 논리 연산을 수행합니다.
- 산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈 등 사칙 연산을 진행합니다. 가산기를 만들어 다양한 사칙 연산을 수행합니다.
- 논리 연산: 논리 회로를 통해 논리곱(AND), 논리합(OR), 부정(NOT) 등을 수행합니다. 2진수인 0과 1을 사용합니다.
(2) 제어 장치
제어 장치는 명령어가 순서대로 실행되도록 제어하는 장치이다. 수행할 명령어를 해독한 후 명령어 수행에 필요한 제어 신호를 생성한다. 메모리에 'Write'' 제어 명령을 보내어 중앙처리장치 내부에 있는 데이터를 주기억장치에 저장하는 일을 한다. 중앙처리장치 내부의 다른 모듈, 외부 장치의 제어를 담당한다.
(3) 레지스터
프로그램 실행에 사용되는 모든 데이터는 "주기억장치"에 저장되는데, 하드디스크 등의 보조기억장치에 있는 데이터를 처리하려면 데이터를 주기억장치로 로딩해야 합니다. 그런데 실행 자체가 중앙처리장치 내부에서 이루어지기에 주기억장치에 있는 데이터 또한 중앙처리장치 내부에 다시 저장해야 합니다.
그 때 저장되는 장소가 "레지스터" 입니다. 즉, 레지스터는 중앙처리장치 내부의 저장장치입니다. 중앙처리장치 내부 상태를 저장하는 목적으로 사용됩니다.
2) 중앙처리장치 동작
중앙처리장치는 3단계인 인출 단계, 해독 단계, 실행 단계로 구성된 동작을 반복하며 명령어를 실행합니다.
한 명령어의 실행이 끝나면 다시 다음 명령어에 대한 인출 단계를 시작합니다.
- 인출 단계: 주기억장치에 저장된 명령어 하나를 읽어온다.
- 해독 단계: 읽어 온 명령어를 제어 정보로 해독한다.
- 실행 단계: 해독된 명령어를 실행한다.
3) 중앙처리장치 관련 용어
(1) 클록 펄스
클록은 컴퓨터에서 일정한 박자를 만들어 내는 장치인데, 클록이 일정한 간격으로 만드는 틱을 펄스라고 한다.
클록 펄스란 컴퓨터 내에서 동작하는 각 구성 요소의 모든 동작을 동기화하기 위해 사용하는 전자적 펄스이다.
서로 다른 모듈들이 버스를 통해 데이터를 송수신하려면 모듈 간 동기화가 이뤄져야 하는데 이때 클록 신호가 꼭 필요합니다. 중앙처리장치를 포함한 컴퓨터 내 모든 부품은 클록에 맞춰 동작합니다. 서로 다른 컴퓨터끼리 통신을 해야 할 때도 중요한데, 통신 속도 설정을 고려해야 하기 때문입니다. 즉, 클록 펄스는 컴퓨터 내부의 시계 역할을 합니다.
(2) 인터럽트
인터럽트란 중앙처리장치가 특정한 기능을 수행하던 중 급하게 다른 일을 처리하고자 할 때 사용하는 기능입니다.
컴퓨터는 단일 중앙처리장치이기 때문에 한 번에 한 가지 일만 처리할 수 있습니다. 그렇기 때문에 그래서 어떤 일을 수행하다가 우선순위가 급한 다른 일을 처리해야 하는 상황이 생기면 이를 대처하기 위해 인터럽트가 고안되었습니다.
작업을 수행하던 중 인터럽트가 발생했을 때의 처리과정
- 컴퓨터는 수행하던 일을 중지하고 현재 상태 (CPU 내부의 레지스터 값 등)를 보관한다.
- 발생한 인터럽트를 처리하기 위해 인터럽트 서비스 루틴(ISR)을 수행한다.
- 인터럽트가 처리되면 저장했던 이전 작업의 상태를 복구시켜 수행을 재개한다.
03. 기억장치
기억장치는 속도, 용량 등의 성능에 따라 "레지스터", "캐시메모리", "주기억장치", "보조기억장치"로 나뉩니다.
기억장치를 계층으로 나누는 이유는 전체 비용을 고려했을 때 용량과 접근 속도를 최적화하기 위해서 입니다.
1) 주기억장치 (메인메모리)
컴퓨터는 외부에서 입력 받은 데이터를 가공하고 계산해 외부로 출력하는데, 주기억장치는 외부에서 입력 받은 데이터를 보관하는 역할을 합니다. 즉, 주기억장치는 작업에 필요한 프로그램과 데이터를 저장하는 장소입니다.
주기억장치는 '메인메모리'라는 이름으로 주로 불립니다.
메인메모리는 기능에 따라 램(RAM)과 롬(ROM)으로 나뉩니다.
(1) 램 (RAM)
램은 전원이 끊기면 저장된 내용이 지워지는 휘발성 메모리입니다. 주로 개인용 컴퓨터의 메모리로 사용됩니다.
Random Access Memory를 뜻하는 RAM에서 Random Access, 랜덤 접근은 주소를 지정하면 메인메모리의 어느 곳이든 상관없이 동일한 접근 속도로 데이터를 사용할 수 있다는 것입니다.
램은 크게 디램(DRAM)과 에스램(SRAM)으로 나뉩니다.
- 디램(Dynamic Ram): 동적 램이라고도 부르며 일정 시간이 지나면 저장된 데이터가 사라집니다. 그렇기 때문에 주기적으로 다시 재생시켜 주어야 합니다.
- 에스램(Static Ram): 정적 램이라고도 부르며, 전원이 연결되어 있는 동안에는 데이터를 계속 보관할 수 있습니다. 그렇기 때문에 따로 재생할 필요는 없습니다. 속도가 빠르지만 가격이 비싸다는 단점이 있습니다.
(2) 롬 (ROM)
롬은 전원이 제거되어도 저장된 내용은 지워지지 않는 비휘발성 메모리입니다. 롬 또한 램과 같이 랜덤 접근의 특징을 가지고 있습니다. Read Only Memory를 뜻하는 ROM은 롬 읽기만 가능하고 일반적인 방법으로는 변경할 수 없습니다.
전원이 끊겨도 데이터가 남아 있는 특징을 활용해 컴퓨터를 부팅할 때 수행되어야 하는 "부트스트랩 로더"를 저장합니다. 이때, 부트스트랩 로더란 컴퓨터 전원을 켰을 때 하드디스크 내 운영체제의 시작 부분을 램으로 로드하는 특정 프로그램을 말합니다.
롬은 "마스크롬(Mask ROM)", "피롬(PROM)", "이피롬(EPROM)", "이이피롬(EEPROM)"으로 나뉩니다.
- 마스크롬(Mask ROM): 데이터를 지우거나 쓸 수 없는 ROM입니다.
- 피롬(PROM): 데이터를 한 번만 저장할 수 있는 ROM입니다.
- 이피롬(EPROM): 데이터를 여러 번 쓰고 지울 수 있는 ROM입니다.
- 이이피롬(EEPROM): 데이터를 여러 번 쓸 수 있고 쓰기 전에 저장된 정보는 따로 지울 필요가 없는 ROM입니다.
2) 캐시메모리
캐시메모리는 CPU와 상대적으로 느린 메인메모리 사이에 위치한 장치로, 데이터 접근 효율성을 향상시킵니다. 캐시메모리는 지역성의 원칙을 활용한 메모리인데, 컴퓨터 프로그램은 일반적으로 시간적 지역성과 공간적 지역성의 특징을 가집니다.
- 시간적 지역성: 한 번 사용한 정보는 곧 다시 쓰일 가능성이 높다는 의미입니다.
- 공간적 지역성: 한 번 사용된 정보 영역의 주변부가 다시 사용될 가능성이 높다는 의미입니다.
메인메모리에서 CPU로 로딩되어 사용된 데이터를 캐시메모리에 보관하면 속도가 훨씬 빨라집니다. 이후 같은 데이터를 사용할 땐 메인메모리로 접근하지 않고 캐시메모리 내 데이터를 사용해 메인메모리로 접근하는 횟수를 줄입니다.
CPU가 메인메모리의 데이터를 읽을 때 먼저 캐시메모리를 조사하는데, 이때 캐시메모리에 데이터가 있으면 바로 CPU로 전달하고 없으면 메인메모리에서 데이터를 가져옵니다. CPU에서 원하는 정보가 캐시메모리에 존재하는 상황을 "캐시 적중" 이라고 하고 존재하지 않는 상황을 "캐시 미스"라고 합니다. 원하는 정보가 캐시메모리에 존재할 확률을 "캐시 적중률"이라고 합니다.
결국, 캐시메모리를 사용하는 이유는 메인메모리에 있는 데이터를 더 빠르게 사용하기 위함입니다. (캐시메모리에 원하는 데이터가 없으면 메인메모리까지 가야하기에...) 따라서, 캐시 적중률이 높아야 캐시 메모리를 사용할 때 의미가 있습니다.
3) 보조기억장치
보조기억장치는 CPU가 처리할 데이터나 프로그램을 저장하기 위한 기억장치입니다. 접근 속도가 느리지만 저렴하고 정보를 많이 저장할 수 있기에 필요한 장치 중 하나입니다. 보조기억장치에는 "자기테이프", "자기디스크", "광디스크", "플래시메모리" 등이 있습니다.
(1) 자기테이프
자기테이프는 많은 양의 정보를 기록하기 위해 개발된 테이프 형식의 외부 기억장치입니다. 플라스틱 테이프 표면에 자성체를 바른 형태입니다. 순차접근 방식이기에 대용량의 데이터를 순차적으로 처리해야 하는 작업에 적합합니다. 그때그때 원하는 정보에 바로 접근해야 하는 업무에는 적합하지 않습니다. 따라서 최근에는 많이 쓰이지 않습니다.
(2) 자기디스크
자기디스크는 자성체를 코팅한 원형의 플라스틱이나 금속판 여러 장을 하나의 축에 고정시켜 그 판의 양면에 정보를 저장하는 기억장치입니다. 자기디스크의 종류로는 "하드디스크"와 "플로피 디스크"가 있습니다.
최근에는 USB 메모리나 SSD 저장장치도 많이 보급되고 있습니다. 그러나 대용량의 데이터를 저장할 때는 하드디스크를 많이 사용합니다. 플로피 디스크는 최근에는 거의 사용되지 않습니다.
(3) 광디스크
광디스크는 레이저를 이용한 저장장치로, 정보를 빠르게 읽어내며 대량의 정보를 영구적으로 보존할 수 있습니다.
CD, DVD, 블루레이 디스크 등이 있습니다.
(4) 플래시메모리
플래시메모리는 비휘발성 반도체 기반의 메모리입니다. 속도가 빠르며 크기가 작고 전력소비가 적으며 충격에 강합니다. 플래시메모리는 USB 메모리, 메모리 카드, 디지털카메라, 디지털 캠코더 등에 폭넓게 사용됩니다.
위에서 말했듯이, 최근에는 플래시메모리를 이용한 SSD 사용량이 늘고 있습니다. 플래시메모리의 기본 장점에 소음까지 적기에 휴대용 컴퓨터에 많이 사용됩니다. 다만, 재생 속도와 비교했을 때 기록 속도가 상대적으로 느리고, 기록과 삭제 횟수가 정해져 있어 기대 사용수명이 제한적입니다.
04. 입출력장치
입출력장치는 입력장치와 출력장치를 합쳐서 부르는 말입니다.
1) 입력장치
입력장치는 외부 데이터를 CPU나 메인메모리로 입력할 때 사용하는 장치입니다. 대표적으로 "키보드", "마우스", "스캐너", "조이스틱", "동작인식 기기" 등이 있습니다.
2) 출력장치
출력장치는 CPU나 메인메모리의 정보처리 결과를 인간이 인지할 수 있는 형태로 내보내는 장치입니다. 대표적으로 "모니터", "프린터", "스피커", "3D 프린터" 등이 있습니다.
3) 입출력장치의 제어 방식
입출력장치를 제어하는 방식은 크게 "CPU를 통한 입출력 제어"와 "DMA 방식을 이용한 입출력 제어"로 구분됩니다.
(1) CPU를 통한 입출력 제어
입력과 출력의 전체 과정을 CPU가 수행하는 방식입니다. CPU가 어떤 방식으로 입출력 전 과정을 통제하느냐에 따라 "프로그램에 따른 방법"과 "인터럽트에 따른 방법"으로 나뉩니다.
- 프로그램에 따른 방법: 현재 실행되고 있는 프로그램이 입출력의 전 과정을 직접 수행하는 방식, CPU를 사용하는 해당 프로그램이 입출력 작업에 전적으로 투입됩니다. 그래서 입출력이 이뤄지는 동안 CPU는 다른 작업을 수행할 수 없습니다. CPU의 효율을 떨어뜨리는 원인이 되기도 합니다.
- 인터럽트에 따른 방법: 프로그램에 따른 방법의 비효율성을 인터럽트 기능으로 극복한 방식, 프로그램 중 입출력 명령이 발생하면 CPU는 입출력 동작의 시작을 명령하고 작업을 전환합니다. 그러다 입출력이 완료됨을 알리는 인터럽트가 발생하면, CPU는 관련 인터럽트 서비스 루틴을 수행해 입출력 과정을 종료합니다. 입출력 장치가 전 과정을 마무리할 때까지 기다리지 않고 다른 작업으로 전환하여 효율을 높입니다.
(2) DMA 방식을 이용한 입출력 제어
DMA 방식은 CPU를 통한 프로그램의 실행 없이도 자료가 이동할 수 있게 하는 방식입니다. DMA는 입출력장치와 메인메모리 사이의 데이터 통식으로 입출력 제어를 수행하여 CPU의 효율성을 더욱 높입니다. 입출력장치 제어기는 CPU로부터 입출력의 모든 사항을 위임받아 수행하며, 다른 입출력장치보다 속도가 빠르고 대량의 데이터를 입출력할 때 사용합니다.
05. 병렬 컴퓨터
병렬 컴퓨터란 다수의 CPU를 병렬 처리하여 초고속으로 작업을 수행하는 컴퓨터입니다.
1) 병렬 처리
병렬 처리는 동시에 동작하는 CPU를 여러 대 갖추고 있는 컴퓨터에서만 실행할 수 있는 처리 방식입니다. 프로그램 실행 속도를 높이기 위한 명령어 스트림과 데이터 스트림을 처리하는 방식에 따라 "SIMD", "MIMD", "SISD"로 나뉩니다.
(1) SIMD
SIMD는 모든 CPU가 같은 프로그램을 수행하지만 병렬적으로 다른 데이터를 처리하는 구조로, 가장 일반적인 병렬 연산 기법입니다. 배열이나 행렬 같은 벡터 데이터 연산에서 유용하게 쓰입니다.
(2) MIMD
MIMD는 각각의 CPU가 서로 다른 프로그램을 수행하면서 서로 다른 데이터를 처리하는 구조입니다. 모든 프로그램이 협력하여 하나의 목적을 이룹니다.
(3) SISD
SISD는 하나의 프로그램을 수행할 때 하나의 데이터를 이용해 처리하는 구조입니다. 일반 개인용 컴퓨터의 CPU 대부분이 SISD 구조입니다.
2) 병렬 컴퓨팅 환경
병렬 컴퓨팅 환경은 규모에 따라 "소규모 멀티코어 환경"과 "대규모 병렬 컴퓨팅 환경"으로 나뉩니다.
(1) 소규모 멀티코어 환경: 멀티코어 CPU
멀티코어 CPU: 2개 이상의 코어(기억 소자)를 탑재한 CPU를 의미합니다.
멀티코어 프로세서 상황에서 멀티코어 성능을 최대한 이용하려면 이에 맞는 병렬 프로그래밍 개념을 사용해야 합니다. 즉, 멀티 CPU 또는 멀티 코어 상황을 고려한 프로그래밍을 해야 최신 하드웨어 자원을 충분히 활용할 수 있습니다.
(2) 대규모 병렬 컴퓨팅 환경: 클러스트와 그리드
대규모 병렬 컴퓨팅 환경은 다수의 CPU나 컴퓨터 등을 연결하여 구현하는 시스템으로 클러스터나 그리드 컴퓨팅 등이 있습니다.
- 클러스터: 클러스터는 컴퓨터를 수십 대에서 수만 대까지 연결해 하나의 컴퓨터로 사용하는 환경을 말합니다. 근거리 네트워크(LAN)를 통해 연결된 컴퓨터들이 하나의 대형 멀티프로세서로 동작하는 시스템입니다.
- 그리드 컴퓨팅: 그리드 컴퓨팅은 이종의 리소스들로 구성되어 있으며, 광역 네트워크 기반의 동적인 구조입니다. 네트워크에 연결된 여러 대의 컴퓨터에 데이터를 전송하여 연산하게 한 후, 서버에서 취합해 전체 연산을 수행합니다.