물흐르듯코딩

[OS] 프로세스 vs 스레드 - 멀티 프로세스와 멀티 스레드 장단점 본문

OS

[OS] 프로세스 vs 스레드 - 멀티 프로세스와 멀티 스레드 장단점

AquaDev 2024. 5. 28. 17:54

 

 

 

Q. 프로세스와 스레드의 차이가 무엇인가요?


기술면접 단골 질문인 프로세스와 스레드에 대해 알아보고자 한다.

이 포스팅을 통해 프로세스와 스레드의 개념,
각 구조로 인한 멀티 프로세스/스레드의 장단점까지 챙겨가보자
🤓




 

프로세스와 스레드

프로세스 스레드
- 운영체제로부터 자원을 할당받은 작업의 단위
- 메모리에 적재되고 CPU 자원을 할당 받아 실행되는 상태
-
프로그램이 돌아가고 있는 동적인 상태
- 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
- 하나의 프로세스 내에서 동시에 진행되는 흐름의 단위

 

 

프로세스의 한계와 스레드

 

우리는 웹 브라우저를 실행하여 파일을 다운 받으며 온라인 쇼핑을 하고, 웹 서핑을 한다.

이처럼 웹 브라우저 실행이라는 프로세스 하나가 생성되면 여러가지 일을 동시 수행할 수 있게 해 주는 것이 스레드이다.

 

하나의 프로세스만을 사용하면 멀티 작업이 불가하다. 여러 개의 프로세스를 사용하면 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복될 수 있다. 따라서 이러한 프로세스의 한계를 해결하기 위한 것이 스레드이다.

스레드가 여러개 있다면 멀티(다중) 스레드라고 한다.

 

 


프로세스의 자원 구조

 

기본적으로 하나의 프로세스는 하나의 main 스레드를 갖는다.

프로세스 간, 스레드 간의 자원 공유를 알아보기 위해 프로세스의 자원 구조를 먼저 살펴보자.

 

 

코드 영역(Code/Text)

  • 프로그래머가 작성한 코드가 CPU에서 수행할 수 있는 기계어 형태로 저장되어 있다.

데이터 영역(Data)

  • 코드가 실행되면서 사용하는 전역 변수나 각종 데이터가 모여있다.

스택 영역(Stack)

  • 지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다.
  • 후입선출 구조이며, 재귀 함수가 과다하게 호출되거나 함수가 지역변수를 메모리가 초과할 정도로 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.

힙 영역(Heap)

  • 생성자, 인스턴스와 같은 동적으로 할당되는 데이터가 저장되어 있다.
  • 메모리 공간이 동적으로 할당되고 해제된다.

 

코드, 데이터 영역은 선언할 때 그 크기가 결정되는 정적 영역이지만

스택, 힙 영역은 프로세스가 실행되는 동안 크기가 변하는 동적 영역이기 때문에 

스택영역과 힙영역 사이에 화살표로 표시되어 있다.

 

프로세스의 자원공유

 

기본적으로 각 프로세스는 메모리에 별도의 주소 공간에서 실행되기 때문에 프로세스 간 변수나 자료 구조 접근이 불가하다.

프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, LPC 등)을 통해 접근해야 한다.

 

프로세스 간 자원공유는 자원 부담이 크다는 단점이 있기 때문에 다중 작업이 필요한 경우 스레드를 이용하는 것이 효율적이다.

 

 

스레드의 자원 공유

 

스레드는 프로세스 실행 흐름의 일부이기 때문에 스레드 간 프로세스의 자원을 공유할 수 있다. 

 

stack은 함수 호출 시 전달되는 인자, 되돌아갈 주소 값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문에 독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다는 것이고, 즉 독립적인 실행 흐름이 가능하다는 것이다.

따라서 스레드는 독립적인 실행 흐름이 가능한 것이다.

 

 


CPU 작업 처리 방식

우리는 컴퓨터를 이용할 때 주어진 코어와 쓰레드 이상으로 프로그램을 돌린다. 수많은 프로세스들을 어떻게 처리하고 있을까? 이해를 위해 병렬성동시성에 대해 알아보자

 

동시성(Concurrency) 병렬성(Parallelism)
여러 작업이 동시에 실행되고 있는 것처럼 구현되는 것 여러 작업이 실제로 동시에 실행되고 있는 것
싱글 코어 환경에서 단일 프로세스 내에 멀티 스레드 멀티 코어 환경에서 멀티 프로세스(단일 스레드) 또는 멀티 스레드
빠른 시간에 하나씩 처리 한 번에 많은 것을 처리
물리적인 부분 논리적인 부분

 

동시성으로 구현되면 여러 개의 작업을 아주 잘게 나누어 아주 조금씩만 작업을 수행하고 다른 작업으로 넘어가는 것을 반복하며, 동시에 진행되는 것처럼 보이게 하는데 이렇게 진행 중인 작업을 번갈아가며 바꾸는 것을 Context Switching이라고 한다.

 

 

💡 동시성이 왜 필요할까?

병렬성은 실제로 동시에 처리되기 때문에 작업 처리 시간이 빠르지만, 동시성은 동시에 처리되는 것처럼 보일 뿐 여러 작업을 번갈아가며 처리하기 때문에 작업 처리 시간은 결국 동일할텐데 왜 동시성이 필요한 걸까?

 

첫 번째는 하드웨어적 한계 때문이다. 병렬성으로 처리하기 위해선 여러 개의 CPU가 탑재되어야 하는데 성능을 위해 수백 개의 CPU를 탑재할 순 없으니 하드웨어적 한계가 생긴다. 결국 수백개의 프로세스를 돌리기 위해 동시성이 필요하다.

 

두 번째는 논리적인 효율 때문이다. 만약 10개의 작업을 수행해야 하는데 그중 5개는 오래 걸리고, 5개는 빠르게 처리할 수 있는 작업이라고 가정하자. 동시에 5개의 작업을 처리할 수 있는데 상대적으로 오래 걸리는 5개의 작업이 우선적으로 처리된다면, 빠르게 처리할 수 있는 5개의 작업은 오랜 시간 기다려야 하는 상황이 발생한다. 

이러한 비효율적인 면을 극복하기 위해 작업을 잘게 나눠 번갈아가며 처리할 수 있는 동시성이 필요하다. 

 

 

컨텍스트 스위칭(Context Switching)

 

CPU가 어떤 프로세스를 실행하고 있는 상태에서 더 높은 우선순위를 가진 프로세스가 실행되어야 할 때, 스케줄러가 기존 프로세스 상태값을 저장하고 새로운 프로세스를 실행하며 진행 중인 프로세스를 교체하는 작업이다.

 

컨텍스트 스위칭이 일어나는 동안 이전 실행 중이었던 프로세스의 정보를 저장하고, 새로운 프로세스를 가져오는 시간이 필요하다. 그것을 오버헤드(over head)라고 하며, 그 과정에서 CPU에 빈 시간이 생기게 된다. 

이처럼 컨텍스트 스위칭이 잦으면 오버헤드가 발생하여 성능 저하로 이어질 수 있다는 단점이 있다.

 

 

컨텍스트 스위칭은 프로세스와 스레드 단위 모두 가능하다. 프로세스 간 컨텍스트 스위칭보다 스레드 컨텍스트 스위칭이 더 빠르다. 프로세스는 공유하는 데이터가 없으므로 캐시 메모리가 처음부터 데이터를 쌓아야 하지만, 스레드는 공유하는 자원이 비교적 많아 stack 및 간단한 정보만 저장해도 되기 때문이다.

 

 


멀티 프로세스

 

멀티 프로세스는 여러 개의 프로세스를 실행할 수 있게 하는 기술을 의미한다. 서로 다른 프로세스로 독립적으로 실행되고, 독립적인 메모리 공간을 가지고 있어 서로 다른 작업을 수행한다. 대표적인 예시로는 크롬 브라우저에서 여러 개의 상단 탭으로 작업하는 것이다. 같은 브라우저지만 탭마다 다른 사이트에 접속할 수 있다.

 

  • 멀티 프로세스 장점
    1. 프로그램 안전성
    : 하나의 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향을 주지 않는다. 크롬 브라우저에서 여러 개의 상단 탭 중 하나의 탭에서 장애가 발생해 종료되어도 다른 탭은 정상 동작한다.

    2. 시스템 확장성
    : 각 프로세스가 독립적이므로 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향을 주지 않는다. 따라서 시스템 확장에 용이하다.

 

  • 멀티 프로세스 단점
    1. 컨텍스트 스위칭 오버헤드
    : CPU가 실행 중이었던 프로세스의 정보를 저장하고 새로운 프로세스의 데이터를 불러오는 과정에서 빈번한 컨텍스트 스위칭 작업으로 인해 오버헤드가 발생한다.


    2. 자원 공유 비효율성
    : 멀티 프로세스는 독립적인 메모리 공간을 가지므로 메모리 사용량이 증가되고, 자원 공유 필요시 자원부담이 크다.

 

 

멀티 스레드

 

멀티 스레드는 하나의 프로세스 안에 여러 개의 스레드가 있는 것을 의미한다. 대표적인 예시로는 사용자가 서버 데이터베이스에 자료를 요청하는 동안 브라우저의 다른 기능을 이용하는 것이다. 웹 브라우저의 단일 탭에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하는 것이다. 

 

  • 멀티 스레드의 장점
    1. 프로세스에 비해 가벼움
    : 코드, 데이터, 힙 영역을 서로 공유하기 때문에 기본적으로 내장되어 있는 데이터가 프로세스보다 작다. 프로세스의 내부 자원만을 관리하면 되기 때문에 비교적 가볍다.

    2. 자원의 효율성
    : 공유 메모리에 대해 스레드 간에 자원 공유가 가능하다. 프로세스 간 자원 공유는 IPC, LPC 등 자원부담이 많지만 스레드는 공유되고 있기 때문에 자원 소모가 줄어든다.

    3. 컨텍스트 스위칭 비용 감소
    : 공유되는 자원 영역이 많기 때문에 프로세스 컨텍스트 스위칭에 비해 오버헤드가 훨씬 낮다.

  • 멀티 스레드의 단점
    1. 안정성 문제
    : 멀티 프로세스는 독립적으로 동작하므로 하나의 프로세스에서 비정상적으로 종료되어도 다른 프로세스는 영향을 받지 않았지만, 멀티 스레드에선 스레드 하나가 비정상적으로 종료되면 모든 스레드가 영향을 받아 종료될 수 있다.

    2. 동기화로 인한 성능 저하
    : 멀티 스레드는 여러 스레드가 공유 자원에 동시에 접근할 수 있다. 동시에 접근해 특정 변수에 다른 값이 업데이트되면 문제가 발생할 수 있다. 따라서 스레드 간 동기화는 데이터 접근을 제어하기 위해 필수적이다.
    동기화 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하될 수 있다.


    3. 데드락(교착 상태)
    : 데드락은 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 교착상태를 의미한다. 여러 개의 스레드가 무한 대기하는 것이다. 
    스레드의 특징인 공유 자원에 대한 동시 접근 문제로, 이를 방지하기 위해 상호배제, 점유와 대기, 비선점, 순환 대기 등의 알고리즘으로 해결할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

[참고 자료]

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

https://shuu.tistory.com/80

https://somaz.tistory.com/265

https://sas-study.tistory.com/446

https://beststar-1.tistory.com/26

https://shout-to-my-mae.tistory.com/399

https://d2.naver.com/helloworld/2922312