폰 노이만 구조 (Von Neumann Architecture)
현대 컴퓨터는 대부분 "폰 노이만 구조"를 따른다. 이는 CPU, 메모리, 입출력장치, 저장장치가 버스로 연결된 구조로, 하드웨어는 그대로 두고 작업을 위한 프로그램만 교체하여 메모리에 올리는 방식으로 동작한다. 폰 노이만 구조에서 가장 중요한 개념은 바로 "모든 프로그램은 메모리에 올라와야 실행할 수 있다"는 것이다. 저장장치에 있는 프로그램을 실행하기 위해서는 프로그램이 메모리에 올라와야 하는 것이다.
운영체제 또한 프로그램이기에 메모리에 올라와야 실행할 수 있다. 컴퓨터의 전원을 켰을 때 운영체제를 메모리에 올려서 실행해야 하는데 이를 "부팅(Booting)"이라고 한다. 부팅 과정은 다음과 같이 이루어진다.
- 사용자가 컴퓨터의 전원을 켜면 롬(ROM)에 저장된 바이오스(BIOS)가 실행된다.
- 바이오스는 주요 하드웨어가 제대로 작동하는지 확인하고 하드디스크의 마스터 부트 레코드(MBR)에 저장된 프로그램을 메모리에 가져와 실행한다. 이때 마스터 부트 레코드에는 운영체제를 실행하기 위한 "부트스트랩(Bootstrap)"이 저장되어 있다.
- 부트스트랩 코드는 운영체제 커널의 위치를 찾고, 커널을 메모리에 올린다.
컴퓨터 성능 향상 기술
운영체제와 관련된 컴퓨터 성능 기술에 대해서 알아보도록 하겠다.
버퍼 (Buffer)
버퍼(Buffer)란 두 장치 사이의 속도 차이를 완화하는 역할을 담당하는 임시 저장 공간이다. 입출력장치에서 데이터를 읽을 때마다 전송하면 작업량에 비해 실제 전송되는 양은 적은데, 일정량의 데이터를 모아 한 번에 전송하면 적은 작업량으로도 많은 데이터를 전송할 수 있다. 이렇게 일정량의 데이터를 모아서 옮김으로 속도 차이를 완화할 수 있다.
CPU와 입출력장치가 독립적으로 동작하도록 고안된 소프트웨어적인 버퍼를 스폴(SPOOL)이라고 한다. 버퍼 중에서 앞으로 사용할 것을 미리 가져와(Prefetch) 속도를 향상시키는 장치를 캐시(Cache)라고 한다. 캐시에 원하는 데이터가 있으면 캐시 히트(Cache Hit), 캐시에 원하는 데이터가 없으면 캐시 미스(Cache Miss)라고 하며, 캐시 히트가 되는 비율을 캐시 적중률(Cache Hit Ratio)라고 한다. 컴퓨터의 성능을 향상 시키기 위해서는 캐시 적중률을 높여야 한다.
저장장치 계층 구조 (Storage Hierarchy)
컴퓨터 성능을 향상시키기 위해서는 다음의 방법을 사용할 수 있다.
- 느린 하드디스크 대신 SSD와 같이 빠른 플래시 메모리를 저장장치로 사용한다.
- 메모리를 하드디스크 크기만큼 확장한다.
- 캐시를 크게 늘려 캐시 적중률을 높인다.
다만, 위의 방법들은 비용이 많이 들기에 가격과 성능 사이의 타협점을 찾는데 이떄 저장장치의 계층 구조를 적용하면 적당한 가격으로 빠른 속도와 큰 용량을 동시에 얻을 수 있다. 저장장치의 계층 구조는 속도가 빠르고 값이 비싼 저장장치를 CPU 가까이 두고, 값이 싸고 용량이 큰 저장장치를 반대쪽에 배치하는 방법이다. 다만, 저장장치 계층 구조 방식은 중복되는 데이터의 일관성을 유지하는 것이 어렵다.
인터럽트 (Interrupt)
현대 컴퓨터에는 연결된 주변 장치가 많기에 CPU가 모든 입출력에 관여할 경우 작업 효율이 매우 떨어지게 된다. CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영하는 인터럽트(Interrupt) 방식은 이 문제를 해결한다. 인터럽트 방식은 다음과 같이 동작한다.
- CPU가 입출력 관리자에게 입출력 명령을 보낸다.
- 입출력 관리자는 명령받은 데이터를 메모리에 가져다 놓거나 메모리에 있는 데이터를 저장장치로 옮긴다.
- 데이터 전송이 완료되면 입출력 관리자는 CPU에 완료 신호를 보낸다.
입출력 관리자가 CPU에 보내는 완료 신호를 인터럽트라고 하며, CPU는 입출력 관리자에게 작업 지시를 내리고 다른 일을 하다가 완료 신호를 받으면 하던 일을 중단하고 옮겨진 데이터를 처리한다.
직접 메모리 접근 (DMA: Direct Memory Access)
메모리는 CPU만 접근 권한을 가지고 있는 공간이기에 입출력 관리자는 접근이 불가능하다. "직접 메모리 접근(DMA)" 권한이 있어야만 입출력 관리자는 CPU의 관여 없이 작업을 완료할 수 있다.
메모리 맵 입출력 (MMIO: Memory Mapped I/O)
직접 메모리 접근은 인터럽트 방식에 있어 필수적이나, 직접 메모리 접근을 사용하는 경우 메모리가 복잡해진다. 이를 해결하기 위해 CPU가 사용하는 메모리 공간과 직접 메모리 접근을 통해 드나드는 데이터를 위한 공간을 분리한다. 이와 같이 메모리의 일정 공간을 입출력에 할당하는 기법을 "메모리 맵 입출력(MMIO)"라고 한다.
사이클 훔치기 (Cycle Stealing)
CPU와 직접 메모리 접근이 동시에 이루어지는 경우. CPU의 작업 속도보다 입출력장치의 속도가 느리기에 CPU가 메모리 권한을 양보한다. CPU 입장에서 직접 메모리 접근이 자신의 사이클(순서)을 훔쳐간 것이기에 이를 "사이클 훔치기(Cycle Stealing)"라고 한다.
멀티 프로세싱 (Multi Processing)
과거의 컴퓨터는 프로세스가 하나 달린 "단일 프로세서 시스템(Single Processor System)"이었다. 단일 프로세서 시스템에서 프로세서 하나는 한 번에 하나의 작업만을 처리할 수 있었다. 단일 프로세서 시스템에서 성능을 향상하는 방법은 CPU의 클록을 높이거나 캐시의 크기를 높이는 것인데, 이는 개발 난이도도 높고 비용도 높다는 문제가 있다.
이를 해결하기 위해 CPU 핵심 기능을 가진 코어를 여러 개 만들거나 동시에 실행 가능한 명령의 개수를 늘렸다. 이와 같이 프로세서를 여러 개 설치하여 사용하는 시스템을 "멀티 프로세서 시스템(Multi Processor System)"이라고 한다. 멀티 프로세서 시스템은 프로세서마다 레지스터와 캐시를 가지고 모든 프로세서가 시스템 버스를 통해 메인메모리를 공유하기에 많은 작업을 동시에 실행할 수 있다. 현대 CPU에서는 하나의 칩에 멀티코어와 멀티쓰레드를 한꺼번에 구현한다.
멀티코어 시스템 (Multi-Core System)
단일 프로세서 시스템에서 멀티 프로세서 시스템으로 변경하기 위해서는 많은 변화가 필요하다. 기존 시스템을 유지하며 멀티 프로세싱을 하기 위해서는 "멀티코어 시스템(Multi-Core System)"을 활용할 수 있다.
멀티코어 시스템은 하나의 칩에 CPU의 핵심이 되는 코어를 여러 개 만들어 여러 작업을 동시에 처리하는 것이다. 컴퓨터의 견적을 짤때, CPU를 보면 2코어(듀얼코어), 4코어(쿼드코어), 6코어(헥사코어), 8코어(옥타코어) 등의 단어를 쉽게 볼 수 있는데, 바로 멀티코어 시스템에서 비롯된 개념들이다.
CPU 멀티쓰레드 (CPU Multi-Thread)
멀티 프로세싱을 하는 또다른 방법으로 하나의 코어에서 2개 이상의 명령어를 처리하는 "명령어 병렬 처리(Instruction Parallel Processing)"도 있다.
CPU가 처리할 수 있는 작업의 단위를 "쓰레드(Thread)"라고 하는데, 하나의 코어가 여러 개의 쓰레드를 동시에 처리하는 방식을 "CPU 멀티쓰레드(CPU Multi-Thread)"라고 한다. 멀티쓰레드 방식은 병렬 처리를 향상시키는데 있어 중요한 역할을 한다. 이렇게 명령어 병렬 처리를 사용하면 코어는 하나이나 2개 이상의 명령어가 거의 동시에 처리되기에 코어가 2개 이상인 것처럼 보이게 된다.