[한.컴.구.프] 5장 컴퓨터 아키텍처와 운영체제-OS, page fault, 그리고 요다

Chaejung·5일 전
1

독서스터디_CS

목록 보기
4/4
post-thumbnail

이번 글은 아래 책의 일부를 읽고 난 다음, 책에는 언급되지 않은 부분에 대해 정리한 글입니다.

한 권으로 읽는 컴퓨터 구조와 프로그래밍: 더 나은 소프트웨어 개발을 위한 하드웨어, 자료구조, 필수 알고리즘 등 프로그래머의 비밀 노트

5장 컴퓨터 아키텍처와 운영체제-컴퓨터는 어떻게 프로그램과 메모리를 조직적으로 관리할까

기본적인 구조 요소들
  프로세서 코어
  마이크로프로세서와 마이크로컴퓨터
프로시저, 서브루틴, 함수
스택
인터럽트
상대주소 지정
메모리 관리 장치
가상 메모리
시스템 공간과 사용자 공간
메모리 계층과 성능
코프로세서
메모리상의 데이터 배치
프로그램 실행
메모리 전력 소비

🤔 TL;DR

  • 운영체제는 프로그램 실행, 메모리 관리, 인터럽트 처리 등을 담당하며, macOS와 Windows는 이를 각각 다른 방식으로 수행한다.
  • 가상 메모리는 메모리를 효율적으로 사용하기 위한 기술로, MMU를 통해 구현된다.
  • 한국어, 일본어, 요다의 화법은 스택과 유사한 문자 구조를 가진다.

Mac OS, UNIX, Linux, Android, iOS(IOS 아닙니다)는 대표적인 운영체제(Operating System, OS)입니다. OS는 컴퓨터를 작동시키고 운영을 관리하여 애플리케이션이 효율적으로 실행될 수 있는 환경을 제공하는 소프트웨어입니다. 특히나 메모리 관리, 스택 프로세싱, 인터럽트 처리와 같은 것들은 OS가 효율적으로 작동하기 위한 필수적인 요소들에 해당됩니다. 이를 통해 컴퓨터 아키텍처가 어떤 구조로 되어 있는지 살펴보도록 하겠습니다.

OS의 작동 방식

OS의 작동 방식을 간단하게 표현하면 다음과 같습니다.

  • 사용자 프로그램을 메모리로 읽기 → 상태 복원 → 사용자 프로그램 실행 → 타이머 인터럽트 → 사용자 프로그램 중단 → 상태 저장 → 사용자 프로그램을 메모리로 읽기 …

(206쪽) 나중에 설명할 운영체제는 다른 일반 프로그램들은 접근할 수 없는 물리적(하드웨어) 인터럽트에 접근할 수 있는 경우가 종종 있다. 운영체제는 일종의 가상 인터럽트나 소프트웨어 인터럽트 시스템을 제공하기도 한다. 예를 들어, 유닉스 운영체제는 시그널 메커니즘을 제공한다. 최근 개발된 시스템들은 보통 이를 이벤트라고 부른다.

아래는 추가로 macOS와 Windows OS에서의 작동 방식 및 인터럽트에 대해 담았습니다.

macOS에서의 작동 방식

macOS는 UNIX 기반의 XNU 커널을 사용하며, 선제적 멀티태스킹과 메모리 보호를 통해 안정적인 프로세스 관리를 제공합니다.

  1. 프로세스 관리:
    • macOS는 프로세스를 메모리에 로드하고 상태를 복원한 뒤 실행합니다.
    • 선제적 멀티태스킹을 통해 여러 프로세스를 동시에 실행하며, 각 프로세스가 서로 영향을 미치지 않도록 메모리를 보호합니다
  2. 인터럽트 처리:
    • Mach 커널과 BSD 서브 시스템으로 구성된 XNU 커널을 사용합니다. 하드웨어 인터럽트는 Mach 커널이 이벤트 기반으로 관리하며, 소프트웨어 인터럽트는 UNIX 시그널뿐만 아니라 Mach 메시지를 통해 처리되기도 합니다.
      • 시그널은 특정 프로세스에 전달되는 이벤트로, 예를 들어 SIGKILL은 프로세스를 종료하라는 요청입니다.
      • macOS 커널(XNU)은 하드웨어 인터럽트를 관리하며, 이를 통해 장치 드라이버와 시스템 호출을 조율합니다.
    • macOS는 이벤트 기반 아키텍처를 활용하여 사용자 입력(예: 마우스 클릭, 키보드 입력)을 효율적으로 처리합니다.
  3. 추가 기능:
    • macOS는 시스템 자원 관리와 보안 기능을 강화하여 안정성을 높이고, GUI 셸(Finder)을 통해 사용자 친화적인 환경을 제공합니다.

Windows에서의 작동 방식

Windows는 NT 커널을 기반으로 하며, IRQL(Interrupt Request Level)과 구조화된 예외 처리(SEH)를 통해 인터럽트를 관리합니다

  1. 프로세스 관리:
    • Windows는 프로세스를 메모리에 로드하고 상태를 복원한 뒤 실행합니다.
    • 멀티태스킹 환경에서 스케줄러가 우선순위에 따라 프로세스를 관리하며, 선점형 스케줄링 방식을 사용합니다
  2. 인터럽트 처리:
    • Windows는 NT 커널을 기반으로 하며, 하드웨어 인터럽트 처리는 APIC을 사용하여 IRQ를 관리합니다. IRQL(Interrupt Request Level)은 커널이 인터럽트의 우선순위를 조정하는 메커니즘으로 활용됩니다.
      • 높은 우선순위의 인터럽트가 먼저 처리되며, 낮은 우선순위 작업은 대기 상태로 전환됩니다.
    • 소프트웨어 인터럽트는 시스템 호출(syscall)과 INT 명령어를 통해 발생하며, 예외 처리는 별도로 SEH(Structured Exception Handling)를 통해 관리됩니다.
  3. 추가 기능:
    • Windows는 GUI 셸(Windows Explorer)을 통해 직관적인 사용자 환경을 제공하며, 다양한 API를 통해 개발자 친화적인 기능을 지원합니다

비교: 간단한 운영체제 vs macOS/Windows

특징간단한 운영체제macOSWindows
프로세스 로딩 및 실행메모리에 읽기 → 상태 복원 → 실행선제적 멀티태스킹 및 Mach 커널 기반 관리선점형 스케줄링 및 우선순위 기반 프로세스 관리
인터럽트 처리타이머 인터럽트 중심Mach 커널을 통한 인터럽트 및 IPC 처리APIC을 통한 IRQL 기반 우선순위 처리
사용자 환경단순한 프로세스 흐름Finder를 통한 GUI 제공Explorer를 통한 GUI 제공
추가 기능제한적보안 및 권한 관리 강화다양한 API와 개발자 친화적 환경
커널단순 커널XNU(하이브리드: Mach + BSD)NT 커널
멀티태스킹기본적인 멀티태스킹선제적 멀티태스킹선점형 멀티태스킹
인터럽트 처리타이머 인터럽트 중심Mach IPC, UNIX 시그널IRQL, SEH 예외 처리
메모리 관리기본적인 메모리 모델가상 메모리 및 메모리 보호페이지 기반 가상 메모리

가상 메모리와 페이지 교체 알고리즘

OS는 메모리를 관리하고 프로세스가 필요한 데이터에 효율적으로 접근할 수 있도록 지원합니다. 메모리 관리에서 중요한 개념 중 하나는 가상 메모리입니다. 가상 메모리는 물리적인 메모리 용량보다 더 큰 주소 공간을 프로세스에 제공할 수 있도록 설계된 기능으로, 메모리 관리 장치(Memory Management Unit, MMU)를 사용합니다. MMU는 CPU가 요청한 가상 주소를 page table을 통해 물리적 주소로 변환합니다. 또한 메모리 보호 기능을 제공하여 프로세스 간 메모리 접근을 제한합니다.

MMU와 RAM

특징MMURAM
기본 역할가상 메모리를 실제 메모리로 변환하고 메모리 보호 및 관리 수행데이터를 임시로 저장하여 CPU가 빠르게 접근할 수 있도록 지원
주요 기능- 가상 주소를 물리적 주소로 매핑- 메모리 보호- 캐시 관리- 버스 중재- 프로그램 실행 시 필요한 데이터와 명령을 임시 저장- 빠른 읽기/쓰기 속도 제공
위치CPU 내부 또는 별도 하드웨어로 구현컴퓨터의 메인 메모리로, 마더보드에 장착된 모듈 형태
데이터 특성변환 및 관리 대상은 가상 주소와 물리적 주소휘발성 데이터(전원이 꺼지면 내용이 사라짐)
운영체제 연계운영체제와 협력하여 가상 메모리 시스템 구현운영체제가 프로그램 데이터를 RAM에 로드하여 실행

👉 MMU는 메모리 관리와 보호를 담당하며 OS와 협력하여 효율적인 메모리 사용을 가능하게 합니다. 반면, RAM은 데이터를 임시 저장하는 공간으로, CPU가 빠르게 접근할 수 있도록 지원합니다. 두 구성 요소는 서로 보완하는 역할을 가지고 있습니다.

그런데 가상 메모리 기능으로 인해 CPU가 무효 비트로 표시된 page*에 엑세스하는 상황인, page fault가 발생합니다.

  • 📃 page: OS의 메모리 관리를 위한 가장 작은 데이터 단위, 연속적인 가상 메모리 블록이며 고정된 길이를 가짐

예를 들어 다음과 같은 상황일 경우 page fault가 발생합니다.

  • 엑세스하려고 하는 페이지가 현재 물리적 메모리(RAM)에 로드되어 있지 않고 디스크(대용량 저장장치)의 swap 영역에 있는 경우
  • 엑세스하려고 하는 페이지가 아직 할당되지 않은 경우

그동안 CPU와 OS에서는 다음과 같은 과정이 진행됩니다.

  1. CPU가 page N을 참조합니다.
  2. MMU가 page table에서 page N가 물리 메모리에 존재하지 않음을 확인합니다.
  3. CPU는 page fault 인터럽트를 발생시킵니다.
  4. OS의 page fault 핸들러가 호출됩니다.
  5. OS는 page N을 디스크에서 물리적 메모리로 로드하거나, 새 페이지를 할당합니다.
  6. page table을 업데이트하고 유효 비트를 1로 변경합니다.
  7. 원래의 명령어를 다시 실행하여 정상적으로 메모리에 접근합니다.

이렇게 page fault가 발생하면, 요청된 page를 디스크에서 메모리로 가져오게 되는데, 이 과정에서 물리적 메모리에 공간이 부족할 수 있습니다. 메모리에 올라와 있는 page를 다시 디스크로 옮겨 메모리 공간을 확보해야 합니다. 이때 어떤 page를 교체할 것인지 결정하는 알고리즘이 페이지 교체 알고리즘입니다. 페이지 교체 알고리즘은 page fault를 최소화하고 메모리 접근 속도를 최적화하는 데 기여합니다. 예를 들면, LRU(Least Recently Used), Optimal Page Replacement, FIFO(First In First Out), LFU(Least Frequently Used) 등 다양한 방법이 존재합니다.

🇰🇷 한국어는 스택과 유사한 문장 구조를 가진 언어

스택(stack)은 후입선출(Last In, First Out) 원칙을 따르는 데이터 구조며, OS에서 스택은 함수 호출, 메모리 할당, 그리고 시스템 상태 저장 등의 작업에 사용됩니다. 그런데 흥미롭게도, 자연어에서도 스택과 유사한 구조가 발견된다고 합니다.

(202쪽) 스택은 컴퓨터 언어에만 한정되지 않는다. 한국어나 일본어는 스택 기반 언어다. 명사(목적어)를 스택에 넣고 그다음에 오는 동사는 스택에 있는 명사에 작용한다. <스타워즈>에 나오는 요다의 언어 습관도 이와 같은 패턴을 따른다.

이번 장에서 가장 흥미로운 부분이었는데, 자세한 설명이 없어서 아쉬운 마음에 이번 포스팅에서 조금 덧붙여 보았습니다.

대체로 일본어를 '배우기 쉬운 언어'라고 말하는 이유는 바로, 한국어와 일본어는 공통으로 문장 구조에서 주로 주어-목적어-동사(S-O-V) 순서를 따르기 때문입니다. 이는 수식 표기법 중 후위 표기법(RPN)과 유사한 방식으로 작동합니다. 예를 들어 일반적으로 쓰이는 중위 표기법(3 * 9 + 2)과는 달리 후위 표기법(3 9 2 * +)은 사칙 연산자들이 피연산자의 후반에 등장하여, 먼저 숫자를 쌓아 두고 마지막에 연산자를 적용하는 방식입니다. 마치 한국어나 일본어 문장도 정보를 차례로 쌓아 두었다가 마지막에 동사를 적용하는 구조라는 점에서 비슷합니다.

ex)

  • 한국어: "나는 사과를 먹는다."
  • 일본어: "私はリンゴを食べます(와타시와 링고오 타베마스)."

    위 문장에서 주어(나/私), 목적어(사과/リンゴ), 동사가 순서대로 나타나며, 동사가 마지막에 위치합니다.

정리하자면, 한국어나 일본어로 문장을 만들 때는 마치 스택처럼 정보를 쌓아 올리고 마지막에 동사를 꺼내 쓰는 느낌입니다. 엄밀히 따지자면 자연어의 구조는 FORTH와 같은 프로그래밍 언어의 엄격한 스택 기반 실행 방식과는 다소 차이가 있으며 모든 S-O-V 언어가 동일한 특성을 가지는 것은 아니라고 말할 수 있습니다.

요다의 언어 습관

갑자기 왜 요다를 언급했을까 생각했는데, 아마 위에서 언급한 FORTH라는 프로그래밍 언어와 요다의 유명한 대사인 'May the force be with you'에서 force와의 언어유희가 아니었을까... 하며 요다는 어떤 말투를 가지고 있었는지 찾아보았습니다.

  1. 문장 구조의 도치(O-S-V):
    요다의 말투는 일반적인 영어 문법(S-V-O: 주어-동사-목적어)을 따르지 않고, 목적어를 먼저 말한 뒤 주어와 동사를 나중에 배치합니다. 예를 들어 "Much to learn, you still have"라는 문장에서 목적어("Much to learn")가 먼저 나오고, 주어("you")와 동사("have")가 뒤따릅니다.
  1. 정보의 축적과 처리:
    요다는 대화 중 중요한 정보를 먼저 제공하고, 나머지 요소를 뒤에 배치합니다. "Afraid, are you?"는 "Are you afraid"의 일반적인 영어 어순을 뒤집은 형태로, 감정(목적어)을 먼저 강조합니다.

OS의 통합적 이해

OS의 작동 원리부터 인터럽트, 메모리, 그리고 잠깐이나마 스택까지, 각각 독립적인 개념처럼 보이지만, 사실 이들은 서로 밀접하게 연결되어 있습니다. 메모리는 스택과 인터럽트를 지원하면, 스택은 함수 호출과 인터럽트 처리 중 상태를 저장하는 데 사용됩니다. 또한 인터럽트는 메모리와 프로세스를 효율적으로 관리하기 위한 중요한 메커니즘입니다.

OS 설계의 철학

이 모든 요소가 통합적으로 작동하도록 설계하는 것은 OS 개발자들의 주요 과제입니다. OS는 사용자의 요구와 하드웨어의 제약 조건을 만족시키기 위해 끊임없이 진화하고 있습니다. 예를 들어 Apple의 M칩 시리즈(2025.03 기준 Macbook Air에도 M4가 출시!)와 같은 SoC(System on Chip) 설계를 CPU, GPU, 메모리 등을 하나의 칩에 통합하여 성능과 에너지 효율성을 극대화했습니다. 이러한 통합 시스템은 OS와 하드웨어가 얼마나 긴밀하게 연결되어 있는지를 보여줍니다.

마무리

컴퓨터 구조에 대해 안개가 낀 부분들을 걷어낼 수 있으리라 기대하며 이 책을 읽고 있었는데요, 생각보다 가려운 부분들이 더욱 생겨나 어쩔 수 없이 별도로 궁금한 점과 이해가 되지 않은 점을 추가로 찾아보고 정리하는 시간을 갖게 되었습니다. 그리고 더불어 밑바닥부터 만드는 컴퓨팅 시스템도 함께 읽고 있는데, 이 책은 보다 구조적이라 이해를 빠르게 할 수 있어 컴퓨터 구조를 공부하는 데 큰 도움이 되고 있습니다. 다음은 '입출력과 네트워킹'에 대한 부분을 읽을 차례인데, 아무래도 프론트엔드다 보니 더 흥미롭게 읽을 수 있지 않을까 한 번 더 기대를 걸어보도록 하겠습니다.

profile
프론트엔드 기술 학습 및 공유를 활발하게 하기 위해 노력합니다.

1개의 댓글

comment-user-thumbnail
2일 전

chaejung님 잘 읽고 가요! 요다라니 새롭군요 확실히 책이 뭔가 깊으면서도 어설픈 느낌의 책이에요 밑바닥부터 만드는 컴퓨팅 시스템 책도 사서 한번 읽어봐야겠군요 잘 읽고 갑니다!

답글 달기

관련 채용 정보