✨ 1일 1개발지식

[비전공자 전공자 되기 Part 4] 💻 개발자라면 알아야 할 운영체제 핵심 개념 정리(커널과 OS..등)

twoweekhee 2026. 3. 23. 10:56

 

안녕하세요. 트윅히입니다.

벌써? 4탄까지 오게 되었네요.ㅎㅎㅎ

 

기초를 튼튼히!!

오늘 모두 에러 세이프한 하루 되세요!

📋 목차

  1. 동시성 vs 병렬성
  2. 원자성과 동기화, 그리고 교착상태
  3. 컴퓨터의 구성요소
  4. 프로그램, 프로세스, 스레드
  5. 메모리: Stack과 Heap
  6. Shell이란?
  7. OS의 핵심, 커널(Kernel)
  8. OS와 커널, 뭐가 다른 거야?
  9. User Mode vs Kernel Mode
  10. 가상 메모리 시스템

🔄 동시성 vs 병렬성

동시성(Concurrency) 은 여러가지 일이 동시에 진행되는 것.

병렬성(Parallelism) 은 같은 일을 여러주체가 함께 동시에 진행되는 것

동시성: 요리사 1명이 밥도 먹고 tv도 보는 것 🧑‍🍳
병렬성: 요리사 여러 명이 각자 요리를 동시에 만드는 것 🧑‍🍳🧑‍🍳🧑‍🍳

🔒 원자성과 동기화, 그리고 교착상태

원자성(Atomicity)

원자성은 "내가 이 자원을 쓰는 동안 아무도 끼어들지 않는다" 는 보장이에요.
데이터베이스의 트랜잭션을 생각하면 이해하기 쉬워요.

중간에 끊기면 안 되고, 완전히 성공하거나 완전히 실패하거나!

동기화(Synchronization)

동기화는 잠금 장치의 필요성과 비슷해요.
여러 스레드가 공유 자원에 동시에 접근하면 데이터가 꼬일 수 있거든요.

그래서 "지금 내가 쓰고 있어, 잠깐 기다려!" 라고 알려주는 메커니즘이 필요한 거예요.

운영체제에서는 이걸 mutex, semaphore 같은 도구로 구현해요.

교착상태(Deadlock) 🚽

제가 제일 좋아하는 비유예요.

화장실에 휴지가 없어서 못 나오는 사람 A.
A가 나와야 휴지를 들고 들어갈 수 있는 사람 B.
결국 둘 다 영원히 기다리는 상태!

 

이게 바로 교착상태예요.

두 프로세스가 서로 상대방이 점유한 자원을 기다리다가 아무것도 못 하게 되는 상황이죠.

프로세스 A: "B가 가진 자원이 필요해. B야, 줘."
프로세스 B: "A가 가진 자원이 필요해. A야, 줘."
결과: 🔁 무한 대기...

🖥️ 컴퓨터의 구성요소

컴퓨터는 크게 하드웨어소프트웨어로 나뉘어요.

컴퓨터
├── 하드웨어 (CPU, RAM, 디스크, 키보드 등 물리적인 것)
└── 소프트웨어
    ├── 시스템 소프트웨어 (OS, 드라이버 등)
    └── 애플리케이션 (우리가 쓰는 앱들)

 

여기서 운영체제(OS) 는 시스템 소프트웨어의 대표 주자예요.
하드웨어와 애플리케이션 사이에서 중간 다리 역할을 하죠.

OS 없이는 우리가 앱을 실행하거나 파일을 저장하는 것조차 불가능해요.


🧬 프로그램, 프로세스, 스레드

이 세 가지 개념의 차이를 제대로 이해하면 개발할 때 정말 많은 게 보여요.

프로그램 (Program)

프로그램은 디스크에 설치된, 아직 실행되지 않은 상태의 코드 덩어리예요.
카카오톡 앱을 설치했지만 아직 안 켠 상태라고 생각하면 돼요.

프로세스 (Process)

프로그램을 실행하면 비로소 프로세스가 돼요.
운영체제가 메모리를 할당해주고, CPU를 사용할 수 있는 자격이 생기는 거예요.

컴퓨터라는 세상에서 프로그램은 당신의 유전자(DNA)이고,
프로세스는 그 유전자로 태어나 살아있는 당신 자신이에요. 🌱

스레드 (Thread)

스레드는 프로세스 안에서 실제로 작업을 수행하는 실행 단위예요.
하나의 프로세스 안에 여러 스레드가 존재할 수 있고, 이 스레드들은 프로세스에 할당된 메모리(Heap)를 서로 공유해요.

프로세스 (카카오톡)
├── 스레드 1: 메시지 수신 처리
├── 스레드 2: 화면 UI 렌더링
└── 스레드 3: 파일 다운로드

 

멀티프로세스란 이런 프로세스 여러 개가 동시에 돌아가는 상태예요.
디버거(debugger)를 써봤다면 각 프로세스의 메모리를 들여다보는 경험을 해보셨을 거예요.


🧠 메모리: Stack과 Heap

메모리는 크게 두 영역으로 나뉘어요.

영역 주체 특징

Stack 스레드 함수 호출, 지역변수 저장. 자동으로 관리됨
Heap 프로세스 동적으로 할당되는 메모리. 직접 관리 필요

 

Stack은 스레드마다 별도로 가지고 있어서 스레드 간에 공유되지 않아요.
반면 Heap은 같은 프로세스 안의 스레드들이 공유하기 때문에, 여기에 동시에 접근할 때는 동기화가 필요해요!

C나 C++ 같은 언어에서 malloc, new로 할당하는 메모리가 바로 Heap 영역이에요.


🐚 Shell이란?

Shell은 사용자가 운영체제(정확히는 커널)와 소통할 수 있도록 해주는 인터페이스예요.

터미널을 열면 보이는 그 커맨드라인이 바로 Shell이죠. bash, zsh, fish 같은 게 모두 Shell의 종류예요.

# 이런 걸 입력하는 그 공간이 Shell!
$ ls -la
$ cd /home/user
$ echo "Hello, World!"

 

Shell은 우리가 입력한 명령어를 해석해서 커널에 전달하고, 커널이 처리한 결과를 다시 우리에게 보여주는 역할을 해요.


⚙️ OS의 핵심, 커널(Kernel)

OS 안에는 다양한 구성요소가 있지만, 그 중심에 있는 게 바로 커널이에요.

컴퓨터라는 국가에서, 법은 커널로 구현된다. ⚖️

 

커널은 절대 권력자예요. 모든 하드웨어 접근과 자원 배분을 커널이 관장해요.

커널이 하는 일

  1. I/O 제어: 키보드 입력, 파일 읽기/쓰기 같은 입출력 제어
  2. 자원 관리: CPU 사용 스케줄링, 메모리 할당 및 해제
  3. 접근 통제: 어떤 프로세스가 어떤 자원에 접근할 수 있는지 결정

커널 영역 vs 사용자 영역

커널이 동작하는 공간과 일반 애플리케이션이 동작하는 공간은 완전히 분리된 다른 세상이에요.
일반 앱이 커널 영역을 직접 침범할 수 없어요. OS가 이를 철저하게 막아두거든요.

[사용자 영역]    ←── 일반 앱들이 사는 세상
      ↕ (시스템 콜을 통해서만 통신)
[커널 영역]      ←── 커널이 지배하는 세상
      ↕
[하드웨어]       ←── 드라이버를 통해 제어

드라이버와 디바이스 파일

커널은 드라이버를 통해 하드웨어 장치(디바이스)를 제어해요.
그리고 프로세스가 드라이버에 접근할 때는 디바이스 파일이라는 인터페이스를 사용해요.

리눅스에서 /dev/ 디렉토리에 있는 파일들이 바로 그것들이에요.

접근 권한은 OS가 부여하기 때문에, 권한 없이 디바이스에 접근하려 하면 거부당해요.

💡 실시간 감지 엔진(바이러스 백신 등)은 프로세스가 드라이버에 I/O를 요청하기 전에 가로채서 감시해요.
이래서 보안 소프트웨어가 커널 수준에서 동작하는 거예요.

 


🤔 OS와 커널, 뭐가 다른 거야?

커널을 공부하다 보면 꼭 드는 의문이 있어요.

"그래서 OS랑 커널이랑 같은 거야, 다른 거야?"

결론부터 말하면 커널은 OS의 일부예요.

관계로 보면 '핵심 부품'과 '전체 패키지' 의 차이라고 보면 딱 맞아요.

커널 (Kernel) — OS의 심장 ❤️

커널은 컴퓨터가 켜지는 순간부터 메모리에 올라와서 시스템 전체를 조용히 제어해요.
사용자 눈에는 보이지 않지만, 없으면 아무것도 동작하지 않는 핵심 엔진이에요.

  • CPU 스케줄링, 메모리 할당 같은 자원 관리
  • 드라이버를 통한 하드웨어 통신
  • 사용자 프로세스가 하드웨어에 직접 접근하지 못하도록 막는 보안 역할

운영체제 (OS) — 사용자 경험까지 포함한 전체 패키지 📦

OS는 커널 위에 여러 구성요소를 얹어서 사람이 실제로 쓸 수 있는 환경을 만들어요.

운영체제 (OS)
├── 커널 (Kernel)          ← 시스템의 핵심 엔진
├── 쉘 (Shell)             ← 사용자 명령을 커널에 전달하는 인터페이스
├── GUI                    ← 바탕화면, 아이콘, 창 관리
└── 시스템 유틸리티        ← 파일 관리자, 네트워크 설정 도구 등
구분커널운영체제
범위 OS의 핵심 부분 커널 + Shell + GUI + 유틸리티
사용자 노출 ❌ 보이지 않음 ✅ 직접 사용하는 환경
예시 Linux 커널, NT 커널 Ubuntu, Windows 11, macOS

💡 리눅스가 좋은 예시예요. Linux는 엄밀히 말하면 커널 이름이고,
우리가 쓰는 Ubuntu, Fedora, Debian 등이 Linux 커널 위에 Shell과 GUI를 얹은 완성형 OS예요.


🎭 User Mode vs Kernel Mode

CPU는 두 가지 동작 모드를 가지고 있어요.

모드 설명 접근 범위

User Mode 일반 애플리케이션 실행 제한된 자원만 접근 가능
Kernel Mode OS 커널 실행 모든 하드웨어 자원 접근 가능
소프트웨어 = 논리적(Logical) = 가상(Virtual)
하드웨어   = 물리적(Physical) = 실제(Machine)

소프트웨어 + Kernel Mode = OS

OS는 하드웨어에 종속적이에요.

그래서 Windows용 앱이 macOS에서 바로 안 돌아가는 거고, ARM용 바이너리가 x86에서 바로 안 도는 거예요.


💾 가상 메모리 시스템

이제 조금 더 깊은 주제, 가상 메모리로 가볼게요.

페이지(Page)란?

메모리를 관리하기 쉽도록 일정한 크기로 나눈 단위가 페이지예요.
일반적으로 4KB 단위로 나눠요.

Page Out / Swap Out

RAM이 부족할 때 OS는 당장 쓰지 않는 메모리 페이지를 하드 디스크로 쫓아내요.
이걸 Page Out 또는 Swap Out이라고 해요.

반대로 쫓겨났던 페이지가 다시 RAM으로 들어오는 걸 Swap In / Page In이라고 하고요.

이 과정에서 잠깐 멈추는 현상(Stall)이 생기는데, 이게 바로 PC가 갑자기 느려지는 이유 중 하나예요.

RAM (빠름, 비쌈)  ←──swap in/out──→  Disk (느림, 쌈)
                        ↕
               이 과정에서 잠깐 멈춤 ⏸️

Windows에서 "가상 메모리" 설정을 보면 하드 디스크의 일부를 RAM처럼 쓰는 영역이 있어요.
이게 바로 Swap 공간(페이징 파일) 이에요.

페이징(Paging) vs 논페이징(Non-Paging)

  • 페이징 메모리: 필요에 따라 디스크로 내보낼 수 있는 메모리 영역
  • 논페이징 메모리: 절대로 디스크로 쫓겨나면 안 되는 메모리 (커널 핵심 영역, 인터럽트 처리 등)

가상 메모리를 쓰는 이유

  1. 프로세스 격리 🔐
    각 프로세스가 자신만의 가상 주소 공간을 가져서, 서로의 메모리를 침범할 수 없어요.
  2. 안정성 🛡️
    한 프로세스가 오류가 나도 OS 전체나 다른 프로세스에 영향을 주지 않아요.
  3. 효율성
    RAM이 부족해도 여러 프로그램이 동시에 돌아갈 수 있어요. 실제로 필요한 부분만 RAM에 올리고, 나머지는 디스크에 두면 되니까요.
  4. 프로그래밍 편의성 👨‍💻
    C, C++ 같은 언어에서 직접 메모리를 다룰 때, 우리가 제어하는 건 사실 가상 메모리예요.
    실제 물리 메모리 주소를 몰라도 되는 거죠!
// C에서 이렇게 할당하는 메모리도 가상 메모리 주소!
int* arr = (int*)malloc(sizeof(int) * 100);

🎯 마무리

오늘은 운영체제의 핵심 개념들을 쭉 훑어봤는데요, 어떠셨나요?

처음엔 낯설게 느껴지는 용어들이지만,

결국 모든 개념이 "어떻게 하면 컴퓨터 자원을 안전하고 효율적으로 쓸 수 있을까?" 라는 질문에 대한 답이라는 걸 알면

훨씬 친근하게 느껴지더라고요. 😊

다음에는 각 개념들을 코드와 함께 더 깊이 파보는 시간도 가져볼게요!