📌 Index
- 컴퓨터 시스템 구조
- 입출력(I/O)의 수행
- 인터럽트(Interrupt)
✔️ 컴퓨터 시스템 구조(System Structure)
컴퓨터 시스템의 구조는 CPU, Memory, Device Controller, DMA Controller, Timer로 이루어져있다.
컴퓨터 내부 장치인 CPU와 메모리, 그리고 컴퓨터 외부 장치(입출력 장치)인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구분된다. 컴퓨터는 외부 장치에서 내부 장치로 데이터를 읽어와 (input) 각종 연산을 수행한 후, 그 결과를 외부 장치로 내보내는(output) 방식으로 업무를 처리한다.
CPU
CPU는 매 클럭(Clock Cycle) 마다 메모리에서 명령(Instruction)을 하나 씩 읽어와 실행시키는 역할을 한다. I/O가 일어나면 CPU가 직접 접근하지 않고 Device Controller에게 시킨다. 이와 같이 디바이스 컨트롤러에게 시키는 이유는 디바이스 속도가 CPU에 비해 매우 느리기 때문이다.
- 접근 범위 : CPU는 메인 메모리와 Local Buffer에 접근이 가능하다.
- 인터럽트 라인 (Interrupt Line) : CPU가 자신의 작업을 하던 도중 인터럽트 라인에 신호가 들어오면, 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리한다.
- 레지스터 (Register) : CPU 내에 메모리보다 더 빠르게 정보를 저장할 수 있는 작은 공간이다. CPU는 PC 레지스터가 가리키는 메모리 위치에서 인스트럭션을 읽어서 수행한다.
- PC (Program Counter) 레지스터 : 메모리 주소를 가리키는 레지스터
- Mode bit : CPU에서 실행되는 것이 운영 체제인지 사용자 프로그램인지 구분해주는 역할을 한다. 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 OS에 피해가 가지 않도록 하기 위한 보호 장치이다.
- 1 (사용자 모드) - 사용자 프로그램 : 사용자 프로그램이 CPU를 가질 때는 제한된 인스트럭션만 실행시킬 수 있다. 만약 Mode bit가 없다면 사용자 프로그램에서 하드웨어를 직접 접근하여 보안에 취약해 질 수 있다.
- 0 (커널 모드, 모니터 모드) - 운영 체제 : 운영 체제가 CPU에서 실행 중일 때는 모든 인스트럭션을 실행할 수 있다.
- Exception 이나 Interrupt 발생 시, 하드웨어가 mode bit을 0으로 세팅
- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 세팅
Memory
메모리는 CPU가 직접 접근할 수 있는 내부 기억 장치로서, 특정 프로그램이 CPU에서 실행되려면 해당 부분이 메모리에 올라가 있어야 한다. 운영 체제는 컴퓨터가 부팅되었을 때 메모리에 올라가 있는데, 메모리에 상주하고 있는 CPU의 작업 공간을 Main Memory라고 부른다.
메모리는 전자회로에서 데이터나 상태, 명령어 등을 기록하며, 보통 RAM(Random Access Memory)를 일컬어 메모리라고도 한다. CPU는 계산을 담당하고, 메모리는 기억을 담당한다.
공장에 비유하자면 CPU는 일꾼이고, 메모리는 작업장이며, 작업장의 크기가 곧 메모리의 크기이다. 작업장이 클 수록 창고에서 물건을 많이 가져다 놓고 많은 일을 할 수 있듯이 메모리가 크면 클수록 많은 일을 동시에 할 수 있다.
Device Controller
디바이스 컨트롤러(Device Controller)는 컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU를 말한다. 디바이스 컨트롤러는 I/O 작업이 끝났을 경우, 인터럽트를 통해 CPU에게 그 사실을 알린다.
- Local Buffer : 데이터를 임시로 저장하기 위한 디바이스 컨트롤러의 작업 공간이다.
- Disk : 데이터를 메모리로부터 읽어들이기도 하고(Input), 처리 결과를 File System에 저장(Output)하기도 한다. Disk의 내부를 통제하는 것은 CPU가 아니라 controller이다.
DMA Controller
원칙적으로 메모리는 CPU에 의해서만 접근할 수 있는 장치이다. CPU 외의 장치가 메모리의 데이터에 접근하기 위해서는, CPU에게 인터럽트 발생시키고, CPU가 대신 컨트롤러의 로컬 버퍼와 메모리 사이에서 데이터를 옮겨 준다. 그러나, 작업 처리 속도가 매우 빠른 CPU가 인터럽트를 많이 당하면 비효율적이기 때문에 CPU 이외에 메모리 접근이 가능한 DMA(Direct Memory Access) 컨트롤러를 둔다.
DMA를 사용하게 되면 로컬 버퍼에서 메모리로 읽어오는 작업을 CPU 대신 수행해 줄 수 있다. 이때,
DMA는 바이트 단위가 아니라 블록이라는 큰 단위로 정보를 메모리로 읽어온 후에 인터럽트를 발생시켜서 작업 완료 신호를 CPU에게 보낸다. 즉 작업 완료 후, 로컬 버퍼의 내용을 DMA가 직접 메모리로 복사 후, CPU를 인터럽트한다. 이러한 방식으로 CPU에 발생하는 인터럽트의 빈도를 줄여 CPU를 효울적으로 이용할 수 있다.
다만, CPU와 DMA가 동시에 메인 메모리에 접근할 수 있다는 문제점이 있어서, 누가 메모리에 먼저 접근하게 만들지 Memory Controller가 교통 정리하는 역할을 한다.
Timer
타이머(Timer)는 몇 초 안에는 작업이 끝나야 한다는 것을 정하고, 특정 프로그램에 시간 제한을 다는 역할을 한다. 시간이 많이 걸리는 프로그램이 작동할 때 제한을 걸기 위해 존재한다.
예로 사용자 프로그램에서 While 문으로 무한 루프를 돌게 된다면, 특정 프로그램이 CPU를 독점하는 상황이 발생할 수 있다. 이와 같이 특정 프로그램이 CPU를 독점하는 것을 막기 위해, 시간을 제한 하기 위해 존재하는 것이 바로 타이머(Timer)이다.
컴퓨터를 시작하면 처음에 운영체제가 CPU를 가지고 있다가 사용자 프로그램에게 CPU를 넘겨준다. 이때, 그냥 넘겨주지 않고 Timer에 값을 세팅한 후 CPU를 넘겨 주게 된다. 시간이 지나 Timer값이 0이 되면, 타이머 인터럽트가 발생하여 다른 프로그램에게 CPU를 넘겨준다.
✔️ 입출력(I/O)의 수행
모든 입출력 명령은 운영 체제만 사용할 수 있는 특권 명령으로만 가능하다. 사용자 프로그램은 시스템 콜을 통해 I/O를 수행한다.
시스템 콜
시스템 콜이란, 운영체제가 커널에 접근하기 위한 인터페이스로, 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용한다. 즉, 시스템 콜은 운영 체제에게 I/O를 요청하는 것을 말한다.
사용자 프로그램이 I/O 요청으로 트랩(trap)을 발동하면, 올바른 I/O 요청인지 확인한 후 유저 모드가 시스템 콜을 통해 커널 모드로 변환되어 실행된다. 이때 시스템 콜 작동 시, modebit을 참고하여 유저 모드와 커널 모드를 구분한다. 유저 모드일 경우, 반드시 시스템 콜을 통해 커널 모드로 변경된 상태에서 시스템 자원을 쓰게 된다. 수행 과정을 정리하면 다음과 같다.
수행 과정
- 사용자 프로그램의 I/O 요청으로 트랩(trap) 발동
- 올바른 I/O 요청인 지 확인
- modebit을 통해 유저 모드(1)와 커널 모드(0)를 구분
- 시스템 콜을 통해 유저 모드를 커널 모드로 변환하여 실행
다만, mode bit가 1인 상태로 사용자 프로그램이 실행되고 있다가 I/O를 해야 하는 상황이 오면 바로 OS의 주소로 점프를 할 수가 없다. 따라서 프로그램이 직접 인터럽트 라인을 세팅 한 후, CPU에게 인터럽트를 보내면, CPU는 다음 인스트럭션을 수행하는 대신 mode bit를 0으로 바꾸고 CPU 제어권을 OS로 넘기게 된다. 이러한 방식으로 사용자 프로그램이 OS에게 I/O 요청을 보낼 수 있다.
✔️ 인터럽트(Interrupt)
인터럽트(Interrupt)란 어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키는 것을 말하며, 키보드, 마우스 등 I/O 디바이스로 인한 인터럽트, 0으로 숫자를 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생한다. 인터럽트가 발생되면 인터럽트 핸들러 함수가 모여있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수가 실행된다.
- 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주로를 가지고 있는 것으로, (인터럽트 번호, 주소)의 쌍을 가지고 있다.
- 인터럽트 처리 루틴(인터럽트 핸들러) : 해당 인터럽트를 처리하는 커널 함수로, 인터럽트 벡터에서 실제 처리해야할 코드이다.
인터럽트 처리 루틴을 통해 해당 인터럽트 처리를 완료하고 나면, 원래 수행하던 작업으로 돌아갈 위치를 알아야 하므로, 인터럽트 처리 전에 수행 중이던 작업이 무엇이었는지 반드시 저장해야한다. 이러한 정보를 저장하기 위해 운영 체제는 PCB라는 공간을 별도로 가지고 있다.
하드웨어 인터럽트 vs 소프트웨어 인터럽트
인터럽트는 하드웨어 인터럽트, 소프트웨어 인터럽트 두 가지로 나뉜다.
- 하드웨어 인터럽트 : I/O 디바이스에서 발생하는 인터럽트로, 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트를 세팅한다.
- 소프트웨어 인터럽트 : 트랩(trap)이라고도 하며, 프로세스 오류 등으로 프로세스가 시스템 콜을 호출할 때 발생하는 인터럽트로, 소프트웨어가 CPU 인터럽트 라인을 세팅한다.
CPU 인터럽트 라인에 신호를 보내서 인터럽트를 알려주는 방식은 동일하다.
Reference