Post

2026-04-11 TIL (Weekend)

2026-04-11 TIL (Weekend)

cs

• 운영체제

CUI

GUI가 등장하기 전, 컴퓨터와 대화하던 오리지널 방식입니다. (CLI라고도 부릅니다.) 마우스나 아이콘 없이 오직 검은 화면에 키보드(텍스트)로만 명령을 내리는 환경입니다.

  • CUI 환경
    • 오타가 하나라도 나면 매정하게 ‘에러(Error)’를 뱉어냅니다.
  • 특징: 일반인에겐 외워야 할 명령어가 너무 많아 진입장벽이 높지만, 명령어를 숙지한 전문가(개발자, 해커)들에게는 마우스 클릭 여러 번보다 타자 한 줄이 훨씬 빠르기 때문에 여전히 강력하게 쓰입니다.


GUI

GUI는 우리가 화면에서 보는 아이콘, 창, 버튼, 마우스 포인터 그 자체입니다. 컴퓨터와 인간이 쉽게 대화할 수 있도록 만들어 놓은 *8시각적인 소통 창구(버튼과 그림판)**입니다.

  • GUI가 없던 시절
    • 자판기에 가서 키보드로 [콜라 1개 배출 명령 실행]이라고 직접 타자를 쳐야만 콜라가 나왔습니다.
  • GUI가 있는 지금
    • 자판기에 ‘콜라 그림이 그려진 버튼’이 생겼습니다. 복잡한 명령어를 칠 필요 없이, 그냥 마우스로 그 버튼을 클릭만 하면 됩니다.


Driver

드라이버는 CPU에서 외부 장치로 명령을 전달할 뿐만 아니라, 외부 장치에서 CPU로 신호를 보낼 때도 번역을 해주는 양방향 통역사입니다.

  • 입력할 때 (마우스 ➡️ 드라이버 ➡️ CPU)
    • 마우스를 움직이면 기계는 전기 신호만 보냅니다. (CPU는 이 전기가 무슨 뜻인지 모릅니다.)
    • 이때 마우스 드라이버가 마우스를 X좌표 5, Y좌표 10만큼 움직였습니다라고 CPU가 알아들을 수 있는 언어로 번역해 줍니다.
  • 출력할 때 (CPU ➡️ 드라이버 ➡️ 스피커)
    • CPU가 “총소리 파일 재생해!”라고 연산 결과를 내놓습니다.
    • 사운드 드라이버가 이를 듣고 스피커야, 1초에 440번씩 떨어라라고 기계가 알아듣는 물리적/전기적 신호로 번역해서 소리를 내게 만듭니다.


요약

  • GUI: 우리가 편하게 누를 수 있는 화면 속 ‘버튼과 그림들’
  • CPU: GUI 버튼이 눌리면 어떻게 할지 계산하고 명령하는 ‘두뇌’
  • 드라이버: 두뇌(CPU)와 기계(마우스, 스피커) 사이에서 서로의 말을 번역해 주는 ‘통역사’

시스템 콜

시스템 콜이란, 프로그램이 만질 수 없는 하드웨어를 조작하기 위해 운영체제에게 보내는 요청서입니다.


시스템 콜 흐름도

  • 명령을 내릴 때
    • 응용 프로그램 ➡️ [시스템 콜] ➡️ 커널 & 드라이버 ➡️ 하드웨어
  • 신호를 받을 때
    • 하드웨어 ➡️ [인터럽트] ➡️ 커널 & 드라이버 ➡️ 응용 프로그램


요약

프로그램은 ‘시스템 콜’로 커널에 부탁해서 기계를 움직이고, 기계는 ‘인터럽트’로 커널을 찔러서 프로그램에 신호를 보낸다!


• 컴퓨터 요소

CPU

마우스를 움직이든, 타자를 치든, 게임을 하든 컴퓨터 안에서 일어나는 모든 일은 결국 0과 1의 수학 계산(연산)입니다.

CPU는 이 연산을 엄청나게 빠른 속도로 처리해서 누가, 언제, 무엇을 해야 하는지 모든 부품에게 명령을 내리는 총괄 매니저이자 두뇌 역할을 합니다.


• 메모리

메모리 계층별 특징 및 기능

계층장치명주요 기능특징
L0레지스터 (Register)현재 연산 중인 데이터의 일시 저장가장 빠름, 극소량 용량
L1~L3캐시 메모리 (Cache)RAM의 데이터를 미리 가져와 대기속도 완충 역할 (SRAM)
L4주기억장치 (RAM)실행 중인 프로그램(프로세스) 적재휘발성 (끄면 날아감, DRAM)
L5보조기억장치 (SSD/HDD)데이터 영구 저장 (파일, 프로그램)비휘발성, 느리지만 대용량

요약: 속도 vs 용량의 반비례 관계

  • 위로 갈수록 (CPU와 가까울수록): 속도 ↑, 가격 ↑, 용량 ↓
  • 아래로 갈수록 (CPU와 멀어질수록): 속도 ↓, 가격 ↓, 용량 ↑

• 페이지 교체 알고리즘

한정된 RAM 용량을 효율적으로 쓰기 위해, 메모리가 꽉 차면 기존 데이터를 쫓아내고 새 데이터를 적재해야 합니다. 이때 누구를 쫓아낼 것인가를 결정하는 것이 페이지 교체 알고리즘입니다.


운영체제 관점

  • LRU (Least Recently Used): “가장 오랫동안 안 쓴 놈을 쫓아내자!”
    • 이상 (이론): “최근에 안 쓴 데이터는 앞으로도 안 쓸 확률이 높다”는 시간적 지역성(Temporal Locality)에 기반한 아주 합리적이고 이상적인 알고리즘입니다.
    • 현실 (OS의 한계): 실제 OS 메모리 관리에서는 순수 LRU를 거의 쓰지 못합니다. LRU를 완벽히 구현하려면 모든 메모리 접근마다 시간을 기록(Timestamping)하거나 리스트를 갱신해야 하는데, 이는 하드웨어적으로 엄청난 비용(Overhead)과 속도 저하를 발생시키기 때문입니다.
    • 대안: 그래서 실제 OS는 LRU와 비슷하게 동작하면서 부하가 적은 NUR(Not Used Recently) 계열의 Clock 알고리즘(Second Chance)을 주로 사용합니다. (최근에 썼는지 여부만 1비트로 대충 기록해 두고 쫓아내는 방식)


C++ 및 게임 개발 관점

OS 단에서는 오버헤드 때문에 못 쓰지만, C++ 클라이언트나 서버 프로그래머가 애플리케이션 레벨(App Level)에서 직접 캐시 시스템을 코딩할 때는 압도적으로 LRU를 많이 사용합니다.

  • 게임 개발
    • 에셋(이미지, 텍스처) 로딩: RPG 게임에서 플레이어가 가방을 엽니다. 수백 개의 아이템 아이콘 이미지를 RAM에 다 올려두면 메모리가 터집니다.
    • LRU 캐시 적용: “최대 50개의 이미지만 메모리에 유지하자. 만약 51번째 이미지를 불러와야 하면, 화면에 보이지 않은 지 가장 오래된 아이템 이미지를 메모리에서 삭제(Evict)하자.”


C++에서 LRU 알고리즘은 구현하는 법

면접관이 “그래서 LRU 캐시 만들 때 어떤 자료구조를 쓸 건가요?” 라고 물어보면 무조건 이렇게 대답해야 합니다.

“검색(접근) 속도 $O(1)$과 갱신/삭제 속도 $O(1)$을 동시에 만족하기 위해 Hash MapDoubly Linked List (이중 연결 리스트)를 조합하여 사용합니다.”

  1. std::list (이중 연결 리스트)
    • 데이터를 저장하고 ‘최근에 사용된 순서’를 관리합니다.
    • 방금 사용한 데이터는 리스트의 맨 앞(Head)으로 옮기고, 쫓아낼 때는 맨 뒤(Tail)에 있는 것을 날려버립니다.
  2. std::unordered_map (해시 맵)
    • Key 값으로 리스트의 특정 노드(주소)를 즉시 찾아냅니다. (리스트를 처음부터 순회하면 $O(N)$이 걸려서 느리기 때문입니다.)


요약

  • OS에서의 LRU: 이론은 완벽하지만, 속도 저하 문제 때문에 완벽한 구현 대신 Clock 알고리즘으로 타협한다.
  • 게임 개발에서의 LRU: 메모리 절약을 위한 ‘에셋 캐싱’에 필수적으로 쓰인다. 검색과 순서 변경을 모두 $O(1)$로 처리하기 위해 반드시 해시 맵 + 이중 연결 리스트 구조로 코딩한다!

• 프로세스

프로세스

현재 메모리에 올라와 CPU가 실행하고 있는 프로그램입니다.


멈춰있는 프로그램 vs 살아있는 프로세스

구분컴퓨터 공학적 의미요리 비유특징
프로그램 (Program)하드디스크(SSD)에 저장된 정적인 코드 덩어리📖 요리 레시피 (책)생명력이 없는 단순한 파일 (예: chrome.exe)
프로세스 (Process)메모리(RAM)에 적재되어 CPU가 연산 중인 상태🍳 요리하는 행위 자체CPU 자원을 소모하며 살아 움직이는 동적인 상태

즉, 바탕화면의 롤(LoL) 아이콘은 ‘프로그램’이고, 아이콘을 더블클릭해서 게임 화면이 켜지면 그것이 ‘프로세스’가 됩니다. 똑같은 프로그램을 2개 켜면 프로세스도 2개가 생성됩니다.


프로세스의 메모리 구조

프로그램이 프로세스가 되어 메모리에 올라갈 때, 운영체제는 프로세스에게 4개의 메모리 공간을 할당해 줍니다. (다른 프로세스의 공간은 침범 불가)

  • 코드(Code) 영역: 프로그래머가 작성한 소스 코드가 기계어 형태로 들어갑니다. (읽기 전용)
  • 데이터(Data) 영역: 전역 변수(Global)나 정적 변수(Static)가 저장됩니다.
  • 힙(Heap) 영역: 프로그래머가 런타임에 동적으로 할당하는 메모리입니다. (C++의 new, 언리얼의 NewObject)
  • 스택(Stack) 영역: 함수 호출 시 쓰이는 지역 변수(Local)와 매개 변수가 저장되는 임시 공간입니다.

프로그램의 컴파일 과정

사진 자료


소스 코드 파일 (Source Code)

  • 정체: 개발자가 직접 영어와 기호로 작성한 코드입니다. (예: main.cpp)
  • 비유: 요리사가 노트에 사람의 언어로 끄적인 ‘요리 레시피 초안’입니다.

전처리 (Preprocessing)

  • 정체: 코드를 본격적으로 번역하기 전에, 코드를 정리하고 준비하는 단계입니다. #include <iostream> 같은 문장을 보면 다른 파일의 내용을 통째로 복사해 오거나, #define으로 정의된 매크로를 실제 글자로 싹 바꿔치기합니다.
  • 비유: 요리하기 전에 레시피 초안에서 “비법 소스 참고”라고 적힌 부분을 보고, 진짜 비법 소스 책을 펼쳐서 내용을 꽉꽉 채워 넣은 ‘완성된 레시피’를 만드는 과정입니다.

컴파일러 (Compiler)

  • 정체: 전처리가 끝난 C++ 코드를 컴퓨터가 조금 더 알아듣기 쉬운 어셈블리어로 번역하는 핵심 도구입니다. 이 과정에서 문법이 틀렸는지(세미콜론 빠짐 등) 깐깐하게 검사해서 에러를 뿜어냅니다.
  • 비유: 한국어 레시피를 기계들이 알아듣기 쉬운 ‘기계어’로 1차 번역하는 ‘통역사’입니다.

어셈블러 (Assembler)

  • 정체: 컴파일러가 만든 어셈블리어를 완벽한 컴퓨터의 언어, 즉 0과 1로 이루어진 기계어로 최종 번역하는 도구입니다.

목적 코드 (Object Code)

  • 정체: 어셈블러가 만들어낸 0과 1의 결과물입니다. (확장자 .o 또는 .obj) 컴퓨터가 읽을 수는 있지만, 아직 실행할 수는 없습니다. 왜냐하면 printfstd::cout 같은 외부 기능들이 어디 있는지 주소가 뚫려있기 때문입니다.
  • 비유: 조립은 끝났는데, 엔진(라이브러리)이 아직 안 달려서 시동을 걸 수 없는 미완성 자동차입니다.

라이브러리 (Library)

  • 정체: 화면에 글자를 띄우거나, 네트워크를 연결하는 등 남들이 미리 만들어둔 아주 유용한 ‘목적 코드들의 꾸러미’입니다.
  • 비유: 자동차 공장에서 미리 만들어둔 ‘엔진’, ‘바퀴’ 같은 기성품 부품들입니다.

링커 (Linker)

  • 정체: 내가 짠 코드의 ‘목적 코드’와 남이 짠 ‘라이브러리’를 하나로 엮어주는(Link) 도구입니다. 뚫려있던 주소들을 서로 완벽하게 연결해 줍니다.
  • 비유: 미완성 자동차(목적 코드)에 기성품 부품(라이브러리)을 용접해서 완벽하게 굴러가는 자동차로 조립하는 최종 조립 기계입니다.

실행 가능한 파일 (Executable File)

  • 정체: 링커의 꼼꼼한 작업을 거쳐 드디어 탄생한 최종 결과물입니다. (우리가 흔히 아는 .exe 파일입니다.) 바탕화면에서 더블클릭하면 드디어 프로그램이 실행됩니다

결과

빌드 파이프라인의 끝에서 탄생한 실행 파일(.exe)이 곧 프로그램이며, 이걸 더블 클릭해서 실행하는 순간 메모리에 올라가 ‘프로세스’가 된다


프로세스의 7가지 상태 변화

사진 자료

프로세스는 생성되어 종료될 때까지, CPU와 메모리의 상황에 따라 끊임없이 상태를 바꿉니다. 특히 메모리(RAM)가 꽉 찼을 때 하드디스크로 쫓겨나는 ‘중단(Suspended)’ 상태를 이해해야합니다.


활성 상태 (Active: 메모리에 올라와 있는 상태)

프로세스가 정상적으로 RAM(주기억장치)에 적재되어 CPU의 선택을 기다리거나 실행 중인 상태입니다.

  • 생성 (New / Created)
    • 사용자가 프로그램을 실행하여 프로세스가 생성되는 중인 상태. 아직 메모리에 완전히 올라가지 않은 초기 단계입니다.
  • 대기 (Ready)
    • 메모리에 올라와서 “CPU님, 저 이제 실행할 준비 다 됐어요!” 하고 줄을 서서 기다리는 상태입니다.
  • 실행 (Running)
    • 줄을 서 있다가 드디어 CPU를 할당받아(Dispatch) 실제 코드가 연산되고 있는 상태입니다.
  • 중단 (Blocked / 보통 ‘대기’라고 부름)
    • CPU를 쓰다가 갑자기 프린터 출력이나 키보드 입력 같은 I/O(입출력) 작업이 필요해진 상태입니다. CPU는 노는 것을 싫어하므로, 이 프로세스를 잠시 멈춰두고 I/O가 끝날 때까지 여기서 기다리게 합니다. (끝나면 다시 ‘대기(Ready)’ 줄로 돌아갑니다.)


지연 상태 (Suspended: 메모리에서 쫓겨난 상태)

컴퓨터의 RAM 용량이 꽉 차면, OS는 당장 급하지 않은 프로세스를 하드디스크(Swap 영역)로 잠시 쫓아냅니다. (이 과정을 Swap-out이라 부르며, 다시 RAM으로 돌아오는 것을 Swap-in이라 합니다.)

  • 대기 중단 (Suspended Ready)
    • ‘대기(Ready)’ 상태로 줄을 서 있었는데, RAM 용량이 부족해서 하드디스크로 쫓겨난 상태입니다. 메모리 여유가 생기면 다시 RAM으로 올라옵니다.
  • 일시 중단 (Suspended Blocked)
    • ‘중단(Blocked)’ 상태에서 I/O 작업을 기다리다가, RAM 용량 부족으로 하드디스크로 쫓겨난 상태입니다. 쫓겨난 상태에서 I/O 작업이 완료되면 ‘대기 중단(Suspended Ready)’ 상태로 이동합니다.


종료 상태

  • 종료 (Terminated / Exit)
    • 프로세스의 모든 작업이 끝나고, 사용하던 메모리와 자원을 모두 운영체제에 반납하고 완전히 소멸된 상태입니다.


요약

  • 디스패치 (Dispatch): 대기(Ready) ➡️ 실행(Running) (CPU를 할당받음)
  • 인터럽트 (Interrupt): 실행(Running) ➡️ 대기(Ready) (할당된 시간이 다 돼서 강제로 뺏김)
  • I/O 발생 (Block): 실행(Running) ➡️ 중단(Blocked) (입출력 작업 때문에 스스로 CPU를 놔줌)
  • 스왑 아웃 (Swap-out): 메모리가 부족해서 하드디스크로 쫓겨남 (Suspended 상태로 이동)

• PCB

PCB는 운영체제(OS)가 자신의 메모리 구역(커널 영역)에 할당해 두고 쓰는 C/C++ 구조체(struct) 데이터

  • 메모리 위치: 사용자가 접근할 수 없는 OS만의 절대 구역인 커널 메모리(Kernel Space)에 저장됩니다.
  • 데이터 형태: 프로세스 하나가 생성될 때마다, OS는 malloc이나 new를 하듯 커널 영역에 C 언어 구조체(struct) 하나를 동적 할당하여 기록합니다.
  • 실제 리눅스(Linux) 소스코드: 리눅스 커널을 까보면 PCB는 실제로 task_struct라는 이름의 거대한 구조체로 정의되어 있으며, 그 안에 PID, 상태, 레지스터 값들이 멤버 변수로 빽빽하게 들어있습니다.

컨텍스트 스위칭

컨텍스트 스위칭(Context Switching)은 작업이 교체되는 것이 아니라, 단순히 구조체(PCB) 데이터를 CPU와 주고받는 메모리 복사 작업(Save & Load)일 뿐입니다.

  • 동작 원리 (Save & Load)
    1. [Save]: CPU가 ‘프로세스 A’의 실행을 멈출 때, 현재 CPU 레지스터에 들고 있던 중간 계산값들과 다음에 읽을 줄 번호(PC)를 커널 영역에 있는 PCB_A 구조체의 멤버 변수에 덮어씁니다 (저장).
    2. [교체]: OS가 다음에 실행할 ‘프로세스 B’를 선택합니다.
    3. [Load]: 커널 영역에 저장되어 있던 PCB_B 구조체를 열어서, 예전에 기록해 두었던 레지스터 값들을 CPU로 다시 복사해 넣습니다 (복원).
    4. [실행]: CPU는 방금 복원된 값을 바탕으로, 프로세스 B가 멈췄던 지점부터 아무 일 없었다는 듯이 이어서 실행합니다.


요약

PCB는 OS 커널 영역에 동적 할당되는 묵직한 C 언어 구조체(struct) 데이터다
컨텍스트 스위칭은 CPU가 작업(프로세스)을 바꿀 때마다, 이 구조체 A에 현재 상태를 저장(Save)하고 구조체 B에서 다음 상태를 꺼내오는(Load) 정교한 메모리 복사 과정이다.

• 멀티프로세싱

여러 개의 ‘프로세스’, 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행 할 수 있는 것을 말합니다. (프로세스를 2개(이상) 켜서 같이 구동시킨다)

  • 장점: 각 프로세스가 독립된 메모리 공간을 가지므로, 하나가 죽어도 다른 프로세스에 영향을 주지 않아 안정성이 매우 높습니다.
  • 단점: 독립된 공간을 쓰기 때문에 메모리 차지 비중이 크고, 컨텍스트 스위칭 비용이 무겁습니다.


• IPC

프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘

IPC의 7가지 주요 방식

공유메모리

프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 메모리를 생성해서 통신하는 것을 말합니다.

파일

디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터를 말합니다. 이를 기반으로 프로세스 간 통신을 합니다.

소켓

동일한 컴퓨터의 다른 프로세스나 네트웤크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미하며 TCP와 UDP가 있습니다.

익명 파이프

프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식입니다.

명명된 파이프

파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프를 말합니다.

메세지 큐

메시지를 큐 데이터 구조 형태로 관리하는 것을 의미합니다.

정리

방식특징 및 핵심 요약
1. 공유 메모리 (Shared Memory)“가장 빠르지만 규칙이 필요한 통신”
프로세스들이 공통으로 사용할 수 있는 메모리 블록을 하나 만들어서 직접 읽고 씁니다. 통신 속도가 가장 빠르지만, 동시에 데이터를 수정하다가 꼬일 수 있으므로 반드시 동기화(Mutex, Semaphore) 작업이 필요합니다.
2. 익명 파이프 (Anonymous Pipe)“부모-자식 간의 단방향 통신”
FIFO(First In First Out) 방식의 임시 공간입니다. 한쪽은 쓰기만, 한쪽은 읽기만 가능한 단방향(반이중) 통신이며, 보통 부모-자식 프로세스처럼 서로 관련이 있는 프로세스 사이에서만 쓸 수 있습니다.
3. 명명된 파이프 (Named Pipe)“남남끼리도 가능한 통신”
익명 파이프와 달리 이름을 부여하여, 전혀 관련이 없는 독립적인 프로세스들 사이에서도 통신이 가능하게 만든 파이프입니다. (양방향 통신도 가능)
4. 메시지 큐 (Message Queue)“우체통 방식의 비동기 통신”
데이터를 ‘메시지’ 단위로 큐(Queue) 자료구조에 담아 던져놓습니다. 받는 쪽은 자신이 원할 때 언제든 메시지를 꺼내볼 수 있어 비동기적 통신에 매우 유리합니다.
5. 소켓 (Socket)“네트워크를 넘나드는 통신”
같은 컴퓨터 안에서는 물론이고, 네트워크로 연결된 다른 컴퓨터의 프로세스와도 통신할 수 있는 범용적인 방식입니다. (TCP/UDP 활용)
6. 시그널 (Signal)“단순하고 긴급한 이벤트 알림”
복잡한 데이터 대신 “너 강제 종료해(kill)”, “메모리 에러 났어” 같은 특정 시스템 이벤트를 프로세스에게 긴급히 전달할 때 쓰는 방식입니다.
7. 파일 (File)“가장 원초적인 통신”
디스크에 텍스트나 데이터를 저장하고, 다른 프로세스가 그 파일을 열어보는 방식입니다. 가장 직관적이지만 속도가 가장 느립니다.


스레드

스레드는 프로세스의 실행 가능한 가장 작은 단위입니다. 프로세는 여러 스레드를 가질 수 있습니다.

코드,데이터,스택,힙을 각각 생성하는 프로세스와 달리 스레드는 코드,데이터, 힙은 스레드 끼리 공유합니다. 그 외 영역은 각가 생성됩니다.


멀티스레딩

멀티스레딩은 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 깁버이며 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높습니다.

장점

  • 자원 효율성: 스레드끼리 메모리(코드, 데이터, 힙)를 공유하기 때문에 자원 소모가 적고 생성 속도가 빠릅니다.
  • 통신 비용 감소: 복잡한 IPC 없이 공유 메모리를 통해 스레드 간에 빠르게 데이터를 주고받을 수 있습니다.
  • 동시성/응답성: 여러 작업을 동시에 처리하여 사용자 응답성이 크게 향상됩니다.

단점

  • 안정성 문제:한 스레드에 문제가 새익면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있습니다.
  • 동기화 문제 (가장 중요!): 여러 스레드가 동시에 같은 공유 데이터(전역 변수 등)에 접근해 값을 수정하려고 하면 데이터가 꼬이는 병목현상(Deadlock)이나 경쟁 상태(Race Condition)가 발생할 수 있습니다.


멀티 스레딩 VS 멀티프로세싱

비교 기준멀티프로세싱멀티스레딩
개념독립된 프로세스를 여러 개 실행한 프로세스 내에서 여러 스레드를 실행
안정성매우 높음
(하나가 죽어도 다른 프로세스에 영향 없음)
낮음
(스레드 하나가 죽으면 프로세스 전체가 죽음)
자원 소모 (메모리)
(각자 독립된 메모리 공간을 할당받음)
작음
(프로세스의 자원을 공유함)
Context Switching무겁고 느림
(캐시 메모리까지 다 비워야 함)
가볍고 빠름
(공유하는 메모리는 그대로 둠)
통신 방식IPC 사용 (복잡하고 무거움)
(파이프, 소켓 등 OS의 도움 필요)
공유 메모리 사용 (쉽고 빠름)
(단, 데이터 꼬임을 막기 위한 동기화 필수)


This post is licensed under CC BY 4.0 by the author.