[운영체제] 멀티프로세스? 멀티스레드? 차이를 알아보자

728x90

혼자 공부하는 컴퓨터 구조+운영체제 

스레드 부분을 공부하면서 정리한 내용을 포스팅 해보겠습니다. 


🖐 스레드란?

 

=>  프로세스를 구성하는 실행 흐름의 단위

 

🖐 멀티 스레드란?

 

=>  한 프로세스안에서 한개 이상의 스레드를 가지는 것 

 

 

우리는 평소에도 여러 프로세스를 알게 모르게 사용하고 있습니다.

 

1️⃣ 백그라운드 프로세스

2️⃣ 포그라운드 프로세스

 

그 중에서도 우리가 자주 사용하는 프로세스라고 함은 포그라운 프로세스에서

대표적으로 웹 브라우저(크롬,엣지)를 예시로 들 수 있습니다.

 

-> 그리고 웹 브라우저라는 프로세스 안에는 ( 화면 출력 스레드, 입력 스레드, 검색 스레드 등등 여러가지 스레드가 있습니다)

 

 💡 프로세스가 존재해야 스레드가 존재한다 → 즉 스레드는 프로세스 실행 단위 이다.

 

 

프로세스를 확인하는 방법은 windows운영체제 기준 작업관리자를 들어가서 확인할수 있습니다.

 

위 사진들이 프로세스를 나열한 사진 입니다. 

아주아주 많은 프로레스들이 실행되고 있죠. 

 

❓ 그럼 이 많은 프로세스들은 어떻게 실행이 되는건지 궁금 했습니다 저는..

 

 

여기 프로세스에는 내가 실행중인 프로그램이 아닌, 다양한 프로그램에 대한 프로세스 또한 있을 거닌까요.

 

간단하게 설명을 하자면은

 

1) 프로그램 로딩 

프로세스가 On -> 프로세스 메모리 구조(스택,힙,데이터,코드)영역이 생성이 됨

 

2) 프로세스 생성 

OS가 프로세스를 생성하는데, 보통 부모 프로세스가 자식 프로세스를 생성하는 계층형으로 이루어집니다. 부모 프로세스는 자식 프로세스에게 자원(메모리, 파일 디스크립터 등)을 할당하고 초기화합니다.

 

3) 프로세스 메모리 구조

각 프로세스는 자체의 가상 주소를 갖습니다. 이 가상 주소는 정적영역(코드,데이터), 동적(힙,스택) 으로 나뉜다.

 

4) 프로세스 실행

운영체제는 프로세스의 코드가 있는 메모리 주소로 제어를 전달하면서 프로세스가 실행됩니다. CPU는 프로세스의 명령어를 하나씩 가져와 실행하며, 프로세스는 해당 명령어에 따라 작동합니다.

 

5) 프로세스 종료 

프로세스는 종료 상태에 도달하면 운영체제에 의해 종료됩니다. 종료되면 할당된 자원이 해제되고, 운영체제에게 사용한 자원에 대한 정보가 반환됩니다.

 

프로세스는 이렇게 생성, 실행, 종료되며, 여러 프로세스가 동시에 실행될 때 운영체제는 CPU를 시분할하여 각 프로세스에게 일정 시간을 할당하여 실행합니다. 이렇게 함으로써 여러 프로세스가 동시에 실행되는 것처럼 보이게 됩니다.

 

다시 스레드 이야기로 가보겠습니다.

 

단일 스레드 (프로세스)

 

→ 실행 흐름 단위가 하나인 프로세스

→ 한 번에 한가지 일만 할 수 있다.

 

멀티 스레드 (프로세스)

 

→ 실행 흐름이 여러개인 프로세스

→ 한 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다.

→ 즉 프로세스를 이루는 여러 명령어 동시 실행 가능

 

여기서 몇 가지를 더 알아야 할 내용이 있습니다. 

 

 

💡 중요 

요즘 OS는 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다.

 

 

💡 중요

대부분 OS가 프로세스와 스레드를 구분하지만, 리눅스에서는 프로세스와 스레드 모두 실행의 문맥이라고 간주하여 이 둘을 구분 짓지 않는다. 리눅스 에서는 (프로세스+스레드)태스크 라고 부르기도 한다

 

 

스레드의 구성 요소

  • 스레드ID , 프로그램 카운터를 비롟한 레지스터 값, 스택 등
  • 실행에 필요한 최소한의 정보

 

기본적인 스레드의 구성요소 입니다. 

 

스레드의 기본 특징은 '프로세스의 자원공유하면서 실행이 된다' 입니다.

가장 기본적인 내용이면서도 중요한 이야기니 꼭 기억을 해야 합니다. 

 

(나중에 연차가 쌓이고, 성능 향상 프로그래밍을 하다보면 이 내용이 이해가 갈 것입니다)

-> 스레드는 CPU 코어를 공유하기 때문에 컨텍스트 스위칭 비용이 들기 때문에 너무 많으면 성능 저하..

 

 

이제 본론에 대한 내용을 이야기 해보도록 하겠습니다. 

 

 

🔔 멀티 프로세스와 멀티 스레드

동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 (멀티 프로세스)

                                                        vs

하나의 프로세스를 여러 스레드로 실행 어떤 차이가 있을까? (멀티 스레드)

 

 

❓여러 프로세스를 실행하는 것 과 여러 스레드로 실행하는 것은 뭐가 다를까 ❓

 

이 질문에 답변하기 위해서는 기본적으로 알아 될 내용이 있습니다

 

[프로세스 = 집 _ 스레드=방] 

1️⃣ 프로세스 끼리는 자원을 공유하지 않는다.

ex) 다른 집 한테 우리 집 정보를 공유 하지 않는다

 

 

2️⃣ 스레드 끼리는 같은 프로세스 내의 자원을 공유한다

ex) 스레드==방, 한 집에 여러 방이 있고, 사람들 끼리 방을 공유한다

 

 

 

즉 이해하기 쉽게 한번 더 멀티 프로세스 와 멀티스레드 설명하자면

 

[공장장=os, 인형 눈 붙이기 = 프로그램 실행, 직원 집 => 프로세스, 전등 = 메모리]

 

0) 공장장이 인형 눈을 붙이는 작업을 직원에게 지시 => 운영체제에서 프로그램 실행

1) 직원들이 각자 집에서 전등을 켜두고 작업을 한다 => 멀티 프로세스 실행

2) 같은 작업을 각자 집에서 하니 현황 공유X , 전등에 의한 전기도 낭비 => 메모리 낭비

=> 이게 바로 멀티 프로세스 입니다.   

 

 

[공장장=os, 인형 눈 붙이기 = 프로그램 실행, 직원 집 => 프로세스, 직원 집에 방 = 스레드, 전등 = 메모리]

 

0) 공장장이 인형 눈을 붙이는 작업을 직원에게 지시 => 운영체제에서 프로그램 실행

1) 직원들을 모아 한명의 직원 집에서 전등을 켜두고 작업을 한다 =>  한개의 프로세스안에서 멀티 스레드 실행

2) 같은 집에서 작업을 하니 현황 공유O , 전등에 의한 전기도 낭비 줄어둠 => 메모리 절약

 

어떤가요 멀티 프로세스와 멀티 스레드에 대하여 이해가 잘되었나요??

 


 

 

일상속의 예시 말고, 컴퓨터 구조적 관점에서 다양한 이야기를 한번 해 보겠습니다.

 

#1

프로세스를 fork 하여 자식 프로세스를 생성하여 동시에 실행하면

코드,데이터,스택,힙 영역에 부모 프로세스 자원이 복제되어 메모리에 적재된다.

즉, PID 저장된 메모리 주소 제외하고는 동일한 프로세스가 메모리에 적재된다

 

→ 메모리 낭비를 초래한다. (중복된 프로세스가 많기 때문)

→ 단일 스레드에 프로세스 여러개는, 메모리 낭비가 엄청 된다.

→ 이러한 이유 때문에 단일 프로세스에 멀티 스레드를 사용해야 한다.

 

 

 

#2 

스레드들은 각자의 PID를 가지고 있고, 자원을 공유한다.

즉 같은 프로세스 내의 모든 스레드는 아래 그림처럼 동일한 주소 공간의 코드,데이터,힙 영역을 공유하고 같은 프로세스 자원을 공유한다.

 

여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다.

프로세스는 자원을 공유하지 않아, 독립적으로 실행이 되어 성능이 느린 반면에,

스레드는 프로세스의 자원을 공유하기 때문에 협력과 통신에 유리하며 성능이 빠르다.

 

 

#2-1) 단점

  • 멀티 프로세스 환경에서는 하나의 프로세스가 문제 생기면, 다른 프로세스에는 지장이 없지만, 멀티 스레드 환경에서 하나의 스레드가 문제가 생기면 프로세스 전체에 문제를 야기할 수 있다.

 

여기서 질문 🖐 하나의 스레드가 문제 생기면 왜 프로세스 전체가 문제가 생길까?

모든 스레드는 프로세스의 자원을 공유하기 때문에, 공유 받는 자원이 장애가 생기면 공유 받는 모든 스레드들이 같이 영향을 받기 때문입니다.

스레드 장애 이미지

 

 

#3

하지만 멀티스레드무조건 좋은건 아니다.

 

비교적 멀티프로세스보다 성능이 좋은건 맞지만, 멀티 스레드 또한 고려해야할 점이 있다.

멀티스레드는 동기화 및 경쟁 조건과 같은 복잡한 문제를 발생시킬 수 있으며, 스레드 간의 안정성을 유지하기 위해 추가적인 관리가 필요합니다. 따라서 어떤 상황에서는 멀티프로세스가 적절하고, 어떤 상황에서는 멀티스레딩이 적절하다는 것을 고려해야 함

 

 

#4 💡 그럼 프로세스 끼리는 절대로 자원을 공유받지 못하나요?

→ 아니다. 프로세스 끼리도 자원을 공유받을 수 있다.

→ 프로세스간 통신 IPC 를 사용하면 가능하다

→ 스레드에 비하면 제약 조건도 있고, 까다로울 뿐이지 불가능하지는 않다.

→ 그래서 비교적 쉬운 멀티스레드를 많이 사용한다.

 

 

 

 💡 요약 정리

  1. 스레드는 프로세스 내의 실행 흐름 단위이다
  2. 여러 프로세스를 동시에 실행하는 것 멀티 프로세스
  3. 여러 스레드로 프로세스를 동시에 실행하는 것 멀티 스레드
  4. 프로세스 내의 스레드는 같은 코드,데이터,힙, 파일 영역을 가짐
  5. 프로세스 내의 스레드는 각기 다른 스택, 프로그램 카운터, 레지스터를 가짐
  6. 프로세스 는 자원을 공유하지 않는다
  7. 스레드는 자원을 공유한다.

 

 

잘못된 내용에 대한 지적은 항상 환영합니다. 읽어주셔서 감사합니다.

이상 포스팅 마치겠습니다.

 

Ref : 혼자공부하는 컴퓨터 구조 + 운영체제 _저자:강민철
728x90