1.5 캐시 메모리 (Cache Memory)
캐시 메모리의 중요성과 이해
컴퓨터 시스템에서 프로그램 실행 시 상당한 시간은 데이터의 이동과 복사 과정에서 소모된다. 이러한 복사 과정을 효율적으로 처리하는 것은 시스템 성능 개선의 주요 목적 중 하나이다.
일반적으로 저장장치의 용량과 속도는 반비례 관계를 가지며, 용량이 클수록 접근 속도는 느려지고, 용량이 작을수록 빨라진다. 프로세서(CPU)는 빠른 속도를 내지만 용량이 제한적인 반면, 메모리는 더 큰 용량을 가지지만 속도가 상대적으로 느리다. 최근 기술 발전으로 인해 프로세서의 속도가 급격히 빨라지면서 프로세서-메모리 간 속도 격차가 점점 벌어지고 있다.
이러한 프로세서의 처리 속도와 메모리의 접근 속도 차이를 극복하기 위해 캐시 메모리(Cache Memory)라는 저장장치를 배치하게 되었다. 캐시 메모리는 프로세서와 메모리 중간에 위치하며 보다 작고 빠르다. 이는 주로 프로세서가 단기간 내 자주 사용할 가능성이 높은 데이터를 미리 저장하여 프로세서가 빠르게 접근할 수 있게 한다.
캐시 메모리는 SRAM(정적 램)을 사용하여 L1, L2, L3 계층으로 나뉘며, 현대 프로세서는 이 세 계층을 모두 프로세서 내부에 통합하고 있다.
- L1 캐시 : 프로세서 코어 내부에 위치해 각 코어가 독립적으로 사용하며, 용량은 작지만 레지스터 수준에 가까운 매우 빠른 속도를 제공한다.
- L2 캐시 : 역시 프로세서 코어 내부에 있으며, L1 캐시보다 용량은 크지만 속도는 상대적으로 느리다. 그러나 메모리 접근보다는 5~10배 바르게 작동한다.
- L3 캐시 : 프로세서 내의 여러 코어가 공유하는 구조로, 데이터 교환 효율성을 높이고 메모리 대역폭 사용을 최적화한다.
캐시 메모리는 최근 사용된 데이터가 곧 다시 사용될 가능성이 높다는 원리인 시간적 지역성과, 사용된 데이터 주변의 데이터가 함께 사용될 가능성이 높다는 원리인 공간적 지역성을 이용한다. 이러한 프로그램이 메모리를 접근할 때 특정 부분을 집중적으로 사용하는 경향인 지역성 원리를 기반으로 자주 사용될 가능성이 높은 데이터를 미리 보관해, 마치 시스템이 전체적으로 빠른 메모리를 사용하는 듯한 성능 향상 효과를 얻을 수 있다.
결론적으로 캐시 메모리를 효율적으로 활용하면 프로그램의 성능을 크게 개선할 수 있으며, 응용 프로그래머에게 있어 캐시 메모리에 대한 이해는 필수적이다.
1.6 메모리 계층구조 (Memory Hierarchy)
모든 컴퓨터 시스템의 저장장치는 메모리 계층구조(Memory Hierarchy)에 따라 구성되어 있다. 이는 계층의 꼭대기에 위치할수록 크기가 작고 속도가 빠르며 가격이 비싸고, 반대로 계층의 아래로 갈수록 크기가 커지고 속도가 느려지며 가격이 저렴해짐을 의미한다.
일반적으로 메모리 계층의 꼭대기에는 레지스터(Register)가 위치하고, 그 아래로 L1, L2, L3 캐시(Cache), 메모리(Main Memory, RAM), 로컬 저장장치(HDD, SSD), 그리고 원격 저장장치(웹 서버나 클라우드 스토리지) 순으로 내려간다.
이러한 구조에서 각 계층의 저장장치는 바로 아래 하위 계층 저장장치에 대한 캐시(Cache) 역할을 수행한다. 예를 들어, L1~L3 캐시는 주 메모리에 저장된 데이터를 미리 일부 저장하여, CPU가 더 빠르게 데이터를 이용할 수 있게 한다.
프로그래머에게 있어 성능을 높이기 위해 캐시(L1~L3)의 특성뿐 아니라, 전체적인 메모리 계층구조를 이해하고 활용하는 것은 매우 중요하다.
1.7 운영체제의 하드웨어 관리
운영체제(OS)의 역할과 추상화 원리
운영체제(Operating System)는 하드웨어와 소프트웨어 사이에 존재하며, 하드웨어 자원을 효율적으로 관리하는 특별한 소프트웨어이다. 응용프로그램은 입출력장치, 메모리, 하드디스크와 같은 하드웨어에 직접 접근하지 않고, 반드시 운영체제의 도움을 받아 실행된다.
운영체제는 다음 두 가지 핵심 역할을 수행한다.
- 하드웨어 보호 : 응용프로그램이 하드웨어를 잘못 사용하거나 훼손하지 않도록 보호한다.
- 편의성 제공 : 응용프로그램이 쉽고 편리하게 하드웨어를 이용할 수 있도록 돕는다.
이러한 역할은 운영체제가 제공하는 추상화라는 핵심 원리를 통해 가능해진다. 추상화(Abstraction) 는 하드웨어와 소프트웨어 사이의 복잡한 상호작용을 단순화하고, 하드웨어의 세부적인 구현 방식을 감추는 개념을 말하는데, 운영체제는 하드웨어를 직접 다루는 대신 다음과 같은 추상화된 형태로 관리한다.
- 입출력장치를 "파일"로 추상화 : 다양한 입출력 장치를 파일 형태로 다룰 수 있게 하여 프로그램이 간편하게 접근할 수 있도록 돕는다.
- 입출력장치, 메모리를 "가상 메모리"로 추상화 : 물리적인 메모리의 한계를 넘어서 응용프로그램이 더 크고 효율적인 메모리 자원을 활용할 수 있게 한다.
- 입출력장치, 메모리, 프로세서를 하나로 묶어 "프로세스"로 추상화 : 프로그램이 독립적으로 실행되는 환경을 제공하여 자원의 관리 및 효율성을 높인다.
결론적으로, 운영체제는 하드웨어 자원을 직접 조작하지 않고도 응용프로그램이 쉽고 안전하게 사용할 수 있도록 하드웨어를 추상화하여 관리하고 있는 것이다.
1.7.1 프로세스(Process)
운영체제(OS)의 중요한 역할 중 하나는 응용프로그램이 프로세서, 메모리, 입출력장치 등의 하드웨어 자원을 독점적으로 사용하는 것처럼 느껴지도록 추상화하는 것이다. 운영체제에서 실행 중인 프로그램에 대한 이러한 추상화를 프로세스(Process)라고 한다.
쉽게 말해, 프로세스는 하나의 응용프로그램이 실행될 때 운영체제가 관리하는 단위로, 다음과 같은 특징을 가진다.
- 한 프로그램 내의 인스트럭션(명령어)가 다른 프로그램에 방해받지 않고 순차적으로 실행되게 한다.
- 각 프로세스가 마치 전체 메모리를 혼자 사용하는 독립된 메모리 공간을 가진 것처럼 보이게 한다.
실제 시스템에서는 여러 프로세스가 동시에 실행되지만, 각 프로세스는 자신이 하드웨어를 독점적으로 사용한다고 느끼게 한다. 운영체제가 제공하는 이러한 환상은 문맥 전환을 통해 이루어진다.
문맥 전환 (Context Switching)이란?
문맥 전환이란 운영체제가 프로세스를 전환할 때, 이전 프로세스의 실행 상태를 저장하고 새로운 프로세스의 상태를 복원하여 제어를 넘겨주는 작업이다. 이때 프로세스의 상태, 즉 컨텍스트(문맥)는 다음과 같은 정보를 포함한다.
- 프로그램 카운터(PC)
- 프로세서 레지스터(CPU Register)들의 값
- 메모리에 저장된 데이터 등
즉, 운영체제는 다음과 같은 방식으로 문맥 전환을 수행한다.
- 기존 프로세스의 컨텍스트(상태)를 저장한다.
- 새롭게 실행할 프로세스의 컨텍스트를 복원한다.
- 새 프로세스가 이전에 중단되었던 위치부터 바로 이어서 실행할 수 있도록 제어권을 넘긴다.
이러한 과정을 통해 프로세스가 마치 연속적으로 실행되는 것처럼 보이는 효과를 얻을 수 있다.
문맥 전환의 예시
다음은 쉘(Shell) 프로세스와 hello(임의의 응용프로그램) 프로세스가 동작하는 상황을 통해 문맥 전환을 쉽게 설명한 예시이다.
- 처음에는 쉘 프로세스가 실행되며, 사용자의 입력을 기다린다.
- 사용자가 쉘에 hello 프로그램 실행 명령을 입력하면, 쉘 프로세스는 시스템 콜(System Call)을 통해 운영체제에게 제어권을 넘긴다.
- 운영체제는 쉘 프로세스의 컨텍스트를 저장하고, 새롭게 hello 프로세스를 위한 컨텍스트를 생성한 뒤 hello 프로세스에 제어권을 넘긴다.
- hello 프로세스의 실행이 끝나면, 운영체제는 hello 프로세스의 컨텍스트를 정리하고, 다시 쉘 프로세스의 컨텍스트를 복원해 제어권을 넘긴다.
- 쉘 프로세스는 다음 사용자의 다음 입력을 기다리며, 위 과정을 반복한다.
커널(Kernel)의 역할
이러한 프로세스 간 문맥 전환 및 자원 관리는 운영체제의 커널(Kernel)에서 담당한다. 커널은 항상 메모리에 상주하며, 프로세스 관리, 메모리 관리, 하드웨어 제어 등 운영체제의 핵심 서비스를 제공한다.
- 시스템 콜(System Call) : 응용프로그램이 운영체제에게 하드웨어 자원 접근 등의 작업을 요청할 때 사용하는 메커니즘. 이때 제어권이 운영체제 커널로 전달된다.
- 커널은 별도의 독립적인 프로세스가 아니라, 운영체제의 일부로서 항상 메모리에 상주하며 실행된다. 따라서 커널은 프로세스 관리 및 제어를 위한 필수적인 부분이다.
1.7.2 스레드(Thread)
스레드(Thread)는 프로세스 내의 독립적인 실행 흐름 단위이다. 하나의 프로세스 안에는 다수의 스레드가 존재할 수 있으며, 각 스레드는 독립적으로 작업을 수행한다. 이때, 동일 프로세스에 속한 스레드끼리는 다음과 같은 자원을 공유한다.
- 코드 영역 (Code Area)
- 데이터 영역 (전역 변수, 힙 메모리 등)
즉, 한 프로세스에 속한 여러 스레드는 같은 메모리 공간에서 동작하며, 전역 변수 및 프로그램의 코드를 공유하기 때문에 프로세스 간 데이터 공유보다 훨씬 효율적이고 간편하다.
프로세스와 스레드의 차이
프로세스와 스레드의 핵심적인 차이는 메모리 공유 방식에 있다. 프로세스는 독립된 메모리 공간과 시스템 자원을 할당받아 서로의 데이터를 직접 공유하지 않고 별도의 통신(IPC)을 통해서만 정보를 주고받을 수 있다. 반면 스레드는 같은 프로세스 안에서 생성되며 메모리 공간과 시스템 자원을 모두 공유하기 때문에 프로세스보다 더 효율적인 데이터 공유가 가능하다.
또한 스레드는 컨텍스트 전환 시 프로세스에 비해 저장하고 복원할 정보가 적어 시스템 자원을 더욱 효율적으로 사용할 수 있다. 이러한 이유로 프로세스는 독립적이고 분리된 작업에 적합하며, 스레드는 협력적이고 긴밀한 작업을 병렬 처리할 때 유용하게 사용된다.
1.7.3 가상메모리(Virtual Memory)
가상메모리(Virtual Memory)는 운영체제가 메모리 효율성을 높이기 위해 보조기억장치(디스크)의 일부분을 마치 메인 메모리처럼 활용하는 기법으로, 각 프로세스가 메모리를 독점적으로 사용하는 것 같은 환상을 제공한다. 이를 통해 프로세스는 실제 물리 메모리 크기와 관계없이 가상 주소 공간(Virtual Address Space)이라는 통일된 메모리 영역을 갖게 된다.
일반적으로 프로세스의 가상 주소 공간은 크게 사용자 영역과 커널 영역으로 구분된다.
- 사용자 영역(User Space): 프로세스가 직접 접근 가능한 영역으로 프로세스마다 개별적으로 할당된다.
- 커널 영역(Kernel Space): 주소 공간의 최상위 영역으로 모든 프로세스가 공통적으로 사용하는 운영체제의 코드와 데이터를 위한 공간이다. 사용자는 이 영역에 직접 접근할 수 없으며, 반드시 시스템 콜(System Call)을 통해 커널에 접근해야 한다.
사용자 영역의 구조
사용자 영역은 다음과 같은 하위 영역으로 구성된다.
- 코드 영역(Code Segment): 프로세스가 실행할 인스트럭션(명령어)가 저장되는 읽기 전용 공간이다. 프로그램 실행 시작 시 실행 가능한 목적파일에서 초기화되며, 실행 중 크기는 고정된다.
- 데이터 영역(Data Segment): 프로그램이 실행되는 동안 유지되는 전역 변수나 정적 변수가 저장되는 공간이다. 코드 영역과 마찬가지로 목적파일에서 초기화되며 크기가 고정된다.
- 힙 영역(Heap Segment): 프로세스가 실행되는 동안 사용자가 동적으로 할당(malloc)하고 반환(free)하는 데이터를 저장하는 공간이다. 데이터의 할당 및 반환에 따라 크기가 동적으로 변한다.
- 공유 라이브러리 영역(Shared Library Segment): C 표준 라이브러리, 수학 라이브러리 등 여러 프로그램이 공통으로 사용하는 라이브러리의 코드와 데이터를 저장하는 공간이다.
- 스택 영역(Stack Segment): 프로그램이 실행되는 동안 일시적으로 사용하는 데이터(함수의 매개변수, 지역 변수 등)가 저장되는 공간이다. 함수 호출 시 크기가 커지고, 함수가 반환되면 크기가 줄어드는 형태로써 동적으로 변화한다.
- 커널 영역(Kernel Space): 운영체제 커널이 핵심 서비스를 제공하기 위해 예약한 주소 공간의 맨 윗부분. 응용프로그램은 이 영역에 직접 접근할 수 없고, 필요한 경우 시스템 콜을 통해서만 간접적으로 커널의 기능을 사용할 수 있다.
가상메모리의 작동 원리
가상메모리의 핵심 원리는 프로세서가 만들어내는 논리 주소(Logical Address)와 실제 데이터를 저장하고 있는 메모리의 물리 주소(Physical Address) 간의 변환을 통해 이루어진다. 즉, 운영체제는 프로세스가 접근하려는 데이터가 물리 메모리에 없는 경우, 디스크에 저장된 데이터를 메모리로 로드하는 방식으로 관리한다.
이를 위해 운영체제는 다음과 같은 방식으로 메모리를 관리한다.
- 프로세스가 사용하지 않는 가상메모리 영역의 데이터를 디스크에 저장하여 메모리를 확보한다.
- 프로세스가 필요로 하는 데이터를 디스크로부터 메모리에 불러온다.
- 메모리는 일종의 디스크 캐시로서 동작하며, 자주 접근하는 데이터는 메모리에 유지하고 그렇지 않은 데이터는 디스크에 유지함으로써 메모리를 효율적으로 관리한다.
이와 같은 기법을 통해, 실제 물리 메모리보다 큰 가상 주소 공간을 프로세스에 제공할 수 있다.
1.7.4 파일(File)
파일(File)은 연속된 바이트(Byte)들의 모임으로 정의할 수 있다. 운영체제는 디스크(보조기억장치)는 물론이고 키보드, 디스플레이, 네트워크 등 컴퓨터 시스템의 모든 입출력장치를 일종의 파일로 추상화(모델링)한다. 즉, 운영체제는 모든 입출력 작업을 파일을 읽거나 쓰는 동작으로 통일시키며, 사용자는 이러한 작업을 수행할 때 시스템 콜(System Call)을 이용하게 된다.
이러한 추상화는 응용프로그램 개발자에게 통일된 관점을 제공해준다. 예를 들어, 응용 프로그래머가 디스크 파일을 다룰 때 파일 입출력 시스템 콜만 알면 되며, 디스크 장치의 구체적인 기술적 특성을 이해할 필요가 없다. 덕분에 동일한 응용 프로그램이 서로 다른 하드웨어와 디스크 기술을 사용하는 시스템에서도 변경 없이 실행될 수 있는 이식성(Portability)을 제공한다.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 3장 완전 정복] 3.3 데이터는 메모리에 어떻게 저장될까? (0) | 2025.04.05 |
---|---|
[CSAPP 3장 완전 정복] 3.2 어셈블리 명령어는 어떻게 저장될까? (0) | 2025.04.05 |
[CSAPP 3장 완전 정복] 3.1 어셈블리 언어와 친해지는 첫 걸음 + 추천 학습 순서 (0) | 2025.04.05 |
[CSAPP 1.8~1.9] 기초개념: 네트워크 개요, 시스템에서 중요한 개념(암달의 법칙, 동시성과 병렬성, 추상화) (0) | 2025.03.31 |
[CSAPP 1.1~1.4] 기초 개념: 데이터, 컴파일 과정, 하드웨어 구조 및 동작 원리 (0) | 2025.03.18 |