Chapter1 Introduction - II

Jake Yeon·2021년 1월 5일
0

OperatingSystem

목록 보기
3/3
post-thumbnail

이번 포스팅에서는 지난 포스팅에서 예고했던 대로 Bootstrap Program, Operating System, Interrupt에 대해서 포스팅 해보려고 한다.
하나씩 천천히 알아보자.

현대 컴퓨터 시스템(Modern Computer System)

현대 컴퓨터 시스템은 CPU, Main Memory, Devices들로 이루어 졌다고 생각하면된다.
그리고 CPU와 Devices들은 memory를 사용하기 위해서 동시에 서로 경쟁을 한다.
만약 누군가 컴퓨터 시스템의 구조를 묻는다면 위의 그림을 떠올리면 될 것이다.

Bootstrap Program & Operating System

Bootstrap Program

Bootstrap Program이란 우리가 컴퓨터를 켤 때 파워가 들어오면 가장 먼저 돌아가는 프로그램이다.

  • ROM(Read Only Memory)에 저장이 되어 있다. 이유는 이전 포스팅에!!
  • 모든 시스템(CPU registers, Device Controller, Memory content 등)을 initialize한다
  • Disk로 부터 OS(Operating System)을 load하고 실행한다.

Operating System

Operating System은 Booting Process가 끝나고 나면 실행되는 시스템이다.

  • 첫 번째 프로세스를 init() 명령어를 통해서 실행시킨다.
    (정확히 말하면 스케줄러가 수행)
  • Interrupt라고 불리는 events가 발생하기를 기다리고 있다.

Interrupt

Interrupt란 무엇인가?

Operating System은 Interrupt라는 events를 기다린다고 했는데
이 interrupt라는 것은 무엇일까?

Interrupt는 부팅이 끝나고 나서부터 발생하는 것이며, 종류에는 크게 3가지가 있다.

  1. User Command = User(사용자)로부터의 명령
  2. Hardware Event (CPU, Memory, I/O device)
    e.g. 노트북의 베터리 부족이나 프린터의 인쇄 요청 같은 것을 H/W interruput 라고 할 수 있다.
  3. Software Event (traps)
    e.g. traps라고 불리는 system call을 발생시키는 것으로 예를 들면 0으로 나누는 것이 있다.

Interrupt 처리 순서

그렇다면 이러한 Interrupt가 발생하면 처리가 되어야 할 텐데 어떠한 순서로 처리가 되는지 알아보자.

  1. 먼저 interrupt가 발생 하면 interrupt signal은 CPU에 도착하게 된다.
  2. 운영체제(OS)지금 하던 일을 멈추고 하던 일의 주소(return address)를 stack에 저장을 한 뒤, switch context를 하게 된다. 그리고 나서 interrupt service를 시작한다.
  3. CPU는 도착한 interrupt signal을 검사하여 interrupt type을 알아낸다.
    이때 interrupt type에는 두 가지 종류가 있다.
    Polling : interrupt signal에 대한 번호가 없기 때문에 CPU는 모든 device를 검사해야한다.
    Vectored Interrupt : "signal + interrupt 번호"로 구성 되어있어서 누가 interrupt를 발생시켰는지 알 수 있다. 즉, 모든 interrupt는 unique한 id가 있다.
    그리고 CPUvectored Interrupt가 도착하면 ISR(Interrupt Service Routine)의 시작 주소를 얻기 위해서 interrupt vector 검사하게된다.
  4. 해당하는 ISR을 시작한다.
  5. Interrupt service를 마치고 나서는 CPU는 다시 OS에 의해서 context switch된 작업을 수행한다.
    위의 그림에서 왼쪽은 Main Memory, 오른쪽은 Main Memory의 OS가 할당되어 있는 영역에 있는 interrupt vector 부분을 확대한 interrupt vector의 그림이다.

context switch란?

위에서 운영체제가 수행한다는 context switch라는 것은 무엇인가?

context switch 에서 contextCPU register들의 값을 의미한다.
예를 들어서 메모리의 1000번지에서 CPU가 일을 수행하고 있었는데 interrupt가 발생했다고 하자.
해당 interrupt의 ISR의 시작주소는 yyy라고 하자.

그럼 1000번지의 일들을 마치고 기존의 task 상태 및 register의 값들에 대한 정보(context)를 저장한다.
그러고 나서 ISR의 시작주소 yyy에 대한 새로운 정보(context)로 교체하게 되는 것을 의미한다.

context switch 는 pure overhead라고 하기도 하는데 그 이유는
우리의 목적인 수행 속도를 빠르게 한다던가 그러한 목적이 아닌 계산이므로 순수한 오버헤드라고도 한다.

Interrupt Vector란?

ISR(interrupt Service Routine)들의 start address를 저장하고 있는 배열
위의 그림에서 메모리의 붉은색 영역처럼 Main memory의 OS가 적재된 곳 안에 위치한다.
따라서 1000번지에서 일을 하다가 IRQ 1라는 Vectored Interrupt가 들어온 경우에는, 1000번지의 일을 마치고 PC에는 1001번지가 아닌 yyy가 들어가게 되고 1001번지는 stack에 저장이 되게 된다. PC에는 yyy가 있기때문에 yyy주소로 가서 해당하는 service routine을 마치고 나면 이제 다시 원래대로 돌아오기 위해서 stack에 저장되어 있는 주소를 pop해서 꺼내주면 다시 PC에는 1001번지가 들어가게 된다.
그 뒤로는 다음 interrupt가 들어오기 전까지 원래 하던 일을 진행한다.

Interrupt Hierarchy

이러한 interrupt serivce를 처리하는 도중에도 interrupt가 발생할 수 있다.
이러한 경우에는 3가지 방법이 존재한다.

  1. 처리중인 interrupt말고 두번째나 나중에 들어오는 interrupt를 대기시킨다.
  2. 처리중인 interrupt말고 두번째나 나중에 들어오는 interrupt를 무시한다.
  3. interrupt에 우선순위를 주어서 우선순위에 따라서 처리한다.

주로 우리가 사용하는 OS가 채택하고 있는 방식은 3번이다.

그렇다면 Interrupt Hierarchy로 처리하는 방법을 알아보자.

Preempt - Resume 방법

높은 우선순위를 가진 interrupt는 낮은 우선순위의 interrupt 처리가 진행 중일 경우 순서를 빼앗고 먼저 처리한다. 따라서 이때 context switch가 발생하게 된다. 이때 순서를 빼앗긴 interrupt는 높은 우선순위의 interrupt가 처리를 마치면 다시 context switch를 통해서 정보를 가져와 이어서 interrupt를 처리 하게된다.

같은 순위의 interrupt들은 FIFS(First In First Servie),즉 먼저 들어오는 순으로 해결하게 된다.

결론

이번 포스팅에서는 Bootstrap Program, Operating System, Interrupt에 대해서 간략하게 알아보았다.
다음 포스팅에서는 I/O, DMA, Operating System Structure에 대해서 알아보도록 하자.
👉🏻 이전포스팅으로 가려면 여기
👉🏻 다음포스팅으로 가려면 여기

참고

Operating System Concepts 9th Edition

profile
Hope to become an iOS Developer

0개의 댓글