이번 글은 아래 책의 일부를 읽고 난 다음, 책에는 언급되지 않은 부분에 대해 정리한 글입니다.
한 권으로 읽는 컴퓨터 구조와 프로그래밍: 더 나은 소프트웨어 개발을 위한 하드웨어, 자료구조, 필수 알고리즘 등 프로그래머의 비밀 노트
5장 컴퓨터 아키텍처와 운영체제-컴퓨터는 어떻게 프로그램과 메모리를 조직적으로 관리할까
기본적인 구조 요소들 프로세서 코어 마이크로프로세서와 마이크로컴퓨터 프로시저, 서브루틴, 함수 스택 인터럽트 상대주소 지정 메모리 관리 장치 가상 메모리 시스템 공간과 사용자 공간 메모리 계층과 성능 코프로세서 메모리상의 데이터 배치 프로그램 실행 메모리 전력 소비
🤔 TL;DR
- 운영체제는 프로그램 실행, 메모리 관리, 인터럽트 처리 등을 담당하며, macOS와 Windows는 이를 각각 다른 방식으로 수행한다.
- 가상 메모리는 메모리를 효율적으로 사용하기 위한 기술로, MMU를 통해 구현된다.
- 한국어, 일본어, 요다의 화법은 스택과 유사한 문자 구조를 가진다.
Mac OS, UNIX, Linux, Android, iOS(IOS 아닙니다)는 대표적인 운영체제(Operating System, OS)입니다. OS는 컴퓨터를 작동시키고 운영을 관리하여 애플리케이션이 효율적으로 실행될 수 있는 환경을 제공하는 소프트웨어입니다. 특히나 메모리 관리, 스택 프로세싱, 인터럽트 처리와 같은 것들은 OS가 효율적으로 작동하기 위한 필수적인 요소들에 해당됩니다. 이를 통해 컴퓨터 아키텍처가 어떤 구조로 되어 있는지 살펴보도록 하겠습니다.
OS의 작동 방식을 간단하게 표현하면 다음과 같습니다.
(206쪽) 나중에 설명할 운영체제는 다른 일반 프로그램들은 접근할 수 없는 물리적(하드웨어) 인터럽트에 접근할 수 있는 경우가 종종 있다. 운영체제는 일종의 가상 인터럽트나 소프트웨어 인터럽트 시스템을 제공하기도 한다. 예를 들어, 유닉스 운영체제는 시그널 메커니즘을 제공한다. 최근 개발된 시스템들은 보통 이를 이벤트라고 부른다.
아래는 추가로 macOS와 Windows OS에서의 작동 방식 및 인터럽트에 대해 담았습니다.
macOS는 UNIX 기반의 XNU 커널을 사용하며, 선제적 멀티태스킹과 메모리 보호를 통해 안정적인 프로세스 관리를 제공합니다.
Windows는 NT 커널을 기반으로 하며, IRQL(Interrupt Request Level)과 구조화된 예외 처리(SEH)를 통해 인터럽트를 관리합니다
특징 | 간단한 운영체제 | macOS | Windows |
---|---|---|---|
프로세스 로딩 및 실행 | 메모리에 읽기 → 상태 복원 → 실행 | 선제적 멀티태스킹 및 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
특징 MMU RAM 기본 역할 가상 메모리를 실제 메모리로 변환하고 메모리 보호 및 관리 수행 데이터를 임시로 저장하여 CPU가 빠르게 접근할 수 있도록 지원 주요 기능 - 가상 주소를 물리적 주소로 매핑- 메모리 보호- 캐시 관리- 버스 중재 - 프로그램 실행 시 필요한 데이터와 명령을 임시 저장- 빠른 읽기/쓰기 속도 제공 위치 CPU 내부 또는 별도 하드웨어로 구현 컴퓨터의 메인 메모리로, 마더보드에 장착된 모듈 형태 데이터 특성 변환 및 관리 대상은 가상 주소와 물리적 주소 휘발성 데이터(전원이 꺼지면 내용이 사라짐) 운영체제 연계 운영체제와 협력하여 가상 메모리 시스템 구현 운영체제가 프로그램 데이터를 RAM에 로드하여 실행 👉 MMU는 메모리 관리와 보호를 담당하며 OS와 협력하여 효율적인 메모리 사용을 가능하게 합니다. 반면, RAM은 데이터를 임시 저장하는 공간으로, CPU가 빠르게 접근할 수 있도록 지원합니다. 두 구성 요소는 서로 보완하는 역할을 가지고 있습니다.
그런데 가상 메모리 기능으로 인해 CPU가 무효 비트로 표시된 page*에 엑세스하는 상황인, page fault가 발생합니다.
- 📃 page: OS의 메모리 관리를 위한 가장 작은 데이터 단위, 연속적인 가상 메모리 블록이며 고정된 길이를 가짐
예를 들어 다음과 같은 상황일 경우 page fault가 발생합니다.
- 엑세스하려고 하는 페이지가 현재 물리적 메모리(RAM)에 로드되어 있지 않고 디스크(대용량 저장장치)의 swap 영역에 있는 경우
- 엑세스하려고 하는 페이지가 아직 할당되지 않은 경우
그동안 CPU와 OS에서는 다음과 같은 과정이 진행됩니다.
이렇게 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와의 언어유희가 아니었을까... 하며 요다는 어떤 말투를 가지고 있었는지 찾아보았습니다.
OS의 작동 원리부터 인터럽트, 메모리, 그리고 잠깐이나마 스택까지, 각각 독립적인 개념처럼 보이지만, 사실 이들은 서로 밀접하게 연결되어 있습니다. 메모리는 스택과 인터럽트를 지원하면, 스택은 함수 호출과 인터럽트 처리 중 상태를 저장하는 데 사용됩니다. 또한 인터럽트는 메모리와 프로세스를 효율적으로 관리하기 위한 중요한 메커니즘입니다.
이 모든 요소가 통합적으로 작동하도록 설계하는 것은 OS 개발자들의 주요 과제입니다. OS는 사용자의 요구와 하드웨어의 제약 조건을 만족시키기 위해 끊임없이 진화하고 있습니다. 예를 들어 Apple의 M칩 시리즈(2025.03 기준 Macbook Air에도 M4가 출시!)와 같은 SoC(System on Chip) 설계를 CPU, GPU, 메모리 등을 하나의 칩에 통합하여 성능과 에너지 효율성을 극대화했습니다. 이러한 통합 시스템은 OS와 하드웨어가 얼마나 긴밀하게 연결되어 있는지를 보여줍니다.
컴퓨터 구조에 대해 안개가 낀 부분들을 걷어낼 수 있으리라 기대하며 이 책을 읽고 있었는데요, 생각보다 가려운 부분들이 더욱 생겨나 어쩔 수 없이 별도로 궁금한 점과 이해가 되지 않은 점을 추가로 찾아보고 정리하는 시간을 갖게 되었습니다. 그리고 더불어 밑바닥부터 만드는 컴퓨팅 시스템도 함께 읽고 있는데, 이 책은 보다 구조적이라 이해를 빠르게 할 수 있어 컴퓨터 구조를 공부하는 데 큰 도움이 되고 있습니다. 다음은 '입출력과 네트워킹'에 대한 부분을 읽을 차례인데, 아무래도 프론트엔드다 보니 더 흥미롭게 읽을 수 있지 않을까 한 번 더 기대를 걸어보도록 하겠습니다.
chaejung님 잘 읽고 가요! 요다라니 새롭군요 확실히 책이 뭔가 깊으면서도 어설픈 느낌의 책이에요 밑바닥부터 만드는 컴퓨팅 시스템 책도 사서 한번 읽어봐야겠군요 잘 읽고 갑니다!