하마코

[CS] 운영체제 - 인터럽트, 시스템콜, 페이지폴트, 페이지히트/미스, 페이지교체 알고리즘 본문

DEV/Computer Science

[CS] 운영체제 - 인터럽트, 시스템콜, 페이지폴트, 페이지히트/미스, 페이지교체 알고리즘

hamaco.dev 2025. 5. 4. 22:00

안녕하세요! 하마코입니다. 😊

 

프로그램 설계, 사용 시 꼭 알아야하는 운영체제 !

운영체제는 컴퓨터 자원을 효율적으로 관리하고 사용자와 하드웨어 사이를 이어주는 소프트웨어인데요.

과정을 그림그리듯 정리해보면 이해가 잘 되더라고요!

 

오늘도 열심히 공부해보겠습니다. 👩🏻‍💻

 


 

운영체제와 컴퓨터 시스템의 구조

운영체제하드웨어와 소프트웨어 사이에서 자원 관리, 프로세스 관리, 메모리 관리, 파일 시스템 등을 담당해요!

운영체제는 하드웨어 위에 깔려있어서, 위의 응용 프로그램들이 잘 작동하도록 도와주는 '중간 관리자' 역할을 합니다.

 

컴퓨터 시스템은 보통 아래와 같은 구조로 이루어져 있습니다.

  • 하드웨어 : CPU, 메모리, I/O 장치
  • 운영체제 : 자원 관리, 사용자 프로그램 실행 보조
  • 시스템 프로그램 : 컴파일러, 에디터 등
  • 응용 프로그램 : 브라우저, 게임, 메신저 등 프로그램

 

인터럽트 Interrupt

인터럽트는 어떤 신호가 들어왔을 때 CPU가 실행 중인 작업을 잠시 멈추고, 더 중요한 작업을 처리하는 것을 말합니다.

CPU는 메모리에 있는 명령어를 순차적으로 실행하는데, 인터럽트가 발생되면 인터럽트 핸들러 함수(ISR)가 모여있는

인터럽트 벡터로 가서 ISR이 실행되며 특정 명령어를 실행합니다.

이후, 인터럽트가 종료되면 다시 순차적으로 실행하게 됩니다.

 

인터럽트는 아래 상황들에서 발생합니다.

  • 0으로 숫자를 나누는 연산 오류
  • 프로세스 오류
  • 키보드, 마우스 등 I/O 디바이스를 사용할 때
  • 우선순위가 높은 프로세스 발생 

인터럽트의 종류

1> 하드웨어 인터럽트

: I/O 디바이스 등 하드웨어에서 발생하는 인터럽트

- 예시) 마우스 기반 버튼 클릭, 디스크에서 파일 읽기, 쓰기 작업 완료 등

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

: 프로세스 오류, 프로세스 시작/종료 등을 기반으로 프로세스에서 발생하는 인터럽트

- 특징) 하드웨어 인터럽트보다 우선순위가 높은 인터럽트

 

 

시스템 콜과 modebit

시스템 콜을 알아보기 전에, 운영체제에 필수적인 커널을 먼저 알아볼게요!

 

커널은 운영체제의 심장 같은 핵심 부분이자 시스템 콜을 제공하는 곳인데요.

보안, 메모리 관리, CPU 스케줄링, 프로세스, 파일 시스템, I/O 제어 등 운영체제의 중추 역할을 합니다.

키보드를 눌렀을 때 커널이 키보드 장치 드라이버를 통해 입력을 받고,

파일을 열려고 하면 파일 시스템을 통해 디스크로 데이터를 읽는 것도 모두 커널의 일이에요!

그럼 커널과 CPU의 차이는?

저는 공부하다가 그럼 커널과 CPU가 하는 일이 어떻게 다른데?가 궁금하더라고요. 공부해보니 너무 달랐어요.

CPU는 진짜 일을 하는 뇌여서 명령을 계산하고 처리하는 컴퓨터의 실행을 담당하고,

커널은 그 CPU에게 "무슨 일부터 어떻게 처리할지"를 알려주더라고요!

CPU가 처리할 수 있도록 명령을 정리해서 전달하는 팀장으로 이해하면 될 것 같습니다.

 

커널 함수는 커널 안에 있는 여러개의 함수, 커널이 제공하는 함수를 의미합니다.

즉, 운영체제가 제공하는 특수한 기능을 사용할 수 있도록 정리된 함수에요!

사용자 함수에 printf() 등이 있다면, 커널 함수에는 read(), exec() 등이 있습니다.

 

모드 mode

컴퓨터에는 보안상 두 가지 모드가 있습니다.

구분 설명 쓰는 곳
유저 모드 (User Mode) 제한된 권한 일반 앱
커널 모드 (Kernel Mode) 모든 권한을 가짐 운영체제 (Window, Mac, Android, ...)

 

모드는 OS의 처리가 필요할 때 유저 모드에서 커널모드로 바뀌는데요!

read() 함수로 파일을 읽고 싶을 때 클릭은 유저가 하지만 클릭했다는 정보나 실제 읽는 것은 OS가 하니까 커널 모드로 전환됩니다.

 

모드 관리를 위한 권한 확인은 modebit로 확인할 수 있는데요.

  • 0 : 커널 모드
  • 1 : 유저 모드

위의 두 가지 상태값으로 CPU 내부에서 하드웨어적으로 모드를 구분해서 보안/안정성을 지킵니다.

 

시스템 콜(호출) System Call

시스템 콜운영체제가 커널에 접근하기 위한 인터페이스입니다.

사용자 프로그램이 하드웨어에 직접 접근하지 못하도록, 운영체제는 시스템 콜이라는 인터페이스를 제공하는데요.

파일 읽기, 쓰기, 종료 등을 포함하여 프로세스 관리, 파일/디바이스 관리 등은 모두 시스템 콜을 통해 실행됩니다.

 

시스템 콜 과정은 다음과 같습니다.

1. 유저 프로그램이 I/O 요청 트랩(소프트웨어 인터럽트)을 발동

2. 올바른 I/O 요청인지 확인

3. 유저 모드가 시스템 콜을 통해 커널모드로 변환

4. 커널함수 실행

 

😊 장점

유저 프로그램은 시스템 콜을 기반으로 커널과 분리가 되기에,
복잡한 파일 시스템과 프로세스 생성 등에 대한 내부동작을 신경 쓸 필요가 없어집니다.

또한, OS의 관리하에 프로그램이 운영되기에 시스템의 안정성, 보안이 강화됩니다.

 

 

메모리 계층 구조

메모리는 컴퓨터시스템의 성능 향상을 위해 속도와 용량에 따라 다음처럼 계층적으로 구성되어 있습니다.

  1. 레지스터 (가장 빠르고, 가장 비쌈)
  2. 캐시 메모리 (CPU 내부/가까이)
  3. 주기억장치=RAM (흔히 말하는 메모리)
  4. 보조기억장치 (HDD, SSD 등)
  5. 백업스토리지 (테이프, 외장하드 등)

🤔 계층있으면 뭐가 좋아요?

  • 더 빠른 접근 & 처리 속도 증가
    : 보통 많이 쓰는 것을 더 많이 쓰기에 특정 데이터에 많이 접근하게 되는데, 캐시 메모리에 해당 데이터가 있다면 데이터에 빠른 접근이 가능해서 처리 속도도 증가
  • 비용의 효율성
    : 캐시메모리는 비싸고 RAM 아래로 갈 수록 비용은 저렴하기에, 계층이 있고 캐싱이 가능해서 비용을 효율적으로 사용 가능
  • 자원의 효율적 사용
    : 자주 접근하는 데이터는 빠른 메모리에, 덜 접근하는 데이터는 느린 메모리에 저장하여 자원을 효율적으로 사용

 

가상메모리

가상메모리(Virtual Memory)는 컴퓨터가 실제로 이용가능한 메모리 자원을 추상화하여

논리적으로 사용자에게 매우 큰 메모리로 보이게 만드는 메모리 관리 기법입니다.

프로그램은 자신이 메모리 전체를 쓰는 것처럼 동작하지만, 실제로는 필요한 일부만 메모리에 올라와 있습니다.

 

페이지테이블

가상 메모리는 가상주소가 있는데요! 이것을 실제 물리 주소로 매핑되어있는 자료구조 "페이지테이블"로 관리합니다.

* 가상 공간은 페이지, 물리 공간은 프레임 단위로 관리합니다.

 

각 프로세스는 자신만의 가상 주소 공간을 가지고 있는데요.

예를 들어, 프로세스 A는 0x0000, 프로세스 B는 0x1000이라는 주소를 쓴다고 해도

실제 메모리(RAM)에서는 전혀 다른 위치에 저장됩니다. 그리고 가상주소와 물리주소는 페이지테이블에서 매핑을 확인합니다.

  • ex. A가 사용하는 가상주소 0x0000 > 실제 물리주소 0x2000에 저장
  • ex. B가 사용하는 가상주소 0x1000 > 실제 물리주소 0x3000에 저장

만약 프로세스 A, B를 종료했다가 다시 실행하면 운영체제는 새로운 가상 주소 공간을 할당합니다.

그래서 주소가 예전과 같을 수도 있고, 다를 수도 있습니다.

 

페이지폴트

페이지폴트는 프로세스가 참조하려는 주소가 가리키는 페이지가 물리 메모리(RAM)에 없을 때 발생하는 현상입니다.

 

CPU가 어떤 데이터를 읽으려고 할 때 해당 데이터가 메모리가 아닌 디스크에 있을 경우,

가상 메모리 페이지가 없는 페이지폴트(Page Fault)가 발생합니다.

운영체제는 이때 디스크에서 해당 페이지를 메모리로 가져오고, 다시 명령을 수행하게 만듭니다.

 

페이지폴트 이후의 과정은 다음과 같습니다.

  1. 페이지폴트 이후 OS에게 트랩(소프트웨어 인터럽트) 전송
  2. OS는 페이지폴트가 유효한 접근인지 점검 - 비정상적 접근이라면 프로세스 강제 종료
  3. OS는 물리 메모리에서 빈 프레임이 있는지 확인하고
    1. 빈 프레임이 있을 경우) 디스크에서 필요한 페이지를 메모리로 바로 가져와 적재 (Swap-in)
    2. 빈 프레임이 없을 경우) 기존의 한 페이지를 선택해서 내보내고 (Swap-out) 빈 프레임 확보 후 필요한 페이지를 디스크에서 메모리로 가져옴 (Swap-in)

 

스레싱

스레싱은 실제 프로세스 실행보다 스와핑 작업에 대부분의 시간이 소요되는 현상입니다.

페이지폴트가 빈번하게 발생하면, 필요한 데이터를 디스크에서 메모리로 불러오는 과정이 잦아지는데,

그러면 CPU가 실제 연산을 수행하기보다 스와핑 대기 상태에 머무르게 됩니다.

 

운영체제는 CPU의 낮은 사용률을 보완하고자 추가 프로세스를 메모리에 적재하게 되는데,

이렇게 되면 이미 부족한 메모리 자원을 더욱 압박해서 페이지폴트가 더욱 빈번해집니다.

그래서 시스템 전체의 성능이 급격히 저하되는 스레싱 현상이 나타납니다.

[출처] GeeksforGeeks

 

스레싱을 운영체제에서 해결하는 방법😲은 아래 방법이 있습니다.

  • 작업세트(Working Set) : 프로세스의 과거 사용이력을 기반으로 많이 사용하는 페이지집합을 만들어 한꺼번에 미리 메모리에 로드하는 것
  • PFF(Page Fault Frequency) : 각 프로세스의 페이지 폴트 발생 빈도를 모니터링하여, 메모리 프레임의 할당량을 동적으로 조절하는 방식
  • 상한선 초과 : 프로세스의 페이지 폴트 빈도가 상한선에 도달하면, 해당 프로세스에 더 많은 프레임 할당
  • 하한선 미달 : 프로세스의 페이지 폴트 빈도가 하한선에 도달하면, OS는 일부 프레임을 회수하여 다른 프로세스에 재할당

😊 가상 메모리 장점

장점 내용
메모리 효율적 사용 가상 메모리는 프로그램 실행 시 모든 데이터를 한꺼번에 메모리에 적재하지 않고 필요한 시점에 페이지만 동적으로 불러옴 = Demand Paging(요구페이징)
메모리 과잉 할당 각 프로세스에 가상 주소 공간을 넉넉하게 할당
⇢ 실제 RAM보다 훨씬 큰 주소 공간을 사용할 수 있음
프로세스 간 메모리 보호 각 프로세스는 독립적인 가상 주소 공간을 가짐,
동일한 가상 주소라도 서로 다른 물리 메모리 영역에 매핑
메모리 접근 제어 가상 메모리는 메모리를 일정한 크기의 페이지로 나누어 관리
⇢ 권한없는 접근 시도가 즉시 감지되고 차단되어 보안 위협 예방

 

페이지히트/미스

  • 페이지 히트 (Page Hit) : 프로세스가 요청한 해당 페이지가 이미 메모리에 적재되어 있어 바로 접근할 수 있는 상황
  • 페이지 미스 (Page Miss) : 프로세스가 요청한 해당 페이지가 메모리에 없는 상황

페이지 미스는 종종 페이지 폴트를 초래할 수 있습니다.

페이지폴트는 요청된 페이지가 메모리 없어서 메모리로 로드해야하는 상황을 의미하는데,

모든 페이지폴트는 페이지 미스로 인해 발생하지만 모든 페이지 미스가 페이지폴트로 이어지는 것은 아닙니다!

접근 권한 오류, 성능최적화를 위해 미리 로드할 때의 페이지 미스는 페이지폴트로 이어지지 않습니다.

 

페이지교체 알고리즘

스와핑(Swap-in, Swap-out)이 일어날 때 페이지교체 알고리즘에 의해 페이지가 교체되고,

이 알고리즘들은 최대한 스와핑을 적게하는 것을 목표로 합니다.

 

오프라인 알고리즘 (Longest Forward Distance, LFD)

페이지교체 알고리즘 중 가장 좋은 알고리즘이라고 일컫는 알고리즘이며,

1) 더 이상 참조되지 않거나 2) 가장 늦게 다시 참조되는 페이지와 지금 요청된 페이지를 바꾸는 알고리즘입니다.

이론적으로는 최적이지만, 실제 시스템에서는 미래의 요청을 알 수 없기 때문에 실제 구현은 불가능한 알고리즘입니다.

페이지 참조 순서 : 1, 2, 3, 4, 1, 2, 5, 1, 2, 3
메모리 최대 페이지수 : 3개
-
123 은 빈 프레임에 들어가고 4는 세 개 중 하나에 들어가야하는데, 1은 5번째, 2는 6번째, 3은 10번째에서 사용되기 때문에 가장 늦게 사용되는 3이 있는 자리에 4가 들어갑니다.

 

FIFO (First In First Out)

가장 먼저 온 페이지부터 교체하는 방법입니다.

페이지 참조 순서 : 1, 3, 0, 3, 5, 6, 3
메모리 최대 페이지수 : 3개
-
(1) 1 (2) 13 (3) 130 (4) 130 (5) 530 (6) 560 (7) 563

 

LRU (Least Recently Used)

최근에 사용되지 않은 페이지를 바꾸는 방법입니다. 즉, 참조한지 오래된 페이지를 바꿉니다.

페이지 참조 순서 : 7, 0, 1, 2, 0, 3, 0, 4
메모리 최대 페이지수 : 4개
-
~(4) 7012 (5) 7012 (6) 3012 (7) 3012 (8) 3042

 

NUR (Not Used Recently)

clock 알고리즘이라고 하며, 0과 1을 가진 비트를 두어 1은 최근에 참조되었고 0은 참조되지 않음을 의미합니다.

만약 한 바퀴를 도는 동안 사용되지 않으면 0이 됩니다.

시계 방향으로 돌면서 0을 찾고, 0을 찾은 순간 해당 페이지를 교체하고 해당 부분을 1로 바꾸는 알고리즘입니다.

 

LFU (Least Frequently Used)

가장 참조 횟수가 적은 페이지를 교체하는 알고리즘입니다.

페이지 참조 순서 : 0, 1, 2, 0, 0, 1, 2, 3
메모리 최대 페이지수 : 3개
-
~(3) 012 (4) 012 (5) 012 (6) 012 (7) 012 (8) 032 (참조횟수 적은 1과 스와핑)

 


 

오늘은 개발자의 필수 지식 중 하나인 운영체제에서

가상 메모리와 관련된 내용들을 공부해보았습니다!

도움이 되셨다면 좋아요, 댓글 남겨주세요!

 

긴 글 읽어주셔서 감사합니다. :)

HAMACO