[공부] OS 관련 핵심 개념

2026. 4. 4. 23:31·개발
반응형

운영체제(OS)는 단순히 컴퓨터를 켜고 프로그램을 실행해 주는 배경화면 같은 존재가 아니다.

깊이 있는 시스템 개발을 할 때, 운영체제의 핵심은 결국 한정된 자원의 효율적 관리와 병렬 처리로 귀결된다.

 

오늘은 운영체제의 핵심 개념들을 정리해 보겠다.

 

1. 프로세스와 스레드 (Process & Thread)

"프로세스와 스레드의 차이는?"

가장 기본적이면서도 중요한 질문이다.

쉽게 말해 프로세스(Process)는 운영체제로부터 자원을 할당받은 실행 중인 프로그램이고, 스레드(Thread)는 그 프로세스 내에서 실행되는 작업의 흐름이다.

 

멀티 스레드 환경에서는 여러 스레드가 같은 프로세스 내의 메모리(Data, Heap 영역)를 공유하기 때문에 효율적이지만,

치명적인 문제가 발생할 수 있다. 바로 경쟁 상태(Race Condition)다.

  • 경쟁 상태 (Race Condition): 여러 스레드가 동시에 공유 데이터에 접근하여 읽거나 쓰려고 할 때, 타이밍이나 순서에 따라 결과값에 영향을 줄 수 있는 상태.

이를 해결하기 위해 여러 스레드가 동시에 접근해서는 안 되는 공유 자원에 접근하는 코드 영역, 즉 임계 구역(Critical Section)을 설정하고 보호해야 한다.

 

임계 구역을 보호하는 두 요소

  • Mutex (뮤텍스): 동기화 대상이 오직 1개일 때 사용한다. (Lock을 가진 스레드만 임계 구역에 진입 가능)
  • Semaphore (세마포어): 동기화 대상이 1개 이상일 때 사용한다. (정해진 개수만큼의 스레드가 진입 가능)

쉽게 비유하자면...
뮤텍스는 화장실 칸의 열쇠와 같다. 열쇠를 가진 한 사람만 들어갈 수 있고, 나오면서 열쇠를 반납해야 다음 사람이 들어간다. 세마포어는 식당의 빈 좌석 수와 같다. 빈 좌석(허용된 자원)이 남아있으면 손님(스레드)이 들어갈 수 있고, 좌석이 0이 되면 밖에서 대기해야 한다.

2. 스케줄링과 컨텍스트 스위칭 (Scheduling & Context Switching)

CPU는 한 번에 하나의 작업만 할 수 있다.

하지만 우리가 노래를 들으며 코딩을 할 수 있는 이유는 운영체제가 CPU를 아주 빠르게 쪼개서 이 작업 저 작업을 번갈아 가며 실행해주기 때문이다. (CPU 스케줄링)

 

이때 현재 실행 중인 프로세스(또는 스레드)의 상태를 저장하고, 다음 실행할 프로세스의 상태를 불러오는 작업을 컨텍스트 스위칭(Context Switching)이라고 한다.

 

왜 컨텍스트 스위칭이 오버헤드(Overhead)를 발생시킬까?

  1. 레지스터 저장 및 복원: 현재 CPU의 레지스터 상태(PC, SP 등)를 메모리(PCB/TCB)에 저장하고 새로운 상태를 읽어와야 한다.
  2. 캐시 초기화 (Cache Flush): 프로세스가 변경되면 기존 CPU 캐시에 있던 데이터가 무용지물이 되어 캐시 미스(Cache Miss)가 대량으로 발생한다.

따라서 무작정 컨텍스트 스위칭을 자주 한다고 좋은 것이 아니며, 시스템 성능과 응답 시간 사이의 균형을 잡는 스케줄링 알고리즘(Round Robin, SJF 등)의 선택이 매우 중요하다.

3. 메모리 관리 (Memory Management)

요즘 프로그램들은 덩치가 매우 크다.

16GB 램을 가진 컴퓨터에서 어떻게 수십 GB에 달하는 게임이나 프로그램들을 동시에 돌릴 수 있을까?

그 비밀은 가상 메모리(Virtual Memory)에 있다.

 

가상 메모리는 프로세스에게 "너는 메모리를 아주 넓게 혼자 쓰고 있어!"라는 착각을 심어주는 기술이다.

실제 물리 메모리(RAM)의 크기와 상관없이, 필요한 부분만 메모리에 올리고 나머지는 디스크(Swap 영역)에 두는 방식이다.

 

이 메모리를 관리하는 두 가지 대표적인 기법이 있다.

  • 페이징 (Paging):
    • 메모리를 일정한 같은 크기로 잘라서 관리한다.
    • 외부 단편화(공간이 이리저리 찢어져서 못 쓰는 현상)는 해결되지만, 내부 단편화(잘라놓은 공간에 딱 맞지 않아 남는 공간)가 발생할 수 있다.
  • 세그멘테이션 (Segmentation):
    • 메모리를 코드, 데이터, 힙, 스택 등의 논리적인 의미 단위(서로 다른 크기)로 잘라서 관리한다.
    • 내부 단편화는 해결되지만, 외부 단편화가 발생할 수 있다.

현대 운영체제는 이 둘의 장점을 섞은 페이지드 세그멘테이션(Paged Segmentation) 기법을 주로 사용한다.

또한, 물리 메모리가 가득 찼을 때 어떤 페이지를 디스크로 내보낼지 결정하는 페이지 교체 알고리즘(LRU, LFU 등)도 시스템 성능을 좌우하는 핵심 요소다.

 

오늘 정리한 프로세스와 메모리, 스케줄링에 대한 이해도가 튼튼하게 잡혀 있다면 앞으로 다룰 네트워크나 데이터베이스의 복잡한 동작 원리를 이해하는 데도 훨씬 수월할 것이다.

 

다음 포스팅에서는 실시간 통신과 웹 서비스의 핵심인 네트워크(Network) 관련 지식들을 이어서 정리해 보겠다. 꾸준히 기본기를 다져보자.

반응형

'개발' 카테고리의 다른 글

[공부] 네트워크 주요 개념 정리  (0) 2026.04.04
'개발' 카테고리의 다른 글
  • [공부] 네트워크 주요 개념 정리
danieLee
danieLee
개발일지
  • danieLee
    Code log
    danieLee
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 개발 (76)
        • C++ (3)
        • java (6)
        • JavaScript (9)
        • python (0)
        • AWS (2)
        • Docker (6)
        • git (0)
        • 백엔드 (4)
        • Spring (7)
        • Django (2)
        • AI (3)
        • 코테 준비 (13)
        • 알고리즘 (6)
        • SKALA 4기 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    js
    Ai
    API
    프론트
    백엔드
    java
    개념
    개발자
    skala
    서버
    코테
    파이썬
    JavaScript
    대학생
    개발
    spring
    4기
    프로그래머스
    vue.js
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.1
danieLee
[공부] OS 관련 핵심 개념
상단으로

티스토리툴바