안녕하세요. 트윅히입니다.
벌써? 4탄까지 오게 되었네요.ㅎㅎㅎ
기초를 튼튼히!!
오늘 모두 에러 세이프한 하루 되세요!

📋 목차
- 동시성 vs 병렬성
- 원자성과 동기화, 그리고 교착상태
- 컴퓨터의 구성요소
- 프로그램, 프로세스, 스레드
- 메모리: Stack과 Heap
- Shell이란?
- OS의 핵심, 커널(Kernel)
- OS와 커널, 뭐가 다른 거야?
- User Mode vs Kernel Mode
- 가상 메모리 시스템
🔄 동시성 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 안에는 다양한 구성요소가 있지만, 그 중심에 있는 게 바로 커널이에요.
컴퓨터라는 국가에서, 법은 커널로 구현된다. ⚖️
커널은 절대 권력자예요. 모든 하드웨어 접근과 자원 배분을 커널이 관장해요.
커널이 하는 일
- I/O 제어: 키보드 입력, 파일 읽기/쓰기 같은 입출력 제어
- 자원 관리: CPU 사용 스케줄링, 메모리 할당 및 해제
- 접근 통제: 어떤 프로세스가 어떤 자원에 접근할 수 있는지 결정
커널 영역 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)
- 페이징 메모리: 필요에 따라 디스크로 내보낼 수 있는 메모리 영역
- 논페이징 메모리: 절대로 디스크로 쫓겨나면 안 되는 메모리 (커널 핵심 영역, 인터럽트 처리 등)
가상 메모리를 쓰는 이유
- 프로세스 격리 🔐
각 프로세스가 자신만의 가상 주소 공간을 가져서, 서로의 메모리를 침범할 수 없어요. - 안정성 🛡️
한 프로세스가 오류가 나도 OS 전체나 다른 프로세스에 영향을 주지 않아요. - 효율성 ⚡
RAM이 부족해도 여러 프로그램이 동시에 돌아갈 수 있어요. 실제로 필요한 부분만 RAM에 올리고, 나머지는 디스크에 두면 되니까요. - 프로그래밍 편의성 👨💻
C, C++ 같은 언어에서 직접 메모리를 다룰 때, 우리가 제어하는 건 사실 가상 메모리예요.
실제 물리 메모리 주소를 몰라도 되는 거죠!
// C에서 이렇게 할당하는 메모리도 가상 메모리 주소!
int* arr = (int*)malloc(sizeof(int) * 100);
🎯 마무리
오늘은 운영체제의 핵심 개념들을 쭉 훑어봤는데요, 어떠셨나요?
처음엔 낯설게 느껴지는 용어들이지만,
결국 모든 개념이 "어떻게 하면 컴퓨터 자원을 안전하고 효율적으로 쓸 수 있을까?" 라는 질문에 대한 답이라는 걸 알면
훨씬 친근하게 느껴지더라고요. 😊
다음에는 각 개념들을 코드와 함께 더 깊이 파보는 시간도 가져볼게요!
'✨ 1일 1개발지식' 카테고리의 다른 글
| [비전공자 전공자 되기 Part 6] ☕ 자바는 컴파일러 언어일까, 인터프리터 언어일까? — 하이브리드의 비밀 (0) | 2026.03.25 |
|---|---|
| [비전공자 전공자 되기 Part 5] 🧠 개발자라면 알아야 할 프로그래밍 기초 개념 정리 — 고급어부터 SDK까지 (0) | 2026.03.24 |
| [비전공자 전공자 되기 Part 3] 💻 컴퓨터는 어떻게 계산할까? — 디지털 회로부터 메모리 관리까지 (0) | 2026.03.22 |
| [비전공자 전공자 되기 Part 2] 💻 컴퓨터는 어떻게 데이터를 이해할까? — 비트(bit)부터 이미지까지 (1) | 2026.03.16 |
| [비전공자 전공자 되기 Part 1] 🌐 웹은 어떻게 지금의 모습이 되었을까? : 전체적인 구조와 흐름 (2) | 2026.03.12 |