CS/operating system

System Structure: 컴퓨터 시스템의 동작 원리(1/3)

superbono 2021. 2. 2. 15:31

컴퓨터 시스템의 동작 원리에 대해서 3번의 포스트에 나누어 다루도록 하겠다.

이번 포스트에서는 

 

컴퓨터 시스템 구조. 빨간색 하트는 컴퓨터(host), 파란색은 I/O devie

1. 컴퓨터 시스템의 구조

컴퓨터 시스템의 구조는 컴퓨터 내부 장치인 cpu, 메모리와 외부 장치(I/O device)인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구성된다. 메모리 및 입출력장치 등의 각 하드웨어 장치에는 컨트롤러라는 것이 붙어있다. 그 디바이스를 전담하는 작은 cpu라고 생각하면 된다. 프로그램이 수행되려면 그 프로그램이 메모리에 올라가 있어야 한다. 운영체제는 컴퓨터가 부팅되었을 때부터 항상 수행되면서 각종 자원을 관리해야 하므로 항상 메모리에 올라가 있다. 하지만 항상 운영체제의 모든 부분이 메모리에 올라가있다면 쓰지 않는 부분도 많으므로 메모리의 낭비가 심하다. 따라서 항상 올라가 있는 부분과 필요할 때마다 그때그때 올리는 부분으로 나눌 수 있는데 항상 올라가 있는 부분은 운영체제의 핵심적인 부분에 해당하며, 이것을 커널(kernel)이라고 칭한다.

 

2. CPU 연산과 I/O 연산

CPU와 I/O devie는 동시 수행이 가능하다. 각 장치들마다 작은 장치들만의 CPU인 컨트롤러를 가지고 있는데, 이 컨트롤러들은 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리를 가지고 있다. 이것을 로컬 버퍼(local buffer)라고 한다. 만약 CPU가 disk에서 파일을 읽어와야 한다면 disk controller에게 읽어오라고 시킨다. disk controller는 그 명령을 전달받아 열심히 수행하면서 임시로 데이터를 local buffer에 저장한다. 다 완료했으면 인터럽트를 발생시켜 CPU에게 작업을 완료했음을 알린다. 기본적으로 CPU는 매 시점 메모리에서 intruction(명령)을 하나씩 읽어봐서 수행하는데 CPU 옆에는 interrupt line(위 그림의 보라색)이 있어서 CPU는 instruction 하나를 수행할 때마다 인터럽트가 발생했는지를 확인한다. 발생했으면 다음 instruction 수행하기 전에 인터럽트를 먼저 처리하고, 그렇지 않으면 다음 instruction을 수행한다. 

 

  • Device Controller

I/O Device Controller

- 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU

- 제어 정보를 위해 control  register, status register을 가진다.

- local buffer을 가진다. (일종의 data register)

- I/O는 실제 device와 local buffer 사이에서 일어남

- device controller는 I/O가 끝났을 경우 interrupt를 걸어서 CPU에게 완료 사실을 알림

 

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

그렇다면 interrupt란 과연 무엇일까?

인터럽트가 발생하면 cpu는 인터럽트 라인에서 인터럽트가 발생했음을 읽고 발생여부를 인지하고 인터럽트 관련 업무를 수행하게 되는데 운영체제 커널에는 인터럽트가 들어왔을 때 수행해야 하는 일들이 전부 프로그래밍되어 코드가 보관되어 있다. (인터럽트 처리루틴)

 

디스크 컨트롤러가 인터럽트를 발생시키면 CPU는 하던 일을 잠시 멈추고 이 인터럽트가 발생했을 때 수행하도록 정의된 코드를 찾아 수행한다. 이 때 수행하는 일은 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 cpu를 할당 받을 셩우 다음 명령을 수행할 수 있음을 표시해두는 일이다. 한편 인터럽트에는 하드웨어 인터럽트소프트웨어 인터럽트(trap)가 있다. 어쨋든 일단 인터럽트가 발생하면 cpu는 하던 일을 멈추고 운영체제 커널 내에서 해당 인터럽트의 처리를 위해 정의된 코드를 찾게 된다. 운영체제는 하던 일을 쉽게 찾아가기 위해 인터럽트 벡터를 가지고 있다. 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조를 말한다. 실제 처리해야 할 코드는 인터럽트 처리루틴(interrupt service routine) 또는 인터럽트 핸들러(interrupt handler)라고 불리는 다른 곳에 정의된다.

 

  • 인터럽트(interrupt)

- 인터럽트 당한 시점의 레지스터와 program couner를 save를 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.

- interrupt(넓은 의미)

 1. interrupt(하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트(ex. disk controller가 발생시킨 interrupt 등) 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅한다.

 2. trap(소프트웨어 인터럽트): 소프트웨어가 인터럽트 라인을 세팅한다.

    - Exception: 프로그램이 오류를 범한 경우 0으로 나누는 연산을 하거나 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때

    - System Call: 프로그램이 커널 함수를 호출하는 경우(사용자 프로그램에 정의되지 않고 운영체제 커널에 있는 코드를 사용자 프로그램이 실행하고자 할 때 인터럽트 라인 세팅을 통해 cpu 제어권을 운영체제로 넘겨 실행하고자 하는 것)

시스템 콜이나 exception은 모두 사용자 프로세스로부터 cpu의 제어권이 운영체제에 이양되어 처리되는데, 이 과정에서 프로그램 코드가 직접 인터럽트 라인을 세팅하는 명령을 실행하여 인터럽트를 발생시킨 후 제어권이 넘어가게 되므로 이들도 넓은 의미에서는 인터럽트의 범주에 포함하게 된다.

 - interrupt 관련 용어

   * 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소(각 인터럽트 종류마다 어디에 있는 함수를 실행해야 하는지지 그 함수 주소를 정의해둔 것)를 가지고 있음. 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조!

   * 인터럽트 처리 루틴(= interrupt service Routine, 인터럽트 핸들러): 해당 인터럽트를 처리하는 커널 함수. 각 인터럽트마다 실제로 처리하는 코드

 

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

인터럽트 핸들링이란 인터럽트가 발생한 후에 처리해야 할 일의 절차를 의미한다. 프로그램 A가 실행되고 있을 때 인터럽트가 발생하면 A의 현재 상태를 먼저 저장한다. 현재 상태란 현재 cpu에서 실행중인 명령의 메모리 주소를 포함해 몇 가지 부가적인 정보들을 의미한다. CPU에서 명령이 실행될 때에는 CPU 내부에 있는 임시 기억 장치인 register (메모리보다 빠르면서 정보를 저장할 수 있는 곳)에 데이터를 읽거나 쓰면서 작업을 하는데, 이때 인터럽트가 발생해 새로운 명령을 수행하면 레지스터에 올라와 있는 현재 레지스터값들이 지워지게 되므로 CPU 내부의 상황을 저장해두어야 인터럽트 처리가 이루어 질 수 있다. 이러한 상황을 저장해두는 곳을 프로세스 제어블록(PCB: Process Control Block)이라고 한다.

 

PCB

pcb는 각각의 프로그램마다 하나씩 존재하며 해당 프로그램이 어느 부분을 실행 중이었는지를 저장하고 있다. 어떤 프로그램이 실행되던 중에 인터럽트가 발생하면 그 프로그램의 실행 상태를 pcb에 저장한 후 cpu의 제어권이 인터럽트 처리 루틴으로 넘어가게 되며 인터럽트 처리가 끝나면 저장된 상태를 pcb로부터 cpu상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 되는 것이다. 

운영체제는 인터럽트가 발생했을 때만 잠깐 실행되며 대부분 사용자 프로그램이 cpu를 잡고 실행한다. 인터럽트가 발생할 때에만 운영체제 코드 부분으로 cpu가 이양되어 인터럽트 처리를 수행하게 된다. 운영체제가 직접 cpu를 점유하는 경우는 인터럽트에 의하지 않고는 발생하지 않는다!

 

출처- kocw 반효경 교수님의 운영체제 강의, 운영체제와 정보기술의 원리(반효경)