본문 바로가기

CS/OS

Computer System Overview 2 (미완)

알아야 할 것 : Interrupt의 필요성, 과정, 종류

Interrupts

Interrupt Mechnism

Interrupt의 필요성을 알아보자

프로세서의 utilization (사용성)을 향상시켜야한다.

  • 대부분의 I/O 디바이스들은 프로세서보다 느리다.
  • 프로세서는 디바이스를 기다리기 위해서 (pause) 하던 일을 멈춰야한다. -> busy waiting
  • 즉 프로세서의 낭비가 있다 !
  • 예를 들어서, write 작업을 하던 도중에 프린터를 쓰면 프린터 작업이 완료될 때까지 write를 중지하고 idle(쉬는상태) 상태를 유지해야한다.

고로 프린터를 사용하던 도중에는 idle 상태가 되니까 이 상태를 프로세서의 낭비가 있다고 한다.

 

 

Interrupt를 포함한 Instruction Cycle (명령어 사이클)을 알아보자.

  1. 시작 !
  2. 다음 instruction을 Fetch 
  3. instruction을 실행시킨다. (세가지 상황 발생)
    1. Interrupts Disabled: 인터럽트가 발생하지 않았으면 다음 명령어를 계속 실행한다.
    2. Interrupts Enabled: 인터럽트가 발생했으면 interrupt handler를 정의해서 인터럽트를 실행한다. 실행 후 원래의 명령어를 실행후에 원래의 프로세스로 돌아간다.
    3. HALT (정지)

 

 

더 자세히 Interrupt 의 과정을 알아보자

CPU 에서 PC를 증가시켜가면서 명령어를 수행하고 있었는데, (Interrupt request bit 가 0 일때)

다른 디바이스들에서 PIC로 신호를 보내 Interrupt request bit가 1이되어 인터럽트가 발생하였다.

 

이 때 재빨리 해야할 일은 PC와 PSW를 저장하는 것이다. (주황색 선)

PSW 란, 특별한 목적의 레지스터로 Program Status Word의 약자이다.

  • PSW 에서 privilege mode 를 kernel mode 로, INTR disable 로 해야한다.
    • (Interrupt 는 kernel 함수의 일종이므로, kernel mode에서만 동작하기 때문에 user mode 에서 kernel mode로 바꿔주고, 잠시 다른 Interrupt를 받지 않게 INTR disable을 설정한다.)
  • PC에는 실행할 Intterupt handler 의 주소를 넣어야 한다.

만약 save 주소를 저장하지 않으면 원래 프로세스로 돌아갈 수가 없다. ㅠ

 

PC와 PSW에 저장했으면, kernel mode로 들어와서 PC, PSW를 제외한 모든 레지스터를 저장한다. (save all, 공통과정)

각각 타이머, 디스크, 마우스같은 디바이스의 리퀘스트 벡터를 실행하는 함수인 Interrupt Service Routine 을 실행한다.

ISR = Interrupt Service Routine

 

번외

Interrupt handler 와 ISR 을 비교하면

Interrupt handler ISR (Interrupt Service Routine)
인터럽트가 발생했을 때 실행하는 공통과정 (전과정) 디바이스들의 특수과정을 실행하는 함수

하지만 구분하지 않고 사용할 때도 있다고 한다~

 

리눅스에서의 예시

ENTRY : 커널로의 진입점

do IRQ : 리눅스에서 Interrutp 를 handling 하는 코드 (c언어)

 

오른쪽아래의 do_IRQ를 살펴보자

IDT는 Interrupt Decriptor Table 로 각 인터럽트를 실행할 함수의 주소 (ISR) 를 가지고 있는 테이블이다.  

(IVT 라고 Interrupt Vector Table 이라고도 한다.)

 

오른쪽의 두 칸을 위아래로 나눠서 위에는 common operation- 공통과정, 아래는 specific operation- 특수과정 이라한다.

 

 

이제 이 전체 과정을 한번에 다시 정리해보자.

 

Interrupt Processing

  1. 디바이스 컨트롤러나 다른 시스템 하드웨어에서 인터럽트를 발생시킨다 (PIC).
  2. 프로세서가 현재의 명령어를 끝낸다.
  3. (프로세서가 ACK을 보낸다.)
  4. 프로세서가 PC와 PSW를 저장한다.
  5. 프로세서가 인터럽트 핸들러의 주소를 PC에서 가져와 로드한다.
  6. Save all - PC와 PSW를 제외한 남은 모든 정보를 저장한다.
  7. ISR - 인터럽트를 실행한다.
  8. Restore all - 프로세스의 모든 상태 정보를 가져온다.
  9. Restore old PSW and PC - 프로세스의 PC와 PSW를 가져온다.

 

이 과정을 다시 메모리를 통해서 보자 아 힘들다

 

(a) 왼쪽 그림은 User's Program 을 실행하는 도중에 N 의 명령어 이후에 인터럽트가 발생한 그림이다.

파란색 프로세서에서 PC에 다음에 실행할 N+1 을 저장하고, 다른 레지스터의 정보들도 모두 저장한다.

 

(b) 오른쪽 그림은 인터럽트가 끝나고 난 직후의 (restore 전) 그림이다. 만약 원래 PC 인 N+1를 저장하지 않았다면, ISR의 마지막 Y+L 의 다음인 Y+L+1 이 PC에 들어가 실행됐을 것이다.

 

 

위에서 계속 말했던 ISR (Interrupt Service Routine) 에 대해 또 자세히 알아보자 ~

ISR (Interrupt Service Routine) : Device specific operaion 디바이스 특수 명령어 ~

위에서 배운 리눅스 do_IRQ 함수를 자세히 보면 !

 

우선 인자로 받는 regs 는 레지스터들이고,

irq_desc 가 위에서 IDT 인 Intrrupt descriptor Table 이다.

 

-------------여기 다시듣고 다시 적기-----------------

 

 

Interrupts 와 Exception 을 알아보자 

Interrupts 에는 두가지 종류가 있다.

  • Asynchronous interrupts (비동기적 인터럽트) 주로 Interrupt
    • 하드웨어 디바이스에서 발생한다.
    • External interrupt 외부 인터럽트: 주변장치에서 발생한다.
  • Synchronous interrupts  (동기적 인터럽트) 주로 exception (trap)
    • CPU 에서 발생한다.
    • Exception: 'divide by zero', 'segmentation faults', 'page faults'
    • 소프트웨어 인터럽트 !

리눅스에서는 인터럽트와 익셉션이 같은 방식으로 핸들된다고 한다.

 

 

Exception 

고로 이 그림은 리눅스에서의 exception 과정

명령어 수행과정 (작은 파란박스) 에서 불법 opcode, 불법 address, divide by zero 등 동기적 인터럽트(익셉션)이 발생하면 인터럽트 리퀘스트 비트를 설정한다.

 

 

Interrupt 와 Exception 비교

Interrupt Exception
CPU 외부에서 발생한다. CPU 내부에서 발생한다.
(현재 명령을 실행하는 도중에 발생한다.
clock에 비동기적으로 발생한다. clock에 동기적으로 발생한다.
현재 instruction 이 끝난 후 현재 instruction 이 끝나지 못한다. 
ex) I/O devices, timer, hardware failure ex) Program: 비정상적인 조건 - illegal opcode, illegal address, divide by zero

 

 

프로그램의 Flow를 살펴보자

X 표시는 인터럽트 발생 표시

(a) 인터럽트가 없을 경우: 1 - 4 - (대기) - 5 - 2 - 4 - (대기) - 5 - 3

(b) 인터럽트가 발생, 짧은 I/O: 1 - 4 - 2a - 5 - 2b - 4 - 3a - 5 - 3b

(c) 인터럽트가 발생, 긴 I/O: 1 - 4 - 2 - (대기) - 5 - 4 - 3 - (대기) - 5

 

 

Program Timing: Short I/O Wait

Program Timing: Long I/O Wait

 

 

 

Multiple Interrupts

여러개의 인터럽트를 처리하는 방법은 두가지가 있다.

  1. Sequential Interrupt processing 순차적 처리
    • 정의: interrupt가 실행중일 때 interrupt를 비활성화 시킨다.
      • 프로세서가 새로운 interrput 요청 시그널을 무시한다. 
      • 일반적으로 보류 상태로 남아 있으며 프로세서가 interrupt를 다시 활성화 한 후에 프로세서에서 확인한다.
    • 장점: 단순한 구조
    • 단점: 상대적 우선 순위 또는 시간이 중요한 요구 사항을 고려하지 않는다.
  2. Nested interrupt processing
    • 정의: Interrupt가 발생이 되고 그에 대응되는 Interrupt Service Routine(ISR)을 실행중에 해당 Interrupt나 혹은 다른 Interrupt가 발생되는 경우 먼저 발생된 ISR을 다 마치지 않고 새로 발생된 ISR을 처리하는 것
      • interrupt의 우선순위를 정한다.
      • 낮은 우선순위의 interrupt를 수행하는 동안 더 높은 우선순위의 interrupt를 수행할 수 있다.
      • 높은 우선순위의 ISR이 interrupt되면, 현재 상태는 control stack에 push 된다.
    • 장점: 복잡한 구조 (비용이 더 든다.)
    • 단점: 우선순위를 고려하여 처리할 수 있다.

 

 

Advanced PIC (APIC) for SMP

SMP (Symmetric Multi-Processor): 다수의 CPU가 동등한 레벨에서 동등한 일을 처리하는 모델

SMP 아키텍쳐

APIC

  • 일을 시킬 CPU를 선택해야한다.
  • 대부분의 현대 시스템에서 사용된다.
  • 적절한 LOCAL APIC으로 신호를 전달한다.
  • I/O 디바이스들이 공유한다! (IRQ#1, #2...) IRQ = Intrrupt Request

LOCAL APIC (LAPIC)

  • SMP에서 각 CPU마다 하나씩 존재한다.
  • 예시로 Timer interrupt를 담당한다.
  • 모든 LAPIC는 external APIC(위의 APIC)와 연결되어 있다.

 

 

Memory Hierarchy

Memory의 요구사항 세가지 !

  1. Speed
  2. Cost
  3. Size

CPU는 빨라서 기다리게 하면 안된다.

이 세가지를 만족시켜야하는데, 쉽지않다.

그래서 사용자에게는 빠르고 사이즈가 큰 memory가 있는 것처럼 제공한다. (virtual memory)

= Cost가 낮은 메모리로 Speed가 빠른 것을 제공

 

메모리 계층 구조와 두 가지 유형의 program locality 간의 완벽한 일치로 인한 최적화

이게 무슨소리일까..

우선 locality의 정의를 보면

locality: 기억 장치 내의 정보를 균일하게 접근하는 것이 아닌 어느 한순간에 특정 부분을 집중적으로 참조하는 특성

그러니까 locality라는 특성은 메모리 어떤 부분에 접근할 때 최근에 접근한 영역이나 가장 접근하기 가까운 영역에 접근한다는 것이다.

대표적인 종류 2가지를 보자.

 

  1. Temporal locality (locality in time)
    • 참조되면 곧 다시 참조되는 경향이 있다.
    • 한번 접근이 이루어진 주소의 메모리 영역은 자주 접하게 된다는 특성
    • ex) stack
  2. Spatial locality (locality in space)
    • 참도되면 주소가 가까운 항목이 참조되는 경향이 있다.
    • 접근하는 메모리 영역은 이미 접근이 이루어진 영역의 근처일 확률이 높다는 특성
    • ex) array

Memory Hierarchy의 목표는 위에서 말했듯이

가장 낮은 수준의 메모리의 크기와 비용으로 가장 높은 수준의 메모리에 액세스 할 수있는 "가상"메모리 기술을 (환상) 제공하는 것이다.

 

 

 

Memory Hierarchy Terminology (메모리 계층 용어)

Hit

upper level 상위 레벨에서 접근한 데이터가 발견됨

Hit Rate = 상위 레벨에서 찾은 접근 비율

Hit Time = 상위 레벨에 액세스하는 데 걸리는 시간

 

Miss

하위 수준에서만 액세스 된 데이터가 발견됨

프로세서는 다음 level에서 데이터를 가져올 때까지 기다리고, 그런 다음 액세스를 다시 시작 

Miss rate = 1 – (hit rate)

 

예시)

Level 1의 액세스 시간: 0.1μs

Level 2의 액세스 시간: 1μs

메모리 액세스의 95 %가 레벨 1 (H = 0.95)에서 발견된다고 가정

바이트 액세스에 걸리는 평균 시간 T = (0.95) (0.1us) + (0.05) (0.1us + 1us) = 0.095 + 0.055 = 0.15us

 

 

 

Cache Memory

SRAM 접근시간DRAM 사이즈의 메모리에 접근하도록 보이게하는 virtual memory를 제공하는 것이 목표

  • Upper level : SRAM (small, fast, expensive)
  • lower level : DRAM (large, slow, cheap)

Additional benefits (캐시를 사용할 때 얻는 혜택 !)

  • 프로세서가 사용하는 메모리 (bandwidth) 대역폭 감소
    • -> I/O를위한 더 많은 메모리 대역폭
  • ISA를 변경할 필요 없음 (ISA: Instruction set architecture)

 

메인 메모리:  M = 2^n/K blocks
캐시 : C slots (called line) (C<<M)

C << M: M의 크기가 훨~씬 크다.

캐시는 Tag로 블록 식별이 가능하다.

 

 

 

Cache Organization

 

 

 

Directed Mapped (1-way Set)

2-way Set-Associative

I/O Communication Techniques

'CS > OS' 카테고리의 다른 글

Thread  (2) 2021.05.17
Process Scheduling 2 (미완)  (5) 2021.05.10
Process Scheduling 1  (2) 2021.05.09
Operating System Overview  (4) 2021.04.12
Computer System Overview 1  (4) 2021.03.11