웹애플리케이션 시스템의 처리 과정

사용자가 웹 브라우저에서 특정 페이지를 요청했을 때, 서버 단에서는 다음과 같은 5단계의 처리 순서가 진행됩니다.

  1. 요청 : 웹 브라우저가 웹 서버에 특정 페이지를 요청합니다.
  2. 위임 : 웹 서버는 요청을 받고, 만약 동적인 처리가 필요하다면 해당 작업을 웹 애플리케이션 서버(WAS)에 위임합니다.
  3. 수행 : WAS는 비즈니스 로직을 수행하며, 필요 시 데이터베이스와 연동하여 데이터를 조회하거나 처리합니다.
  4. 반환 : WAS는 로직 및 데이터베이스 작업의 처리 결과를 웹 서버에 반환합니다.
  5. 응답 : 웹 서버는 최종 결과를 웹 브라우저에 응답하여 사용자에게 화면을 보여줍니다.

이 처리 흐름에는 웹 브라우저, 웹 서버, 웹 애플리케이션(WAS), 데이터베이스라는 네 가지 주요 구성 요소가 존재하며 각자의 역할을 수행합니다.

웹 서버의 종류와 역할 분담

현대 웹 아키텍처의 핵심은 웹 서버와 웹 애플리케이션 서버(WAS)의 역할을 분리하는 것입니다.

Web Server는 Apache, Nginx와 같은 소프트웨어로, 주된 역할은 이미지, CSS, HTML 파일과 같은 정적 콘텐츠를 처리하는 것입니다. 즉, 변경이 필요 없는 단순한 파일 요청을 빠르고 효율적으로 처리합니다.

WAS (Web Application Server)는 Tomcat, JBoss와 같은 소프트웨어로, 데이터베이스 조회나 복잡한 비즈니스 로직 수행이 필요한 동적 콘텐츠를 생성하는 데 특화되어 있습니다. PHP, JSP, ASP와 같은 서버 사이드 언어를 구동하는 환경을 제공하며, 웹 컨테이너 또는 서블릿 컨테이너라고도 불립니다.

과거에는 CGI(Common Gateway Interface)라는 규약을 통해 동적 콘텐츠를 처리했습니다. 하지만 CGI는 사용자의 요청이 들어올 때마다 새로운 프로세스를 생성하여 실행하기 때문에, 동시 접속자가 많아지면 서버에 큰 부하를 주는 한계가 있었습니다. WAS는 이러한 CGI의 단점을 개선하여 보다 효율적으로 다수의 요청을 처리합니다.

웹 서버와 WAS를 분리하는 이유

웹 서버와 WAS의 역할을 분리하는 것은 자원 이용의 효율성, 장애 극복, 유지보수의 편의성을 높이기 위함입니다.

  1. 기능 분리를 통한 서버 부하 방지 : 정적 콘텐츠는 웹 서버가, 동적 콘텐츠는 WAS가 전담하여 각 서버가 가장 잘하는 일에 집중하게 함으로써 전체 시스템의 성능을 최적화합니다.
  2. 보안 강화 : 웹 서버를 시스템의 가장 앞단에 배치하여 SSL 암복호화 처리 등을 담당하게 하고, 내부적으로 중요한 비즈니스 로직을 수행하는 WAS를 외부로부터 보호하는 구조를 만들 수 있습니다.
  3. 서버 부하 분산 기능 : 여러 대의 WAS를 하나의 웹 서버에 연결하는 로드 밸런싱이 가능합니다. 이를 통해 특정 WAS에 장애가 발생하더라도 다른 WAS로 요청을 넘겨 중단 없는 서비스를 제공할 수 있습니다.

웹 애플리케이션 시스템의 동작

웹 컨테이너(서블릿 컨테이너)는 WAS의 핵심 구성 요소로, HTTP 요청을 받아 서블릿을 실행하고 그 생명주기를 관리하는 역할을 합니다. 서블릿은 웹 페이지를 동적으로 생성하는 자바로 작성된 서버 애플리케이션으로, 톰캣과 같은 컨테이너 환경 위에서 동작합니다.

웹 서버 게이트웨이 인터페이스(WSGI)는 파이썬 기반 웹 환경에서 웹 서버와 웹 애플리케이션 간의 표준화된 인터페이스를 제공하는 규약입니다. CGI와 달리 요청마다 프로세스를 생성하지 않아 더 효율적으로 다수의 요청을 처리할 수 있습니다.

Java 기초 프로그래밍

이러한 서버 측 로직을 구현하는 대표적인 언어 중 하나가 Java입니다. Java는 처음부터 객체지향 언어로 설계되었으며, 가장 큰 특징은 운영체제로부터의 독립성입니다.

이는 자바 가상 머신(JVM, Java Virtual Machine)으로 가능합니다. Java 코드는 특정 운영체제에 종속된 기계어가 아닌, JVM이 이해할 수 있는 바이트코드로 변환됩니다. 이후 각 운영체제에 설치된 JVM이 이 바이트코드를 해당 환경에 맞게 해석하여 실행합니다.

 

Java 개발과 실행을 위해서는 다음 개념을 이해해야 합니다.

JDK (Java Development Kit)는 컴파일러, 디버거 등 Java 프로그램을 '개발'하는 데 필요한 모든 도구를 포함합니다.
JRE (Java Runtime Environment)는 JVM과 핵심 라이브러리를 포함하며, Java 프로그램을 '실행'하는 데 필요한 환경입니다.
JVM (Java Virtual Machine)은 Java 바이트코드를 실제로 실행하는 가상 머신 그 자체입니다.

개발을 위해서는 JDK를 설치하며, JDK 안에는 JRE와 JVM이 모두 포함되어 있는 구조입니다. 이러한 플랫폼 독립성과 안정성, 방대한 생태계 덕분에 Java는 오랫동안 서버 애플리케이션 개발의 주류 언어로 자리 잡아왔습니다.

728x90

웹 애플리케이션 시스템의 기본 구조

모든 웹 애플리케이션의 근간에는 클라이언트-서버 아키텍쳐가 있습니다. 이는 서비스를 요청하는 사용자(클라이언트)와 요청을 처리하여 결과를 반환하는 중앙 컴퓨터(서버)로 시스템의 역할을 분리하는 모델입니다. 이 모델은 기술의 발전에 따라 그 구조를 달리하며 진화해왔습니다.

 

전통적 구조 (2-Tier)와 개선된 구조 (3-Tier)

초기의 2-Tier 아키텍쳐는 클라이언트와 서버가 직접 통신하는 단순한 구조였습니다. 이 방식은 데이터 처리를 중앙 서버에서 공통으로 관리할 수 있다는 장점이 있었지만, 애플리케이션 로직의 변경이 생길 때마다 모든 클라이언트의 프로그램을 재설치해야 했고, 클라이언트가 데이터베이스에 직접 접근함에 따른 보안 취약점을 가지고 있었습니다.

이러한 한계를 극복하기 위해 등장한 것이 바로 현대 웹 애플리케이션의 표준 구조인 3-Tier 아키텍입니다. 이 구조는 시스템의 역할을 세 개의 논리적인 계층으로 명확하게 분리하여 유연성과 보안을 크게 향상시켰습니다.

 

3-Tier 아키텍의 세 가지 계층

  1. 프레젠테이션 계층 (Presentation Layer)
    사용자와 직접 상호작용하는 최상위 계층으로, 주로 웹 브라우저가 이 역할을 담당합니다. 이 계층의 책임은 오직 사용자 인터페이스(UI)를 표시하고 사용자 입력을 받는 것에 한정되며, 흔히 프론트엔드(Front-end) 영역으로 불립니다.
  2. 비즈니스 계층 (Business Logic Layer)
    시스템의 핵심 로직을 전담하는 중간 계층입니다. 애플리케이션 서버(WAS)가 이 역할을 수행하며, 클라이언트의 요청에 따라 데이터 유효성을 검사하고, 복잡한 연산을 처리하며, 트랜잭션을 관리합니다. 미들웨어 또는 백엔드 영역의 일부로 분류됩니다.
  3. 데이터 계층 (Data Access Layer)
    모든 데이터를 영구적으로 저장하고 관리하는 최하위 계층입니다. 데이터베이스 관리 시스템(DBMS)이 여기에 해당하며, 비즈니스 계층의 요청에 따라서만 데이터를 조회하거나 수정합니다. 이 역시 백엔드 영역에 속합니다.

객체지향

객체지향은 '효율적인 구축'을 위한 핵심적인 프로그래밍 패러다임입니다. 기능의 순차적 나열에 집중했던 과거의 절차지향 방식과 달리, 객체지향은 데이터와 그 데이터를 처리하는 행위를 하나로 묶은 '객체'들의 상호작용으로 시스템을 바라봅니다.

 

객체지향의 4가지 핵심 원칙

  1. 추상화 (Abstraction)
    복잡한 요소를 단순화하여 핵심적인 속성과 행위만을 추출해 표현하는 것입니다. 클래스는 이러한 추상화를 통해 객체를 만들기 위한 설계도 역할을 합니다.
  2. 상속 (Inheritance)
    기존 클래스의 속성과 기능을 새로운 클래스가 그대로 물려받아 재사용하는 개념입니다. 코드의 중복을 줄여 개발 효율성을 극대화합니다.
  3. 다형성 (Polymorphism)
    동일한 요청(메서드 호출)에 대해 각 객체가 자신만의 방식으로 다르게 반응하는 특성입니다. 이를 통해 코드를 유연하고 확장 가능하게 만들 수 있습니다.
  4. 캡슐화 (Encapsulation)
    관련된 데이터와 행위를 하나의 객체로 묶고, 내부의 복잡한 구현은 외부로부터 숨기는 것을 의미합니다. 객체는 공개된 인터페이스를 통해서만 외부와 상호작용하여 시스템 전체의 안정성을 높입니다.

객체지향 분석과 설계

객체지향 방법론은 아이디어를 실제 소프트웨어로 구현하는 체계적인 과정을 제공합니다.

객체지향 분석 (OOA)은 '무엇을 만들 것인가'를 정의하는 단계입니다. 사용자 요구사항을 분석하여 시스템에 필요한 객체들과 그들의 관계를 식별하고 모델링합니다.

객체지향 설계 (OOD)는 '어떻게 만들 것인가'를 결정하는 단계입니다. 분석 단계에서 도출된 모델을 바탕으로, 재사용성을 고려하여 클래스 구조를 구체화하고 시스템의 전체적인 아키텍를 설계합니다.


정리

2-Tier 아키텍는 구조가 단순해 개발이 용이할 수 있으나, 재사용성과 성능, 관리 측면에서 한계가 명확합니다. 그러나,3-Tier 아키텍는 비즈니스 로직을 모듈화하여 재사용성을 높이고, 부하 분산을 통해 안정적인 성능을 보장하며, 각 계층의 모니터링이 용이해 시스템 관리에 유리합니다.

 

현대 웹 애플리케이션이 3-Tier 아키텍라는 견고한 구조 위에서 동작하며, 객체지향이라는 설계 철학을 통해 복잡성을 관리하고 있음을 이해했습니다.

728x90

운영체제의 역할을 제대로 이해하기 위해서는 컴퓨터 하드웨어의 구성과 동작 방식을 알아야 합니다. 컴퓨터를 구성하는 핵심 부품과 특히 CPU와 메모리의 관계에 대한 내용을 정리합니다.

 컴퓨터의 기본 구성 : 폰 노이만 구조

현대 컴퓨터는 대부분 폰 노이만 구조(von Neumann architecture)를 따릅니다. 이 구조의 핵심은 CPU, 메모리, 입출력장치, 저장장치가 버스(Bus)라는 데이터 통로를 통해 연결되어 상호작용합니다.

  • CPU (Central Processing Unit) : 프로그램의 명령어를 해석하고 연산을 수행하는 컴퓨터의 두뇌입니다.
  • 메모리 (Main Memory, RAM) : 실행할 프로그램과 데이터를 임시로 저장하는 작업 공간입니다.
  • 보조 저장장치 (Secondary Storage) : 전원이 꺼져도 데이터가 유지되는 영구 저장 공간입니다. (예: SSD, HDD)
  • 입출력장치 (I/O Devices) : 사용자와 컴퓨터, 또는 다른 장치와 상호작용하기 위한 장치입니다. (예: 키보드, 모니터)

폰 노이만 구조의 가장 중요한 특징은 모든 프로그램은 반드시 메모리에 적재(load)되어야만 CPU가 실행할 수 있다는 점입니다. 이로 인해 메모리는 시스템의 유일한 작업 공간이 되며, 한정된 메모리를 효율적으로 관리하는 것이 운영체제의 핵심 역할 중 하나가 됩니다.

CPU와 메모리

CPU의 구성과 동작

CPU는 크게 세 가지 핵심 요소로 구성됩니다.

  • 산술논리 연산장치 (ALU) : 덧셈, 뺄셈과 같은 산술 연산과 AND, OR 같은 논리 연산을 수행합니다.
  • 제어장치 (Control Unit) : 명령어의 해석과 실행을 지시하며, 데이터 흐름을 통제하는 사령탑 역할을 합니다.
  • 레지스터 (Registers) : CPU 내부에 존재하는 소용량의 초고속 임시 기억 공간입니다. 프로그램 카운터(PC), 명령어 레지스터(IR) 등 특수 목적 레지스터들이 명령어 처리 과정을 제어합니다.

CPU는 메모리에서 명령어를 가져와(Fetch) 해석하고(Decode), 실행한 후(Execute), 결과를 저장하는(Store) 사이클을 반복하며 작동합니다.

메모리의 종류와 역할

메모리는 크게 RAM과 ROM으로 나뉩니다.

  • RAM (Random Access Memory) : 데이터를 자유롭게 읽고 쓸 수 있지만, 전원이 꺼지면 내용이 사라지는 휘발성 메모리입니다. 현재 작업에 필요한 데이터를 임시 저장하는 주 기억장치로 사용됩니다.
    • DRAM (Dynamic RAM) : 주기적인 재충전이 필요하지만, 집적도가 높아 대용량 구현에 유리하여 주로 메인 메모리로 사용됩니다.
    • SRAM (Static RAM) : 전원이 공급되는 동안 데이터가 유지되어 속도가 매우 빠르지만, 가격이 비싸 CPU의 캐시 메모리로 주로 사용됩니다.
  • ROM (Read-Only Memory) : 데이터를 읽기만 가능하며, 전원이 꺼져도 내용이 유지되는 비휘발성 메모리입니다. 컴퓨터의 부팅을 담당하는 바이오스(BIOS)와 같이 변하지 않는 시스템 정보를 저장하는 데 사용됩니다.

컴퓨터 성능 향상 기술

CPU의 발전 속도를 다른 장치들이 따라가지 못하면서 발생하는 병목 현상을 해결하고, 시스템 전체의 효율을 높이기 위해 다양한 기술이 사용됩니다.

버퍼링과 캐싱 

서로 다른 속도를 가진 두 장치 사이의 데이터 전송을 원활하게 하기 위해 버퍼(Buffer)라는 임시 저장 공간을 사용합니다. 캐시(Cache)는 이러한 버퍼링 개념을 CPU와 메인 메모리 사이에 적용한 고속 버퍼입니다.

CPU는 데이터를 요청할 때 메인 메모리에 직접 접근하기 전에 먼저 캐시를 확인합니다. 원하는 데이터가 캐시에 있으면(Cache Hit), 매우 빠른 속도로 작업을 처리할 수 있습니다. 만약 데이터가 없다면(Cache Miss), 메인 메모리에서 데이터를 가져와야 하므로 시간이 지연됩니다. 일반적으로 캐시 적중률(Hit Ratio)은 90% 이상으로, 시스템의 평균 응답 속도를 크게 향상시킵니다.

인터럽트와 DMA

과거의 시스템은 CPU가 입출력 작업이 끝날 때까지 주기적으로 상태를 확인하는 폴링(Polling) 방식을 사용했습니다. 이는 CPU 자원을 심각하게 낭비하는 비효율적인 방식입니다.

현대 시스템은 인터럽트(Interrupt) 방식을 사용합니다. CPU가 입출력 관리자에게 작업을 지시하면, CPU는 다른 작업을 수행하고 있다가 입출력 관리자가 작업 완료 신호(인터럽트)를 보내왔을 때만 해당 작업을 처리합니다. 이를 통해 CPU는 입출력을 기다리는 시간 동안 다른 유용한 일을 할 수 있게 됩니다.

더 나아가, 직접 메모리 접근(DMA, Direct Memory Access)은 입출력 관리자가 CPU의 개입 없이 직접 메모리에 접근하여 데이터를 전송할 수 있도록 하는 기술입니다. DMA를 통해 대용량 데이터 전송이 이루어지는 동안 CPU는 다른 연산 작업을 완전히 독립적으로 수행할 수 있어 시스템 효율이 극대화됩니다.

멀티 프로세싱

컴퓨터의 성능을 높이기 위해 하나의 칩에 여러 개의 CPU 코어를 탑재하는 멀티코어(Multi-core) 시스템이 보편화되었습니다. 각 코어는 독립적인 레지스터와 캐시를 가지며, 메인 메모리를 공유하는 구조를 통해 여러 작업을 동시에 병렬로 처리할 수 있습니다.

또한, 하나의 코어 내에서도 여러 명령어를 동시에 처리하는 명령어 병렬 처리(Instruction Parallel Processing)나, 하나의 코어를 여러 논리적 코어처럼 활용하는 CPU 멀티스레딩(하이퍼스레딩 등) 기술을 통해 성능을 더욱 끌어올립니다.


정리

컴퓨터 시스템은 각기 다른 속도와 역할을 가진 하드웨어들의 복잡한 조합입니다. 운영체제는 하드웨어의 특성을 이해하여 캐싱, 인터럽트, DMA와 같은 성능 향상 기술을 활용하여 시스템 자원의 병목 현상을 최소화하고 전체 처리 효율을 극대화하는 역할을 수행합니다.

728x90

'운영체제' 카테고리의 다른 글

교착 상태(Deadlock)  (1) 2025.10.13
프로세스 동기화와 임계 구역 문제  (0) 2025.10.11
CPU 스케줄링  (0) 2025.10.02
프로세스와 스레드  (0) 2025.09.19
저장장치의 계층 구조  (0) 2025.09.18

프로세스(Process)란?

프로그램(Program)은 하드 디스크에 저장된 실행 파일로 그 자체로는 아무 일도 하지 않는 정적인 코드 덩어리입니다. 그러나, 프로세스(Process)는 이 프로그램이 실행되기 위해 메모리에 적재된 상태로, 생명력을 얻어 CPU의 시간을 할당받는 동적인 개체입니다.
간단히 말해, 프로세스는 "실행 중인 프로그램"이며, 운영체제가 자원을 할당하는 최소 단위입니다.

PCB(Process Control Block)

프로그램이 프로세스로 전환되는 순간, 운영체제는 해당 프로세스를 관리하기 위한 모든 정보를 담은 자료구조를 생성합니다. 이것이  프로세스 제어 블록(PCB)입니다. PCB가 생성되었다는 것은 운영체제가 해당 프로세스를 공식적으로 인지하고 관리하기 시작한다는 의미입니다. 따라서 프로세스 = 프로그램 코드 + PCB 라는 관계가 성립합니다. PCB에는 프로세스 고유 식별자(PID), 현재 상태, 다음에 실행할 명령어 주소(PC), 메모리 할당 정보 등 프로세스 운영에 필요한 모든 핵심 정보가 담겨 있습니다.

프로세스의 생애 주기: 5가지 상태 변화

프로세스는 생성부터 소멸까지 끊임없이 상태가 변합니다. 이를 '프로세스 상태 전이(State Transition)'라고 하며, 핵심적인 5가지 상태는 다음과 같습니다.

  • 생성 (New) : 프로그램이 메모리에 적재되고 PCB가 생성되는 단계입니다.
  • 준비 (Ready) : 모든 준비를 마치고 CPU의 선택을 받기 위해 '준비 큐(Ready Queue)'에서 대기하는 상태입니다.
  • 실행 (Running) : CPU를 할당받아 명령을 수행하는 상태입니다.
  • 대기 (Waiting/Blocked) : 입출력(I/O) 작업과 같이 CPU 외 다른 자원의 처리를 기다리는 상태입니다.
  • 종료 (Terminated) : 모든 실행을 마치고 메모리에서 제거되며, 이때 PCB도 함께 사라집니다.

이러한 상태 변화는 디스패치(준비→실행), 타임 아웃(실행→준비), 블록(실행→대기), 웨이크업(대기→준비)과 같은 특정 동작에 의해 유발됩니다. 이는 운영체제가 여러 프로세스를 공정하고 효율적으로 관리하기 위한 핵심 메커니즘입니다.

문맥 교환 (Context Switching)

현대 운영체제는 하나의 CPU에서도 여러 프로세스가 동시에 실행되는 것처럼 보이게 합니다. 이는 CPU 처리 시간을 매우 잘게 쪼개 여러 프로세스에 번갈아 할당함으로써 가능해집니다. 이때, 현재 실행 중인 프로세스에서 다음 실행할 프로세스로 CPU의 제어권을 넘겨주는 과정을 문맥 교환(Context Switching)이라고 합니다.

문맥 교환이 발생하면, 운영체제는 현재 프로세스의 실행 상태(문맥)를 PCB에 저장하고, 다음 프로세스의 문맥을 PCB로부터 가져와 CPU 레지스터에 복원합니다. 이 과정은 시스템에 상당한 오버헤드(Overhead)를 발생시키므로, 너무 잦은 문맥 교환은 오히려 시스템 전체의 성능 저하를 일으킬 수 있습니다.

프로세스의 생성과 관리

프로세스는 부모-자식 관계의 계층 구조를 이룹니다. 유닉스 계열 시스템에서는 모든 프로세스가 최초의 init 프로세스로부터 파생된 트리 구조를 형성합니다.

fork() 시스템 호출은 부모 프로세스가 자신을 그대로 복제하여 자식 프로세스를 생성하는 명령입니다. 자식은 부모의 코드와 데이터를 상속받지만, 고유한 PID와 독립적인 메모리 공간을 갖습니다. 이후 exec() 시스템 호출을 통해 현재 프로세스의 메모리 공간 위에 새로운 프로그램을 덮어씌워 실행할 수 있습니다.

이 과정에서 부모와 자식의 동기화가 맞지 않으면 좀비 프로세스(자식 종료 후 부모가 정리하지 않음)나 고아 프로세스(부모가 먼저 종료됨) 같은 특수한 상태가 발생하며, 이는 운영체제가 안정적으로 관리해야 할 대상입니다.


스레드 (Thread)

프로세스 생성은 많은 자원을 필요로 하는 무거운 작업입니다. 하나의 프로세스 내에서 여러 작업을 동시에 처리하기 위해 고안된 것이 스레드(Thread)입니다. 스레드는 '프로세스 내에서 실행되는 흐름의 단위'이며, '경량 프로세스(Lightweight Process)'라고도 불립니다.

하나의 프로세스에 속한 스레드들은 코드, 데이터, 힙 영역을 공유하며, 각자 독립적인 스택, 프로그램 카운터, 레지스터를 가집니다. 이를 통해 스레드들은 자원을 효율적으로 공유하면서도 독립적인 실행 흐름을 유지할 수 있습니다.

멀티스레딩(Multi-threading)의 장점

멀티스레딩은 현대 소프트웨어 개발의 표준적인 패러다임이 되었습니다. 그 이유는 다음과 같은 장점 때문입니다.

 

첫째, 응답성이 향상됩니다. 하나의 스레드가 긴 작업으로 인해 대기 상태에 빠져도, 다른 스레드는 계속 실행되어 프로그램 전체가 멈추는 것을 방지합니다.

 

둘째, 자원 공유가 효율적입니다. 동일한 메모리 공간을 공유하므로, 프로세스 간 통신(IPC)보다 훨씬 적은 비용으로 데이터를 주고받을 수 있습니다.

 

셋째, 생성 및 문맥 교환 비용이 경제적입니다. 프로세스보다 훨씬 가볍기 때문에 생성과 전환에 드는 시스템 오버헤드가 적습니다.

 

넷째, 멀티코어 프로세서의 성능을 극대화합니다. 여러 스레드를 각 코어에 할당하여 작업을 진정한 의미의 병렬로 처리할 수 있습니다.

 

정리

프로세스와 스레드는 운영체제가 시스템 자원을 관리하고 작업을 스케줄링하는 데 있어 가장 기본이 되는 개념입니다. 프로세스는 자원 할당의 단위이며, 스레드는 CPU 실행의 단위라고 요약할 수 있습니다. 이들의 상태 변화, 문맥 교환, 멀티스레딩의 원리를 이해하는 것은 운영체제의 동작 방식을 파악하는 데 필수적입니다.

728x90

'운영체제' 카테고리의 다른 글

교착 상태(Deadlock)  (1) 2025.10.13
프로세스 동기화와 임계 구역 문제  (0) 2025.10.11
CPU 스케줄링  (0) 2025.10.02
컴퓨터 하드웨어와 성능의 이해  (0) 2025.09.20
저장장치의 계층 구조  (0) 2025.09.18

저장장치 계층 구조의 기본 개념

저장장치 계층 구조는 특성이 다른 여러 종류의 저장장치를 피라미드 형태로 배열하는 것을 의미합니다. 이 구조의 최상단에는 가장 빠르고, 가장 비싸며, 가장 용량이 작은 저장장치가 위치하고, 하단으로 내려갈수록 속도는 느려지지만 용량은 크고 가격은 저렴한 저장장치가 위치합니다.

 

  • 계층 상단 : CPU와 가깝게 배치, 접근 속도 극대화 (예: 레지스터, 캐시)
  • 계층 하단 : 영구 저장을 목적으로, 대용량과 비용 효율성 확보 (예: SSD, HDD)

위와 같은 계층적 접근을 통해 시스템은 평균적으로 높은 접근 속도를 유지하며 대용량 데이터를 경제적으로 관리할 수 있습니다.

계층별 상세 분석

1단계 : 레지스터 (Registers)

  • 위치 : CPU 내부
  • 역할 : CPU가 현재 처리 중인 명령어와 데이터를 직접 보관하는 가장 빠른 메모리입니다. 물리적으로 CPU의 연산 장치(ALU)와 제어 장치(CU)에 직접 연결되어 있어, 사실상 지연 시간이 없는 수준(1 CPU 사이클 미만)의 접근 속도를 보입니다.

 

주요 종류

  • 프로그램 카운터(PC) : 다음에 실행할 명령어의 메모리 주소를 저장합니다.
  • 명령어 레지스터(IR) : 현재 실행 중인 명령어를 보관합니다.
  • 메모리 주소 레지스터(MAR) : 접근하려는 메모리의 주소를 저장합니다.
  • 메모리 버퍼 레지스터(MBR) : 메모리로부터 읽어온 데이터나 메모리에 쓸 데이터를 임시 저장합니다.

2단계 : 캐시 메모리 (Cache Memory)

  • 위치 : CPU와 메인 메모리(RAM) 사이
  • 역할 : CPU와 메인 메모리 간의 극심한 속도 차이를 완화하기 위한 고속 버퍼 메모리입니다. 일반적으로 비싸지만 속도가 매우 빠른 SRAM(Static RAM)으로 제작됩니다.
  • 계층적 구성:
    • L1 캐시 : CPU 코어 내부에 존재하며 가장 빠릅니다. 명령어(Instruction) 캐시와 데이터(Data) 캐시로 분리되어 병목 현상을 최소화합니다.
    • L2 캐시 : L1 캐시보다 용량이 크고 속도는 다소 느립니다. 보통 CPU 코어 외부에 위치합니다.
    • L3 캐시 : 여러 CPU 코어가 공유하는 대용량 캐시로, 코어 간 데이터 공유를 효율화합니다.

3-1단계 : 메인 메모리 (Main Memory, RAM)

  • 역할 : 현재 실행 중인 모든 프로그램과 관련 데이터가 적재되는 주 작업 공간입니다. 폰 노이만 구조의 핵심 요소로, 모든 프로그램은 실행되기 위해 반드시 메인 메모리에 올라와야 합니다.
  • 특징: 주로 저렴하고 집적도가 높은 DRAM(Dynamic RAM)으로 제작됩니다. 전원이 차단되면 데이터가 사라지는 휘발성(Volatile) 메모리입니다.
  • 메모리 보호: 다중 프로그래밍 환경에서는 여러 프로세스가 메모리를 공유하므로, 운영체제는 경계(Base) 레지스터와 한계(Limit) 레지스터 같은 메커니즘을 통해 각 프로세스가 할당된 영역을 벗어나 다른 프로세스의 메모리를 침범하지 않도록 보호합니다.

3-2단계 : 보조 저장장치 (Secondary Storage)

  • 역할 : 전원이 꺼져도 데이터가 유지되는 비휘발성(Non-volatile) 저장소입니다. 프로그램과 데이터를 영구적으로 보관하는 역할을 합니다.
  • 주요 종류
    • SSD (Solid-State Drive) : 낸드 플래시 메모리 기반의 저장장치입니다. 물리적 구동 부품이 없어 HDD보다 월등히 빠른 데이터 접근 속도, 높은 내구성, 저소음을 자랑합니다.
    • HDD (Hard Disk Drive) : 자기 플래터(Platter)를 회전시키고 헤드(Head)를 움직여 데이터를 읽고 쓰는 기계식 장치입니다. 용량 대비 가격이 매우 저렴하여 대용량 데이터 백업용으로 여전히 널리 사용됩니다.

3. 계층 구조의 핵심 작동 원리 : 지역성의 원리 (Principle of Locality)

저장장치 계층 구조가 효율적으로 작동할 수 있는 근본적인 이유는 프로그램이 메모리에 접근하는 패턴이 무작위적이지 않고 특정 경향을 보이기 때문입니다. 이를 '지역성의 원리'라고 합니다.

 

  • 시간적 지역성 (Temporal Locality) : 최근에 접근했던 메모리 위치는 가까운 미래에 다시 접근될 가능성이 높다는 원리입니다. (예: 반복문 내의 변수, 함수 호출) 이 원리 때문에 한 번 캐시에 적재된 데이터는 잠시 유지되어 재사용 시 성능을 높입니다.
  • 공간적 지역성 (Spatial Locality) : 특정 메모리 위치에 접근했을 때, 그 주변의 메모리 위치들도 곧 접근될 가능성이 높다는 원리입니다. (예: 배열 순회, 순차적 코드 실행) 이 때문에 시스템은 메모리에서 데이터를 가져올 때 요청된 데이터 하나만이 아닌, 그 주변 데이터를 포함하는 하나의 블록(Block) 또는 라인(Line) 단위로 캐시에 적재합니다.

이러한 지역성 원리 덕분에, CPU가 필요로 하는 데이터의 대부분이 상위 계층(캐시)에 존재할 확률(Cache Hit Ratio)이 높아집니다. 결과적으로 시스템은 대부분의 시간을 빠른 메모리에 접근하며, 평균 접근 시간을 획기적으로 단축시킬 수 있습니다.

 

정리

저장장치 계층 구조는 단순한 하드웨어의 나열이 아니라, 컴퓨터 시스템의 성능과 비용 효율성을 동시에 최적화하기 위한 정교한 설계 철학입니다. 각 계층은 상호 보완적으로 작동하며, 특히 '지역성의 원리'를 기반으로 CPU와 저장장치 간의 속도 격차를 효과적으로 메웁니다. 운영체제는 이 계층 구조를 효율적으로 관리하고 데이터를 적절히 이동시키는 역할을 수행하며, 이것이 시스템 전체 성능을 좌우하는 핵심 요소가 됩니다.

728x90

'운영체제' 카테고리의 다른 글

교착 상태(Deadlock)  (1) 2025.10.13
프로세스 동기화와 임계 구역 문제  (0) 2025.10.11
CPU 스케줄링  (0) 2025.10.02
컴퓨터 하드웨어와 성능의 이해  (0) 2025.09.20
프로세스와 스레드  (0) 2025.09.19