0. Introduction

 


1. 컴퓨터 시스템의 구조

 

1.1 컴퓨터의 구조: 내부장치와 외부장치

  • 컴퓨터 시스템의 구조 = 컴퓨터 내부장치 + 컴퓨터 외부장치
    • 컴퓨터 내부장치 : CPU, Memory
    • 컴퓨터 외부장치 : Disk, keyboard, mouse, monitor, network device 등

1.2 컴퓨터의 업무 처리 방식

  • 컴퓨터 외부장치에서 내부장치로 데이터를 읽어와 각종 연산을 수행한 후, 연산 결과를 외부장치로 다시 내보내는 방식으로 업무를 처리한다.
  • 이때, 업무의 각 부분을 다음과 같이 정의한다.
    • 입력(input): 컴퓨터 내부로 데이터가 들어오는 것
    • 출력(output): 컴퓨터 외부장치로 데이터가 나가는 것
      • 입출력(Input-output: I/O): 컴퓨터 시스템이 컴퓨터 외부 입출력 장치들과 데이터를 주고 받는 것
    • 예시)
      • 키보드로부터 입력을 받아 컴퓨터가 연산을 한 후, 그 결과를 모니터에 출력
      • 컴퓨터 외부장치인 디스크에서 내용을 읽어 컴퓨터 내부에 연산을 한 후, 디스크에 데이터를 저장.

1.3 Controller: 각 하드웨어 장치의 작은 CPU

  • 컴퓨터 전체에 CPU(Cetnral Processing Unit)라는 중앙처리장치가 있듯이, 컴퓨터의 각 하드웨어 장치에는 이들을 제어하는 일종의 작은 CPU인 컨트롤러 가 있다.
  • 예)
    • 메모리를 제어하는 컨트롤러는 메모리 컨트롤러
    • 디스크를 제어하는 컨트롤러는 디스크 컨트롤러

 


2. CPU 연산과 I/O 연산

 

2.1 연산 = CPU가 무언가를 한다

  • 컴퓨터에서 연산을 한다 = CPU가 무언가 일을 한다
  • 컴퓨터의 구성장치 관점에서 연산을 나눠 보자면 다음과 같이 담당한다.
    • 입출력 장치들의 I/O 연산 → 입출력 컨트롤러가 담당
    • 컴퓨터 내에서 수행되는 연산 → main CPU
    • 이 때 입출력 장치와 main CPU는 일이 다른 곳에서 발생하므로 동시 수행이 가능하다.

2.2 Local Buffer(로컬 버퍼)

  • 각 장치 컨트롤러는 장치로부터 오고 나가는 데이터를 임시 저장 하기 위한 작은 메모리인 로컬 버퍼(local buffer) 가 존재한다.
  • 입력 장치로부터 데이터를 읽어오는 경우, 각 입력장치의 컨트롤러가 장치에서 로컬버퍼로 데이터를 읽어와서 저장 후, 컴퓨터 내부의 메모리에 전달한다.

2.3 CPU와 I/O 장치의 연산과정

  1. 프로그램에서 데이터를 읽어오라는 명령을 내린다 →
  2. 각 장치의 컨트롤러가 장치로부터 내용을 읽어 로컬버퍼에 저장한다 →
  3. 데이터를 읽는 작업을 완료했기 때문에, 메인 CPU에서 I/O 작업을 요청한 프로그램의 다음 일을 수행할 수 있다. HW 또는 SW는 CPU 옆에 인터룹트 라인(interrup line) 을 세팅하는 명령을 실행하여, 컨트롤러가 인터룹트(interrupt) 를 발생시켜 메인 CPU에게 I/O작업이 완료됨을 알린다 →
  • 인터럽트란 컨트롤러들이 CPU의 서비스가 필요할 때 이를 통보하는 방법
  1. CPU는 명령 하나를 수행할 때마다 인터룹트가 발생했는지 확인하는데, 인터럽트가 발생하면 자신이 하던 일을 멈추고, 인터럽트 처리를 먼저 한 후 멈춘 명령을 다시 수행한다.

 


3. 인터럽트의 일반적 기능

 

3.1 Interrupt(인터럽트)란??

  • 인터럽트(Interrupt)란 CPU의 제어권을 양도하라는 신호

  • 사용자 프로그램에게 CPU 제어권이 있어서, CPU를 사용하고 있다가 interrupt를 발생시키면 kernel에게 CPU가 이양된다.

  • 오늘날 운영체제가 CPU를 점유하는 건 인터럽트에 의하지 않고는 발생하지 않는다.

    • 운영체제는 단지 인터럽트가 발생할 때에만 CPU의 제어권을 획득할 수 있는데,
    • 인터럽트가 발생하지 않으면 사용자 프로그램이 계속 CPU를 점유한다.

3.2 인터럽트 처리루틴이란???

  • 인터럽트를 당한 시점의 레지스터와 program counter를 저장한 후, CPU 제어를 인터럽트 처리 루틴에 넘긴다.
  • 인터럽트 처리루틴(Interrupt Service Routine) 이란?
    • 해당 인터럽트를 처리하는 커널 함수
    • 인터럽트 핸들러(interrupt handler) 라고도 한다.
    • 다양한 controller가 있는 만큼 interrupt의 종류도 다양하다.
    • 그러므로 인터럽트 처리루틴의 종류도 다양하다.
  • 인터럽트 벡터(interrupt vector)
    • 해당 인터럽트의 처리 루틴 주소를 가리킨다.
  • 인터럽트 처리루틴까지의 과정
    • 컨트롤러가 인터럽트를 발생시키면 CPU는 인터럽트 라인을 통해 인터럽트 발생을 확인하고, 자신이 하던 일을 멈춘다.
      -> 프로그램의 실행 상태를 PCB에 저장한 후, CPU의 제어권은 프로세스에서 운영체제로 넘어간다.
      -> 그리고, 운영체제는 interrupt vector가 가리키는 곳으로 가서 인터럽트 처리루틴을 찾는다.
      -> 인터럽트 처리루틴을 통해 해당하는 인터럽트 처리를 완료하고 나면, CPU는 PCB로부터 CPU 상에 복원하여 인터럽트 당하기 직전의 위치부터 계속 수행.

3.3 Interrupt line

  • 특정 프로그램이 CPU를 독점하는 걸 방지하기 위해서 timer 라는 HW를 사용하여, timer의 시간이 다 되면 interrupt line 을 통해 interrupt를 건다.
  • 또한, controller가 I/O 작업을 완료하면 interrupt line을 통해 interrupt를 건다.

3.4 인터럽트의 종류: HW interrupt 와 SW interrupt

  • Interrupt = HW interrupt + SW interrupt
  • HW interrupt
    • HW가 발생시킨 인터럽트
    • HW 일꾼들이 CPU와 정보 교신을 위해서 거는 것
    • 하드웨어 장치가 CPU의 interrupt line을 세팅한다.
      • ex) Timer Interrupt, device controller가 발생시키는 interrupt
    • 통상적으로 불리는 interrupt의 의미가 HW interrupt다.
  • SW interrupt (= 트랩(trap))
    • 사용자 프로그램이 운영체제에게 대행해달라고 요청하는 것
    • 소프트웨어가 CPU의 interrupt line을 세팅한다.
    • Trap의 종류: 예외 상황(exception)시스템 콜(system call)
  • HW interrupt와 SW interrupt의 공통점
    • CPU 옆 인터럽트 라인에 신호를 보내 인터럽트 발생유무를 알리는 방식은 동일하다.

3.5 Trap: exception 과 system call

 

3.5.1 예외 상황(exception)

비정상적인 작업 또는, 권한이 없는 작업을 시도할 때, 이에 대한 처리를 위해 발생시키는 인터럽트

  • 비정상적인 작업의 예: 사용자 프로그램이 0으로 나누는 연산을 실행
  • 권한이 없는 작업의 예: 사용자 프로그램이 자신의 메모리 영역 바깥에 접근하려는 시도

 

3.5.2 시스템 콜(system call)

사용자 프로그램이 운영체제 내부에 정의된 코드를 실행할 때, 운영체제에게 서비스를 요청하는 trap

  • 사용자 프로그램의 코드는 사용자 프로그램이 CPU에 대한 제어권을 가지고 실행한다.
  • 하지만, 커널 내부에 있는 코드를 사용자 프로그램이 실행하고자 할 때는 사용자 프로그램이 직접 접근할 수 있는 게 아니라, system call을 통해서 대행 요청 을 한다.
  • system call 요청을 interrupt line 을 통해 CPU 제어권을 운영체제로 넘겨 커널 내부 코드를 실행한다.

 


4. 인터럽트 핸들링(Interrupt handling)

4.1 Interrupt handling 이란??

인터럽트가 발생한 경우에 처리해야할 일의 절차

  • 프로그램 A가 실행되고 있을 때, 인터럽트가 발생하면 프로그램 A의 현재 상태를 먼저 저장 한다.

    • 현재 상태란? 현재 CPU에서 실행 중인 명령의 메모리 주소를 포함해 몇 가지 부가적인 정보들을 의미한다.
  • 현재 상태를 먼저 저장하는 이유는??

    • CPU에서 명령이 실행될 때 CPU 내부에 있는 임시 기억장치인 레지스터(register)에 데이터를 읽거나 쓰면서 작업을 한다.
    • 그런데, 인터럽트가 발생해 새로운 명령을 실행하면 기존의 레지스터 값들이 지워지므로 , CPU 내의 이러한 상태를 저장해둬야 한다.

4.2 PCB(Process Control Block)이란??

OS가 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 둔 자료구조로 PCB(Process Control Block, 프로세스 제어 블록)라 한다.

  • PCB
    • 각각의 프로그램마다 하나씩 존재 한다.
    • 해당 프로그램의 어느 부분이 실행 중이었는지를 저장 한다.
      • ex) 코드의 메모리 주소, 레지스터값, 하드웨어 상태 등
  • PCB 사용절차
    • Interrupt 발생 → CPU의 제어권을 넘기기 전에 프로그램의 실행 상태를 PCB에 저장 → CPU의 제어권이 OS로 넘어간다 → 운영체제는 인터럽트 벡터가 가리키는 곳으로 가서 인터럽트 처리루틴에 따라 인터럽트 처리를 수행→ 인터럽트 처리 완료 → 저장된 상태를 PCB로부터 CPU 상에 복원 → 인터럽트 당하기 직전 위치부터 재실행

Reference