📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

운영체제의 핵심 개념: 프로그램, 프로세스, 스레드 본문

CS

운영체제의 핵심 개념: 프로그램, 프로세스, 스레드

seung_ho_choi.s 2025. 5. 13. 23:38
728x90

☑️ 프로그램(Program)이란?

프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말합니다.

✔️ 프로그램의 특징

  • 메모리에 올라가 있지 않은 상태: 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻입니다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있습니다.
  • 정적인 상태: 정적(靜的)이라는 단어 그대로, 움직이지 않는 상태라는 뜻입니다. 한 마디로 아직 실행되지 않고 가만히 있다는 뜻입니다.

✔️ 결론

프로그램이라는 단어는 아직 실행되지 않은 파일 그 자체를 가리키는 말입니다. 윈도우의 *.exe 파일이나 MacOS의 *.dmg 파일 등 사용자가 눌러서 실행하기 전의 파일을 말합니다. 쉽게 말해서 그냥 코드 덩어리입니다.

☑️ 프로세스(Process)란?

https://gmlwjd9405.github.io/images/os-process-and-thread/process.png

 

실행 파일(프로그램)에게 의미를 부여하기 위해 프로그램을 실행하면, 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적(動的)인 상태라고 하며 이 상태의 프로그램을 프로세스라고 합니다.

✔️ 프로세스의 정의

  • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램입니다.
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스입니다.
  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위입니다.

✔️ 프로세스의 특징

  • 프로세스는 각각 독립된 메모리 영역을 할당받습니다.
  • 기본적으로 프로세스당 최소 1개의 스레드를 가지고 있습니다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없습니다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC)을 사용해야 합니다.

☑️ 스레드(Thread)란?

https://gmlwjd9405.github.io/images/os-process-and-thread/thread.png

 

과거에는 프로그램을 실행할 때 실행 시작부터 실행 끝까지 프로세스 하나만을 사용해서 진행했습니다. 하지만 시간이 흐를수록 프로그램이 복잡해지고 프로세스 하나만을 사용해서 프로그램을 실행하기는 벅차게 되었습니다.

✔️ 스레드의 필요성

프로세스는 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약이 있어, 한 프로그램을 처리하기 위해 여러 프로세스를 사용하는 것은 어렵습니다. 따라서 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고, 이 개념이 바로 스레드입니다.

✔️ 스레드의 정의

  • 프로세스 내에서 실행되는 여러 흐름의 단위입니다.
  • 프로세스의 특정한 수행 경로입니다.
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다.

✔️ 스레드의 특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유합니다.
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 스레드끼리 공유하면서 실행됩니다.
  • 같은 프로세스 안에 있는 여러 스레드는 같은 힙 공간을 공유합니다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없습니다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있습니다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있습니다.

☑️ 자바 스레드란?

✔️ 자바 스레드의 특징

  • 일반 스레드와 거의 차이가 없으며 JVM이 운영체제의 역할을 합니다.
  • 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록입니다.
  • 자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어집니다.

✔️ JVM이 관리하는 스레드 정보

  • 스레드가 몇 개 존재하는지
  • 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지
  • 스레드의 상태는 무엇인지
  • 스레드 우선순위는 얼마인지

개발자는 자바 스레드로 작동할 스레드 코드를 작성하고 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일만 합니다.

☑️ 멀티 프로세스와 멀티 스레드

✔️ 멀티 프로세스

멀티 프로세싱이란 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것입니다.

✔️ ✔️ 장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않습니다.

✔️ ✔️ 단점

  • Context Switching에서의 오버헤드
    • Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생합니다.
    • 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching이 발생하면 캐시에 있는 모든 데이터를 모두 리셋하고 다시 캐시 정보를 불러와야 합니다.
  • 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
    • 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없습니다.
  • 예시
🎯 상황 설정: “집중해서 일하는 너”
네가 어떤 카페에서 한 과목 과제를 집중해서 하고 있어. 그런데…

☕ 컨텍스트 스위칭은 이런 상황이야:
갑자기 누가 와서 “이거 잠깐만 도와줄 수 있어?” 하고 다른 일 시킴

그거 도와주고 다시 앉았는데, 아까 무슨 문제 풀고 있었는지 기억 안 남

자료 다시 찾고, 집중 다시 잡느라 시간 낭비

👉 이게 바로 컨텍스트 스위칭의 오버헤드야.
작업 바꾸는 데도 시간 들고, 다시 원래 작업으로 돌아가는 데도 또 시간 들지.

🔁 그게 반복되면?
10분 동안 과제를 집중하면 효율 좋은데

1분마다 친구들이 와서 부탁하면 결국 실제 과제 시간은 거의 없음

→ 프로세스가 너무 자주 바뀌면 CPU도 실제 일을 못 하고 갈아끼우는 데만 시간 씀

✅ 그래서 왜 문제가 되냐면?
스레드나 프로세스가 너무 많으면 자주 바뀌어서 효율 ↓

특히 실시간 응답이 중요한 서비스(예: 게임, 영상 스트리밍)는 한 번의 지연도 민감해

 

 


현실 상황 컴퓨터에서의 상황
너가 과제하다가 계속 끊김 CPU가 한 작업 하다가 다른 작업으로 계속 바뀜
과제 자료 다시 찾고 집중해야 함 레지스터/캐시 다시 로딩해야 함
집중력 분산 → 시간 낭비 컨텍스트 스위칭 오버헤드 발생
 

 

 

참고: Context Switching이란? 한 Task가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행해서 동시에 처리될 수 있도록 하는 방법입니다.

✔️ 멀티 스레드

멀티 스레딩이란 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것입니다.

✔️ ✔️ 특징

  • 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있습니다.
  • 웹 서버는 대표적인 멀티 스레드 응용 프로그램입니다.

✔️ ✔️ 장점

  • 시스템 자원 소모 감소 (자원의 효율성 증대)
    • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있습니다.
  • 시스템 처리량 증가 (처리 비용 감소)
    • 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 됩니다.
    • 스레드 사이의 작업량이 작아 Context Switching이 빠릅니다.
  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
    • 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적습니다.

✔️ ✔️ 단점

  • 주의 깊은 설계가 필요합니다.
  • 디버깅이 까다롭습니다.
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵습니다.
  • 다른 프로세스에서 스레드를 제어할 수 없습니다. (즉, 프로세스 밖에서 스레드 각각을 제어할 수 없습니다.)
  • 멀티 스레드의 경우 자원 공유의 문제가 발생합니다. (동기화 문제)
  • 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받습니다.

☑️ 교착상태(Deadlock)란?

✔️ 발생원인

  • 상호 배제(Mutual Exclusion): 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 합니다.
  • 점유 대기(Hold and Wait): 할당된 자원을 가진 상태에서 다른 자원을 기다립니다.
  • 비선점(No Preemption): 다른 프로세스가 자원의 사용을 끝낼 때까지 자원을 뺏을 수 없습니다.
  • 순환대기(Circular Wait): 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있습니다.

✔️ 해결방법

  • 예방: 4가지 조건 중 하나라도 만족되지 않도록 합니다.
  • 회피: 알고리즘을 데드락이 발생하지 않도록 합니다.
  • 회복: 교착상태가 발생할 때, 해결합니다.
  • 무시: 회복과정의 성능저하가 심하다면 그냥 무시합니다.

 

☑️ 프로세스, 프로그램, 스레드, 멀티프로세스, 멀티스레드를 회사 사무실에 비유


1. 프로그램 = 회사 업무 메뉴얼 📘

  • "보고서 작성하기", "회의 준비하기" 같은 업무 지침서
  • 아직 아무도 시작 안 함
    = 하드디스크에 저장된 프로그램

2. 프로세스 = 직원을 한 명 뽑아서 실제 업무 시키기 👨‍💻

  • 지침서를 보고 한 직원이 보고서를 작성하기 시작
  • 책상, 컴퓨터, 문서함(메모리 공간)까지 배정받음
    = 실행 중인 하나의 프로그램 (독립적 작업 공간 포함)

3. 스레드 = 그 직원이 동시에 하는 여러 작업들 🧠

  • 한 손으론 키보드로 타이핑하면서,
  • 다른 손으론 전화 받고,
  • 눈으론 회의 시간 확인함
    = 같은 프로세스 안에서 병렬로 수행되는 작업 단위

4. 멀티프로세스 = 여러 직원이 같은 업무를 따로따로 수행 👥👥👥

  • 보고서를 여러 명이 각각 따로 작성함
  • 서로 다른 책상, 다른 문서함, 다른 컴퓨터 사용
    = 서로 영향을 안 줘서 안전함, 하지만 중간 중간 조율이 필요

5. 멀티스레드 = 한 직원이 여러 역할 동시에 수행 🧍‍♂️+💻📞📄

  • 한 명이 메일도 쓰고, 회의도 준비하고, 계산도 함
  • 하나의 공간에서 모든 작업이 공유됨 (하나의 문서함, 하나의 컴퓨터)
    = 빠르지만, 한 작업에 문제가 생기면 전체 업무에도 영향 줄 수 있음

✅ 정리표


개념 사무실 비유 특징
프로그램 업무 메뉴얼 실행 전 지침
프로세스 직원 1명 독립된 작업 환경
스레드 직원의 행동들 한 작업 안의 병렬 처리 단위
멀티프로세스 직원 여러 명 서로 다른 공간, 안전하지만 협업은 번거로움
멀티스레드 직원 한 명이 여러 일 빠르지만 한 명이 탈진하면 전체 문제 가능

 

https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

프로세스와 스레드의 차이

프로세스와 스레드의 차이는 프로세스와 스레드, 그리고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 확인하기 위해 기술면접에서 단골 질문 사항으로 나온다.

velog.io

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

728x90

'CS' 카테고리의 다른 글

Docker에 관해  (0) 2025.05.09
Spring vs Spring Boot  (0) 2025.05.07
자바의 실행 환경  (1) 2025.05.06
쿠키 VS 세션  (1) 2025.05.04
로드밸런싱(Load Balancing)의 모든 것  (0) 2025.04.27