이번 포스팅에서는 컴퓨터 시스템 구조에 대해 알아보겠습니다.
컴퓨터 시스템 4가지 구성요소

컴퓨터 시스템 구조는 하드웨어, 운영체제, 프로그램, 사용자로 나눌 수 있습니다.
- 하드웨어: 기본적인 컴퓨팅 자원을 제공 → CPU, Memory, I/O 등..
- 운영체제: 하드웨어와 소프트웨어의 중간자 역할
- 프로그램: 특정 작업을 수행하도록 설계된 소프트웨어 프로그램
- 사용자: 컴퓨터를 사용하는 이용자
컴퓨터 시스템 구성
컴퓨터 하드웨어 관점에서 컴퓨터 시스템 구성을 보면 다음과 같습니다.

컴퓨터는 외부 장치에서 내부 장치로 데이터를 읽어와 각종 연산을 수행한 후, 그 결과를 외부에 보냅니다. 이 과정에서 CPU(중앙처리장치)와 각 장치(Device)들은 메모리를 사용하기 위해 서로 경쟁하게 됩니다. 이제 각 요소에 대해 구체적으로 알아보겠습니다.
CPU는 작업을 처리하기 위해 끊임없이 메모리에 접근해서 명령어와 데이터를 읽고, 처리한 결과를 다시 메모리에 쓰며 작업을 처리합니다. 만약 작업을 하는 중간에 인터럽트 라인(Interrupt line)에 신호가 들어오면 하던 작업을 멈추고, 인터럽트(Interrupt)와 관련된 작업을 먼저 처리합니다.
Note
인터럽트(Interrupt)에 대해서는 뒷부분에서 자세히 다룹니다.
Timer는 특정 프로그램이 CPU를 독점하는 것을 방지하기 위해, 정해진 시간이 흐른 뒤 운영체제에게 CPU 제어권이 넘어가도록 인터럽트를 발생시킵니다. 또한, Mode Bit를 활용하여 사용자 프로그램의 잘못된 수행이 다른 프로그램 및 운영체제에 피해가 가지 않도록 보호합니다. mode bit 값이 1로 설정되어 있다면 사용자 모드로 사용자 프로그램을 수행할 수 있고, 0으로 설정되어 있다면 커널 모드로 특권 명령을 사용할 수 있습니다. 인터럽트나 예외(Execption)가 발생하면 사용자 모드에서 커널 모드로 전환하기 위해 하드웨어가 mode bit를 0으로 바꾸고, 인터럽트나 예외 처리가 끝나면 커널 모드에서 사용자 모드로 돌아오기 위해 mode bit를 1로 바꿉니다.
하지만 컴퓨터는 CPU와 메모리만으로는 완전한 역할을 할 수 없습니다. 디스크에서 파일을 읽어오고 키보드 입력을 받으며 모니터로 결과를 출력해야하는데, 각 장치는 장치 컨트롤러(Device Controller)를 통해 CPU 및 메모리와 데이터를 주고받습니다.
Tip (용어 정리)
장치 컨트롤러(Device Controller): 각 장치를 제어하는 일종의 작은 CPU → Hardware
장치 드라이버(Device Driver): 운영체제 코드 중 장치별 처리 루틴 → Software
원칙적으로 메모리는 CPU만 직접 접근할 수 있습니다. CPU 외의 장치가 메모리의 데이터를 읽거나 쓰려면 인터럽트를 발생시켜, CPU가 컨트롤러의 로컬 버퍼와 메모리 사이에서 데이터를 옮겨 주어야 합니다. 그러나 CPU가 잦은 인터럽트를 처리하면 오히려 비효율적이므로, 이를 보완하기 위해 CPU를 거치지 않고도 메모리에 직접 접근할 수 있는 DMA(Direct Memory Access) 컨트롤러를 도입합니다. DMA를 사용하면 메모리를 블록 단위로 전송하고, 전송이 완료된 시점에 한 번만 인터럽트를 발생시켜 CPU에게 작업 완료를 알립니다. 이로 인해 인터럽트 발생 빈도가 크게 줄어들어 CPU를 더욱 효율적으로 활용할 수 있습니다. 다만, CPU와 DMA가 동시에 메인 메모리에 접근할 수 있기 때문에 어느 쪽이 우선 권한을 가질지 메모리 컨트롤러(Memory Controller)가 조정해야합니다.
인터럽트(Interrupt)
위에서 인터럽트에 대해 많이 언급했지만 제대로 정리를 하지 않았습니다. 이제 인터럽트 개념에 대해서 자세히 설명드리겠습니다. 인터럽트(Interrupt)는 CPU가 프로그램을 구동 중일 때, 입출력이나 예외 상황이 발생하여 처리가 필요하여 CPU에게 신호를 보내는 동작입니다. 인터럽트는 인터럽트 서비스 루틴(ISR)1으로 제어를 전송하고, 인터럽트에 중단된 명령어 주소를 반드시 인터럽트 벡터2에 저장해야합니다.
운영체제가 인터럽트를 처리하는 과정은 다음과 같습니다.
- 현재 실행 중인 프로그램의 레지스터와 프로그램 카운터를 저장합니다. → CPU 상태 보존
- 발생한 인터럽트 유형을 결정하여, 해당 인터럽트를 처리하기 위한 적절한 핸들러로 제어를 넘깁니다.
Interrupt Handling
인터럽트 핸들러 시스템에는 벡터 인터럽트 시스템과 폴링 시스템이 있습니다.
- 벡터 인터럽트 시스템(Vector Interrupt System): 각각의 인터럽트를 미리 만들어 놓고, 인터럽트가 왔을 때 그 인터럽트에 맞는 미리 만들어 놓은 인터럽트를 찾아 처리하는 방식입니다.
- 장점: 인터럽트 처리가 빠릅니다.
- 단점: 많은 하드웨어 자원이 필요합니다.
- 폴링 시스템(Polling System): CPU가 주기적으로 각 장치의 상태를 체크하여 어떤 장치가 인터럽트를 요청했는지 확인하는 방식입니다.
- 장점: 간단한 구현과 빠른 응답을 제공합니다.
- 단점: 자원(CPU) 낭비가 있고, 빠른 I/O장치와 짧은 I/O 서비스 루틴이 필요합니다.
Interrupt Comparison
인터럽트에는 외부 인터럽트와 내부 인터럽트가 있습니다.
외부 인터럽트는 비동기, 하드웨어 장치에 의해 발생하는 인터럽트로 프린터가 ‘준비 완료’, ‘용지 부족’ 등의 상태 변경을 알리는 인터럽트가 외부 인터럽트에 해당합니다.
내부 인터럽트는 Falut, Trap, Abot가 있습니다.
Fault- 프로세스가 비정상적인 상황(Page Fault, Divide by Zero 등)을 만나면, 인터럽트를 발생하고 처리 뒤 원래 명령을 다시 실행합니다.
- 동작과정: 현재 명령어 → ISR → ISR 전의 명령어로 돌아감
Trap- 사용자가 의도적으로 인터럽트를 발생시키는 행위로, 인터럽트를 발생하고 처리 후 다음 명령어를 실행합니다.
- 동작과정: 현재 명령어 → ISR → 트랩된 명령어의 다음 명령어로 돌아감
- ex) System Call3
Abort- 복구할 수 없는 예외가 발생하여 종료하는 인터럽트입니다.
- ISR → 현재 작업을 중단
- ex) 하드웨어 오류
References
[2] Operating System Concepts(Silberschatz, Galvin and Gagne)