OS

[운영체제] 저장장치(Storage) 란? 캐싱(Cashng) 이란? 인터럽트(Interrupt) 란?

ch010104 2025. 3. 17. 18:34

1. 저장장치(Storage) 란?

컴퓨터에서 데이터를 저장하고 관리하는 저장장치는 여러 계층으로 구성됨.

저장장치는 속도(speed), 비용(cost), **휘발성(volatility)**을 기준으로 계층을 나눌 수 있음.

 

1. 주기억장치(Main Memory)

  • CPU가 직접 접근할 수 있는 저장 매체로, 운영체제(OS)와 실행 중인 프로그램의 데이터를 저장하는 역할을 함.
  • 대표적으로 **RAM(Random Access Memory)**이 있으며, 이는 휘발성 메모리로 전원이 꺼지면 저장된 데이터가 사라짐.
  • RAM은 속도가 빠르지만, 저장 용량이 한정적이며 비싸다는 단점이 있습니다.

2. 2차 저장장치(Secondary Storage)

  • 비휘발성 저장장치로, 전원이 꺼져도 데이터가 유지
  • 주요 저장장치 유형
    • HDD(Hard Disk Drive): 기계적인 회전판을 이용하여 데이터를 저장하는 방식으로, 비교적 저렴하지만 속도가 느림.
    • CD/DVD, Tape: 주로 백업 및 데이터 저장 용도로 사용.
    • Flash Memory 기반 저장장치
      • USB Drive: 휴대성이 뛰어나며 빠른 데이터 전송이 가능함.
      • Memory Card: 카메라, 스마트폰 등의 저장 장치로 사용됨.
      • SSD(Solid State Drive): 플래시 메모리를 사용하여 데이터를 저장하며, HDD보다 빠르고 내구성이 뛰어남.

3. 저장장치 계층 구조

저장장치 계층 구조

1) 휘발성에 따른 구분

  • 휘발성: registers, cache, main memory는 휘발성으로 전원이 꺼지면 내용이 사라짐
  • 비휘발성: electornic disk, magnetic disk, optical disk, magentic tapes 등은 비휘발성으로 전원이 꺼져도 내용을 유지

2) 접근 시간에 따른 구분

  • 접근 시간: 메모리에 읽기, 쓰기에 걸리는 시간
  • 저장장치 계층 구조에서 위로 올라갈 수록 접근이 더 빠르고, 아래로 내려갈 수록 접근이 느리다.
  • registers > cache > main memory > electornic disk > magnetic disk > optical disk > magentic tapes

-> 일반적으로 휘발성 메모리가 비휘발성 메모리에 비해 접근 시간이 더 빠름.

 

3) 가격에 따른 구분

  • 한 비트를 저장할 때 드는 가격에 따라 구분 가능
  • 저장장치 계측 구조에서 위로 올라갈 수록 가격이 비싸고, 아래로 내려갈 수록 가격이 싸다.
  • registers > cache > main memory > electornic disk > magnetic disk > optical disk > magentic tapes

-> 일반적으로 휘발성 메모리가 비휘발성 메모리에 비해 더 비쌈.

  • CPU ↔ 캐시 ↔ 메인 메모리 간 데이터 전송은 운영체제 개입 없이 하드웨어적으로 이루어짐.
  • 디스크 ↔ 메인 메모리 간 데이터 전송운영체제(OS)에 의해 수행됨.

2. 캐싱(Caching) 이란?

1. 캐싱의 개념

  • **캐싱(Caching)**은 자주 사용되는 데이터를 느린 저장장치에서 빠른 저장장치로 임시 복사하여 접근 속도를 높이는 기술
  • 이때, 빠른 저장장치를 **캐시(Cache)**라고 부릅니다.
    - 만약, main memory의 데이터를 registers에 캐싱했을 경우, 캐시는 registers임
  • CPU는 데이터가 필요할 때, 먼저 캐시를 확인하고, 캐시에 있으면 빠르게 데이터를 가져옴
  • 만약 캐시에 없으면 원본 저장장치에서 데이터를 읽어 캐시에 복사한 후 사용

2. 캐시 크기와 교체 정책

  • 캐시는 용량이 제한되어 있어 무제한으로 데이터를 저장할 수 없음.
  • 캐시가 가득 찼을 때, 새로운 데이터를 저장하려면 기존 데이터를 제거해야 함.
  • 어떤 데이터를 제거할지 결정하는 방법을 **교체 정책(Replacement Policy)**이라고 합니다.
  • 대표적인 교체 정책:
    • FIFO(First-In, First-Out): 가장 먼저 들어온 데이터를 먼저 제거.
    • LRU(Least Recently Used): 가장 오랫동안 사용되지 않은 데이터를 제거.
    • LFU(Least Frequently Used): 사용 빈도가 가장 낮은 데이터를 제거.

3. 인터럽트(Interrupt) 란?

1. 운영체제의 수행 과정

 

 

운영체제는 인터럽트에 의해 수행됨. 

컴퓨터 시스템의 메모리는 ROM과 RAM으로 구성되며, 0번지부터 메모리를 읽는 CPU의 경우 메모리의 첫 부분에 ROM, 뒷 부분에 RAM이 위치함.

ROM의 시작부분에는 boot loader라는 프로그램이 저장되어 있어, 전원을 키게 되면 0번지의 boot loader를 수행하게 됨.

**전원이 켜지게 되면, PC 레지스터 값이 0으로 초기화되어 boot loader가 실행되고, CPU의 모드는 커널모드(상태 레지스터의 모드 비트가 0)로 초기화 됨** -> boot loader가 커널모드에서 실행

 

** boot loader가 하는 일 **

  • 시스템 초기화 및 테스트(메모리, 기본입출력장치등)
  • 운영체제 파일을 보조기억장치(하드디스크)에서 읽어들여 메모리에 적재(load)하고 실행을 시작시킴

운영체제의 수행 과정

  • 전원이 켜지면 boot loader가 하드디스크에 있는 OS(운영체제) 프로그램을 메모리의 RAM에 로드함(캐싱과 다름!!)
  • 위의 그림에선 RAM이 1000번지부터 실행하고, OS 프로그램을 1000번지의 주소에 로드함. 
  • 이후에 boot loader가 CPU의 PC에 OS 프로그램의 1000번지 주소를 저장시킴. -> 자동적으로 CPU는 1000이라는 주소의 프로그램(OS 프로그램)을 실행함
  • 운영체제 프로그램은 **시스템을 초기화**, **CPU의 모드를 사용자 모드로 전환**, **최초의 프로그램을 시작(유닉스의 경우, init 프로그램)** 을 수행함.

2. 인터럽트 개념

컴퓨터 시스템에서 CPU는 여러 작업을 동시에 처리해야 함.

**인터럽트(Interrupt)**는 CPU가 특정 이벤트가 발생했음을 감지하고 적절한 처리를 수행할 수 있도록 하는 중요한 개념!!!

보통의 운영체제는 이러한 인터럽트에 의해서 수행됨.

  • CPU에게 특정 사건이 발생했음을 알리는 메커니즘.
  • CPU는 미리 정의된 인터럽트만 처리할 수 있으며, 보통 수십~수백 개의 인터럽트가 존재합니다.
  • 프로그램 실행 중 인터럽트가 발생하면 CPU는 현재 작업을 중단하고, **인터럽트 서비스 루틴(Interrupt Service Routine, ISR)**을 수행.

3. 인터럽트의 유형

(1) 하드웨어 인터럽트

  • **입출력 장치(I/O Device)**가 CPU에 특정 작업이 끝났음을 알리는 역할을 함.
    • 예: 키보드 입력, 마우스 클릭, 프린터 완료 신호 등
    • 입출력 장치에서 버스를 통해 CPU에게 "나 입출력 끝났어!!" 등의 신호를 보냄
  • 타이머 장치가 일정한 시간마다 인터럽트를 발생시켜 시스템 시간을 업데이트하거나 멀티태스킹을 수행하도록 함.

(2) 소프트웨어 인터럽트 (트랩, trap)

  • 프로그램 실행 중 발생하는 인터럽트로, **트랩**이라고도 부름
  • 프로그램 오류: 0으로 나누기, 메모리 주소 참조 오류 등
  • 사용자 요청(system call): 파일 열기, 읽기, 쓰기 등의 시스템 호출

**CPU가 어떤 일을 수행하던 도중에 인터럽트를 받을 경우 CPU는 현재 수행하던 일을 중단하고 인터럽트 서비스 루틴(ISR)을 수행 -> 이후에 다시 기존에 수행하던 작업으로 복구**

-> 인터럽트서비스루틴(Interrupt Service Routine, ISR) : 운영체제 내부의 코드 

 

4. 인터럽트 벡터

인터럽트 벡터의 구조

 

(1) 인터럽트 벡터 테이블

  • 각 인터럽트에는 고유한 번호(보통 1~256개)가 할당됨.
  • 인터럽트 벡터(Interrupt Vector): 인터럽트 발생 시 실행할 ISR의 시작 주소.
  • 인터럽트 벡터 테이블(Interrupt Vector Table, IVT): 메모리의 특정 위치에 저장된 ISR 주소 목록.
  • CPU가 인터럽트 신호를 받으면 그 신호에 해당하는 ISR 함수가 어디에 있는지 ISR 함수의 주소를 여기서 찾음
  • 컴퓨터가 부팅될 때 운영체제(OS)가 초기화하여 ISR 주소를 설정.
    ->  인터럽트 벡터 테이블(메모리 5500번지부터 시작)의 INT 1의 벡터 = 1500번지(INT 1의 ISR이 있는 실제 주소) 라고 초기화 

(2) 운영체제

  • CPU가 받은 인터럽트 신호에 대한 실제 운영체제 프로그램의 함수가 저장되어 있음
  • 어느 위치에 저장되어 있는지는 인터럽트 벡터 테이블에 저장됨 

5. 인터럽트 발생 시 처리 과정

  • 아까, 인터럽트는 CPU가 수행 중인 작업을 중지하고 ISR을 수행한다고 했음. 그러면, ISR을 마친 후에 CPU는 다시 이전에 수행 중인 작업으로 돌아가야함!!
  • 이를 위해서 이전 CPU의 PC 값, 레지스터에 저장된 값을 일시적으로 다른 곳에 저장해 놨다가 다시 불러와서 복원함.
  • CPU는 사용자 모드에서 수행을 하다가 인터럽트를 받고 커널 모드로 전환함. 이후에 ISR 이후에 복원 과정에서 다시 사용자 모드로 전환함.

(1) 하드웨어적 처리

  • 인터럽트가 발생하면 CPU가 자동으로 수행하는 작업들(즉, CPU가 신호를 받으면 스스로 처리함)
  • 이 과정에서 인터럽트 벡터 테이블(IVT)을 참조하여 ISR(인터럽트 서비스 루틴)을 실행함
  • 하드웨어적 처리는 매우 빠르게 처리됨
  1. 상태 레지스터(Status Register) 값 저장: 현재 실행 중인 작업의 상태 저장.
    - 인터럽트 발생 전에 현재 프로그램의 상태를 저장 (CPU 모드, 인터럽트 플래그 등)

  2. 프로세서 모드를 커널 모드로 변경: CPU가 운영체제의 코드를 실행할 수 있도록 모드 변경.
    - 상태 레지스터의 모드 비트 변경 (User Mode(1) → Kernel Mode(0))

  3. PC(Program Counter) 레지스터 값 저장: 현재 실행 중인 명령어의 주소를 저장하여 이후 다시 실행 가능하게 함.
    - 인터럽트가 발생한 지점을 다시 돌아갈 수 있도록 현재 PC 값 저장

  4. 인터럽트 벡터 테이블(Interrupt Vector Table)에서 ISR 주소를 읽어 PC 레지스터에 저장: 인터럽트 발생 시 수행할 코드를 설정.
    - 이후 소프트웨어적 처리에서 ISR 함수를 실제로 처리

(2) 소프트웨어적 처리 (운영체제 수행)

  • 운영체제(OS)가 인터럽트를 본격적으로 처리하는 과정
  • ISR(인터럽트 서비스 루틴)이 실행되며, 필요한 작업을 수행함
  1. CPU 레지스터 값 저장 (메모리에 저장)
    - 현재 실행 중인 프로세스의 레지스터 값(일반 레지스터, 스택 포인터 등)을 저장
    - 다음에 다시 실행할 때 원래 상태로 복구할 수 있도록 보관

  2. 인터럽트 서비스 루틴(ISR) 수행
    - 운영체제(OS)의 **인터럽트 서비스 루틴(ISR)**이 실행됨
    - 예시:
    1)키보드 입력 → 키 입력 값을 버퍼에 저장,
    2) 네트워크 패킷 수신 → 수신된 패킷을 메모리에 저장,
    3) 타이머 인터럽트 → 프로세스 스케줄링 수행

  3. CPU 레지스터 값 복원 (저장된 값들을 다시 CPU에 로드)
    - 인터럽트 발생 전의 CPU 상태를 복구
    - 메모리에 저장된 레지스터 값을 다시 CPU로 불러옴

  4. 상태 레지스터 값 복원 (CPU 모드를 원래 상태로 변경)
    - User Mode로 복귀 (필요한 경우)
    - 원래 실행하던 프로세스의 상태를 복원

  5. PC 레지스터 값 복원 (인터럽트가 발생하기 전 수행 중이던 코드로 복귀)
    - 인터럽트 발생 전 실행 중이던 프로그램으로 돌아가 계속 실행됨
  • 인터럽트가 발생하면 하드웨어적 처리가 먼저 수행된 후, **운영체제(OS)**가 이를 처리.

** 궁금증 ** 

  • 인터럽트 발생 시 저장 순서:
    상태 레지스터 → 모드 변경 → PC 레지스터 → CPU 레지스터
  • 인터럽트 복귀 시 복원 순서:
    CPU 레지스터 → 상태 레지스터(모드 변경) → PC 레지스터

Q. 저장 순서와 복원 순서가 왜 정확히 역순이 아닐까?? 복원할 때 CPU 레지스터 다음에 PC 레지스터를 복원하고, 마지막에 상태 레지스터로 사용자 모드로 돌아오면 안될까??

 

A. 왜 PC 레지스터를 마지막에 복원해야 할까?

PC(Program Counter)는 CPU가 실행할 명령어의 주소를 저장하는 레지스터이기 때문

  • 만약 PC를 먼저 복원하면, CPU가 잘못된 상태에서 실행될 가능성이 있음.
    - PC가 복원되자마자 사용자 모드로 변경 전에 이전 작업을 바로 수행할 가능성이 있음 
  • 따라서 모든 상태가 복원된 후 마지막에 PC를 복원하여 정상적으로 실행을 재개해야 함.

** 잘못된 복원 순서가 초래하는 문제점 **

문제 1: CPU가 복원되지 않은 상태에서 실행될 위험

  • PC를 먼저 복원하면, CPU는 즉시 해당 주소의 명령어를 실행
  • 하지만 CPU 레지스터들이 아직 복원되지 않았다면, 잘못된 상태에서 실행될 가능성이 높음

문제 2: 사용자 모드 전환 전에 실행될 경우 보안 문제 발생

  • CPU가 커널 모드에서 실행 중인데, 사용자 모드 코드가 실행되면 보안 위험 발생
  • 따라서 모든 상태가 복원된 후에 PC를 복원하는 것이 안전함

-> 이러한 문제를 방지하기 위해, 인터럽트 복귀 순서는 반드시 "CPU 레지스터 → 상태 레지스터 → PC 레지스터" 순서로 진행됨.