Coding, Filming, and Nothing
article thumbnail

 

1.

컴퓨터 시스템의 동작 

 

 

  • 컴퓨터가 실행되기 시작하면 무슨 일이 일어나는가?
    • Bootstrap program(firmware) 가 실행이 된다. 
      • 시스템을 진단하고 초기화를 수행한다.
      • 그리고, OS Kernel을 적재하고 실행시킨다. (Bootstrap loader) 
    • OS Kernel
      • 부팅된다. (초기)
      • 어떠한 일(event)을 대기한다. 
      • 그리고 그 이벤트를 처리한다. 
        • 현대의 운영체제들은 Interrupt driven programs 이다. 

 

#필기

  1. 펌웨어(Firmware)
    아주 작은 프로그램으로, 메인보드에 위치해있다. 해당 프로그램은 전원을 켜면 실행이 된다. 
    첫번째로, 하드웨어의 진단(e.g. 키보드 유/무에 따른 경고)과 초기화를 수행한다.
    두번째로, 운영체제를 읽고 실행을 한다. 
  2. 펌웨어가 어떻게 OS를 찾아서 실행을 하는가?
    A. 대부분 지정된 위치에 있기 때문에 루틴대로 찾아온다. 바로 OS를 읽어오는 것이 아니고 해당 위치의 Loader를 읽고 Loader가 OS를 읽어오는 식으로 진행된다. 이 과정을 부팅과정이라고 한다. 
  3. OS는 부팅이 완료가 되면 아무것도 안하고 기다린다. 어떠한 이벤트를 기다리고, 이벤트를 처리하는 일 이 2가지를 계속해서 반복하는데 이 이벤트라는 개념은 Interrupt를 뜻한다. 
  4. Interrupt는 운영체제에 보내는 일종의 request signal 이다. 운영체제는 수동적이기 때문에 요청을 줘야 운영체제가 일을 한다. 그래서 운영체제에서 Interrupt가 중요하다. 
  5. 유저나 프로그램이 Request를 하면, OS에게 Interrupt 형식으로 전달이 되고 OS는 request에 대한 처리를 수행한다. 

 

 

2. 

근대의 컴퓨터 시스템(구조)

 

컴퓨터 구조도

  • Common Bus
     컴퓨터들 컴포넌트들 간의 데이터를 전송하는 서브 시스템
  • CPU, memory and device controllers
     위의 요소들은 common bus에 의해서 연결이 되어 있다. (직접 연결이 아님) 
  • I/O 장치와 CPU
     각 디바이스 장치들과 CPU는 동시에 실행이 가능하다.
    • 해당 동시실행성 때문에 메모리 사용의 경쟁이 있는데 이를 synchronization issue라고 일컫는다.

 

#필기 

  1. Common 버스가 위치적/개념적으로 중심에 위치한다. 
    또한, 각 device들의 data를 공유해서 이용할 수 있게 한다.

 

 

 

 

3.

컨트롤러

 

 

  • 각 디바이스 컨트롤러는 각자의 버퍼를 가지고 있다(local buffer).
  • CPU는 local buffer와 main memory 에 서로 데이터를 전달한다.
    (buffer -> memory / memory -> buffer)
  • I/O는 디바이스로부터 컨트롤러에 local buffer까지를 나타낸다.
  • Device controller는 어떠한 수행이 끝나면 그것이 끝났다고 CPU에게 인터럽트(interrupt)를 발생시켜서 알려준다.

 

 

 

4. 

인터럽트

  • 인터럽터의 정의
    하드웨어나 소프트웨어가 필요함을 나타내는 asynchronous signal(언제든지 나타날 수 있다)이다.
    • H/W의 도움을 받는다. 
    • 각 인터럽트는 특정한 번호(IRQ number)에 의해 등록이 되어 있다.
    • 인터럽트 핸들러(interrupt handler)에 의해 처리가 된다. 
  • 코드의 세그먼트를 분리하여 인터럽트가 각각의 (인터럽트)타입에 의해서 어떠한 수행을 해야할지 결정한다. 
    • 인터럽트 핸들러의 테이블을 interrupt vector라고 한다. 
  • 이벤트 생성의 매커니즘
    • H/W interrupt
      • CPU에게 신호를 보낸다. 
    • S/W interrupt
      • System call(=monior call) : 프로그램의 요청 
         ex. I/O access, memory aloocation, ...
      • Exception
         ex. Divide by zero, invalid memory access, I/O exception, ...

 

 

#필기

  1. 인터럽트는 아임어그로  CPU의 주의를 끈다
  2. asynchronous라는 표현은 해당 일이 언제든지 나타날 수 있다는 속성을 나타낸다.
    예를 들어 키보드 입력같은 이벤트는 컴퓨터 입장에서 언제 발생할 수 있는지 알 수가 없다. 이런 이유로 interrupt는 asynchronous.
  3. supported by H/W의 경우, CPU가 interrupt를 수행할 수 있도록 보조를 한다.
  4. IRQ number : Interrupt Request # 
  5. interrupt handler는 인터럽트를 다루기 위한 "정의된" 처리를 나타낸다. 
  6. interrupt vector는 인터럽트가 여러개이기 때문에 그를 다루고 처리할 것이 필요한데, 이때 테이블 형태로 제공되는 것
    1. 인터럽트 핸들러는 여러개 있고, 몇 번 벡터가 어느위치에 있다고 알려주는 것이 인터럽트 벡터이다. 
    2. 인터럽트 처리 순서 (대략적)
        i) Interrupt  발생
       ii) Look up the Table(interrupt vector)
      iii) Jump to Handler
  7. System call같은 경우, 일부로 발생을 시킨다. 운영체제의 기능이 필요하기 때문인데, Exception은 그와 반대로 에러/버그로 발생한다.

 

5.

인텔 프로세서의 이벤트 벡터 테이블

  • 0-31까지는 가릴수 없는(non-maskable) 중요한 인터럽트이다.
  • 32~255까지는 가릴 수 있다(인터럽트가 발생하지 않게 할 수 있다).

 

#필기

  1. 각 번호가 각 인터럽트를 나타낸다.
    또, 어떤 경우엔 한 번호에 동작이 여러개의 동작(인터럽트)가 일어날 수 있다.
  2. mask를 사용하면 특정 interrupt를 무시할 수 있게 한다.
    1. 그래서 중요한 것은 non-maskable로 설정하여 항상 일어날 수 있게 한다.
    2. 상대적으로 중요(심각)하지 않은 것은 maskable로 경우에 따라서 발생을 조절할 수 있다.
  3. 표를 통해, 각 번호가 각 인터럽트를 나타낸 다는 것을 알 수 있고 인터럽트는 종류가 매우 많다는 것을 알 수 있다. 따라서 다음과 같은 관계(?)를 유추할 수 있다.
    1. 인터럽트는 종류가 매우 많다. 그에 따라서 인터럽트 핸들러도 (대응하듯) 매우 많다.
    2. 인터럽트 핸들러가 여러개임에 따라서 핸들러를 찾아가기 위한 특정 ID가 필요하다. 
    3. 해당 아이디는 인터럽트의 고유 ID로 IRQ number로 지정이 된다. 
    4. 인터럽트가 발생하면 해당 인터럽트의 IRQ를 가지고 인터럽트 백터(표)를 look up하고, 알아낸 주소로 이동하여 Handling을 수행한다.

 

 

 

 

6.

Hardware Process (실제 인터럽트가 발생하는 방식) 

 

해당 예제는 CPU의 Insturction 실행 단계의 일부이다. 

// <pesudo code>
InterruptRequest = FALSE;
...
while(haltFlag not set during execution){
	IR = memory[PC]; 	// Fetch into the IR
    PC++;				// Point the PC at the next instruction
    execute(IR);		// Execute the current instruction (+ Decode)
    
    if(InterruptRequest){ 	// Interrupt the current process
    	save_PC();			// Save the PC
        restore_PC(IRQ);	// Branch to the ISR for this IRQ
    }
}

 

#필기

  1. 인터럽트의 발생을 확인하기 위한 Flag 존재 (InterruptRequest), 발생시 1로 변함
  2. 명령어를 실행 직후, Interrupt Request를 체크한다. (이 부분이 위 슬라이드에서 CPU의 인터럽트 보조가 이루어지는 부분)
  3. 인터럽트가 발생하면 save_PC();를 통해 PC를 저장한다. Handler 처리 이후에 다시 원래 프로그램을 실행하기 위해서 저장하는 것이다.
  4. restore_PC(IRQ);는 Handler를 실행하기 위한 것인데, 주석의 ISR은 Interrupt Service Routine을 의미한다. 해당 루틴(핸들러)로 이동하기 전에, IRQ를 통해 interruptVector(table)을 먼저 Look Up한 후에, Handler의 위치로 이동을 한다. 

 

 

7.

Interrupt Mechanism 

인터럽트가 발생하는 대략적인 흐름

 

  • 인터럽트 핸들링
    • CPU는 현재 작업을 멈추고 인터럽트 핸들러에게 실행을 옮깁니다(주-를 옮긴다).
      • 인터럽트 벡터는 각 인터럽트에 대응하는 인터럽트 핸들러가 적힌 표
    • 인터럽트는 해당하는 핸들러에 의해서 처리된다.
    • 인터럽트가 발생한 프로그램으로 복귀 
    • 인터럽트가 발생하기 전에 필수적이고 중요한 정보들은 반드시 저장해야 한다. 

 

 

 

8.

Interrupt-based I/O 

인터럽트 베이스 I/O의 CPU/DEVICE 동작 개략도

  1. CPU는 요청을 보내고 현재의 수행중인 프로세스 혹은 작업을 지속한다.
  2. 입출력 장치에서 데이터 전송이 완료되면,  인터럽트를 발생시킴 

 

#필기

  1. 만약 인터럽트가 없으면 어떻게 되는가??
    A. CPU가 request를 요청한 후 그 순간 부터 동작이 다 끝날 때까지 지켜보고 다른 일을 하지 못한다.

 

9.

I/O Device Access 

메모리에 접근하는거

종류)

  • 오래된 시스템의 경우
    -> Busy waiting 방법을 사용 (Interrupt를 사용하지 않음)
  • 현대 시스템의 경우
    -> Interrupt-driven I/O 방식
    -> DMA (Direct memory Access) : 발전된 Int. driven

 

 

Busy waiting 방식

  • Busy waiting - old system 
    • CPU는 디바이스의 상태(끝났는지)를 주기적으로 계속 체크한다.
      -> 문제점 : CPU는 I/O 장치의 수행이 끝날 때 까지 아무것도 하지 못함 

 

#필기

  1. I/O가 언제 끝나는지 알 수가 없어서 CPU가 다른 일을 못하고 계속 확인하게 됨
  2. Q. old system에 사용된 방식인데 현대의 컴퓨터들은 이 방법을 계속 사용할까?
    A. 그래도 사용하긴 함, 매우 빨리 끝나느 경우나, 아주 간단한 것 혹은 너-무 중요한 것에 대해서 사용한다. 

 

인터럽트 핸들링 방식, 매겨진 번호 순서대로 동작함

  • Interrupt-driven I/O cycle 
    • CPU가 I/O에게 일을 시켜버리고, 다할 때까지 (interrupt가 올 때 까지) 자기의 일을 수행함
    • 작업이 완료되면 I/O가 인터럽트를 발생시키고, CPU는 이를 통해 buff에 있는 데이터 처리

 

#필기

  1. 키보드/마우스의 경우 데이터가 작아서 그냥 CPU가 인터럽트 형식으로 버퍼에서 데이터를 가져가서 처리를 직접 해버린다. 
  2. 그러나, 디스크 같은 경우 데이터의 양이 매우크다. 버퍼까지만 가게 되면 CPU가 그 데이터를 옮기는데 다시 CPU 타임을 많이 소진하게 되는 문제 점이 있다.
  3. 그래서 I/O로 가져오는 양이 매우 많은 경우에는 DMA방식을 사용한다.

 

 

 

  • DMA (Direct Memory Access)
    • 디바이스 컨트롤러가 직접 큰 규모의 데이터를 메인메로리로 직접 전송해버림
    • CPU는 data transfer를 실행할 필요가 없음! 

 

#필기

  1. Disk 같은 경우 I/O하는 크기가 커서 DMA를 통해 CPU가 관여하지 않게 메인 메모리에 바로 보내버림
  2. Buffer에서부터 메모리까지일어나는 Transfer조차도 CPU가 관여하지 않게 되는 장점이 있음 

 

profile

Coding, Filming, and Nothing

@_안쑤

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!