프로세스 vs 스레드

00·2025년 1월 8일

C#

목록 보기
135/149
post-thumbnail

OS는 여러 프로세스Process를 동시에 실행할 수 있습니다.
(예를 들어, 유튜브로 음악을 들으면서 Visual Studio로 코드를 작성할 수 있음)

프로세스Process도 여러 작업을 동시에 할 수 있습니다.
(예를 들어, 워드프로세서. 글을 쓰고 있을 때 문법 검사를 해서 틀린 부분은 빨간색으로 표시해줌)

프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받습니다.
기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있습니다.

각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없습니다.
즉, 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 합니다.( Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용)

프로세스Process

프로세스는 실행 중인 프로그램을 말합니다. 운영체제는 각 프로세스에 메모리 공간을 할당하고, 프로세스는 할당된 메모리 공간 내에서 실행됩니다. 각 프로세스는 독립적인 메모리 공간을 가지므로, 한 프로세스가 다른 프로세스의 메모리에 접근할 수 없습니다.
프로세스는 실행 파일이 실행되어 메모리에 적재된 인스턴스(독립개체)입니다.
(예를 들어, word.exe가 실행 파일이라면, 실행 파일에 들어 있는 데이터와 코드가 메모리에 적재되어 동작하는 것이 프로세스입니다.)

스레드Thread

프로세스는 반드시 하나 이상의 스레드Thread로 구성되는데, 스레드는 운영체제가 CPU 시간을 할당하는 기본 단위입니다.
즉, 스레드는 프로세스 내에서 실행되는 작업 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 각 스레드는 프로세스의 메모리 공간을 공유합니다. 따라서 스레드 간에는 데이터를 쉽게 공유할 수 있습니다.

스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유합니다.
스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행됩니다.

같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유합니다. 반면, 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없습니다.

각각의 스레드는 별도의 레지스터스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있습니다.

한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있습니다.


비유를 통해 설명하면, 프로세스는 아파트 건물과 같고, 스레드는 아파트 건물 내의 각 호실과 같습니다. 각 호실은 독립적인 공간을 가지지만, 같은 건물 내에 있으므로 복도, 엘리베이터 등을 공유합니다.

프로세스와 스레드의 차이점

특징프로세스스레드
메모리 공간독립적공유
자원 할당운영체제에서 할당프로세스에서 할당
생성 비용높음낮음
통신 방식IPC (Inter-Process Communication)공유 메모리

프로세스와 스레드의 관계

  • 하나의 프로세스는 하나 이상의 스레드를 가집니다.
  • 스레드는 프로세스 내에서 실행됩니다.
  • 스레드는 프로세스의 자원을 공유합니다.

멀티 스레드

  • 하나의 프로세스가 여러 개의 스레드를 사용하는 것을 다중 스레드라고 합니다.
  • 다중 스레드를 사용하면 여러 작업을 동시에 수행할 수 있어 프로그램의 성능을 향상시킬 수 있습니다.

멀티 스레드 장점

멀티 스레드는 하나의 프로그램에서 여러 작업을 동시에 수행할 수 있도록 하는 프로그래밍 기법입니다. 마치 여러 명의 요리사가 함께 요리하는 것처럼, 멀티 스레드를 사용하면 프로그램의 여러 부분을 동시에 실행하여 작업 속도를 높이고 효율성을 향상시킬 수 있습니다.

멀티 스레드의 주요 장점은 다음과 같습니다.

  • 향상된 응답성: 멀티 스레드를 사용하면 프로그램의 일부가 긴 작업을 수행하더라도 다른 부분은 계속해서 사용자 입력을 처리하거나 다른 작업을 수행할 수 있습니다. 예를 들어, 웹 브라우저에서 이미지를 로드하는 동안에도 사용자는 다른 웹 페이지를 탐색하거나 텍스트를 입력할 수 있습니다.
    사용자 대화형 프로그램(콘솔 프로그램과 GUI 프로그램 모두) 멀티 스레드를 이용하면 응답성을 높일 수 있습니다.
    (예를 들어, 단일 스레드를 사용하는 프로그램을 만들었고, 이 프로그램에서 파일 복사만 1시간이 넘게 걸릴 때, 사용자가 파일 복사를 취소하고 싶어도 프로그램은 사용자에게 반응하지 않아서 복사를 취소할 수 없게됩니다. 이러한 단일 스레드를 사용하는 프로그램에 사용자와의 대화를 위한 스레드를 하나 더 추가한다면 파일 복사를 하면서 사용자로부터 명령을 입력받을 수 있게 됩니다.)

  • 자원 공유: 스레드는 동일한 프로세스 내에서 메모리 공간과 시스템 자원을 공유합니다. 따라서 멀티 스레드는 멀티 프로세스에 비해 메모리 사용량이 적고, 스레드 간 통신 비용이 저렴합니다.
    멀티 프로세스는 GUI가 없는 웹 서버 처럼 서버용 애플리케이션에서 많이 취하는 구조로, 프로세스끼리 데이터를 교환하려면 소켓이나 공유 메모리 같은 IPC를 이용해야 합니다. 반면에, 멀티 스레드 방식은 그저 스레드끼리 코드 내 변수를 같이 사용하는 것만으로도 데이터를 교환할 수 있습니다.
    즉, 멀티 '스레드' 방식이 멀티 '프로세스' 방식에 비해 자원 공유가 쉽습니다.

  • 병렬 처리: 멀티 코어 프로세서를 사용하는 경우, 멀티 스레드를 사용하여 여러 작업을 동시에 다른 코어에서 실행할 수 있습니다. 이를 통해 프로그램의 성능을 향상시킬 수 있습니다.

  • 효율적인 작업 분할: 복잡한 작업을 여러 개의 작은 작업으로 나누어 각 스레드에 할당하여 효율적으로 처리할 수 있습니다.

멀티 스레드는 프로그램의 성능과 응답성을 향상시키는 데 유용한 기술이지만, 동기화 문제, 데드락, 경쟁 조건 등 주의해야 할 사항들이 있습니다. 멀티 스레드 프로그래밍을 할 때는 이러한 문제들을 고려하여 코드를 작성해야 합니다.

멀티 스레드 단점

멀티 스레드는 여러 작업을 동시에 처리하여 프로그램 성능을 향상시키는 강력한 기술이지만, 몇 가지 단점도 가지고 있습니다. 마치 여러 명이 함께 요리하는 것과 같아서, 협업이 잘 이루어지면 훨씬 빠르게 요리를 완성할 수 있지만, 서로 방해하거나 재료를 놓고 다투면 오히려 요리 시간이 더 오래 걸릴 수 있습니다.

멀티 스레드의 주요 단점

  1. 구현 복잡성 증가: 멀티 스레드 프로그래밍은 싱글 스레드 프로그래밍보다 복잡합니다. 여러 스레드가 동시에 실행되면서 발생할 수 있는 동기화 문제, 데드락, 경쟁 조건 등을 고려해야 하기 때문입니다.

  2. 디버깅 어려움: 멀티 스레드 프로그램은 디버깅하기 어려울 수 있습니다. 여러 스레드가 동시에 실행되면서 발생하는 문제는 재현하기 어렵고, 디버깅 도구를 사용해도 문제의 원인을 파악하기 쉽지 않을 수 있습니다.

  3. 과용시 성능 저하 발생: 스레드 생성 및 관리, 스레드 간의 작업 간 전환(Context Switching) 등으로 인해 오버헤드가 발생할 수 있습니다. 스레드의 개수가 많아질수록 오버헤드가 증가하여 성능 저하를 일으킬 수 있습니다. 왜냐하면 스레드가 CPU를 사용하기 위해서는 작업 간 전환(Context Switching)을 해야하는데, 이 작업 간 전환이 적지않은 비용을 소모합니다. 즉, 많은 스레드가 자주 작업 간 전환을 수행하면, 애플리케이션이 실제로 일하는 시간에 비해 작업 간 전환에 사용하는 시간이 커지기 때문에 성능이 저하됩니다.

  4. 자원 공유 문제: 여러 스레드가 공유 자원에 접근할 때 동기화 문제가 발생할 수 있습니다. 동기화 문제는 예상치 못한 결과를 초래하거나 프로그램 오류를 발생시킬 수 있습니다.

  5. 플랫폼 의존성: 멀티 스레드 프로그래밍은 운영체제나 하드웨어에 따라 다르게 동작할 수 있습니다. 따라서 플랫폼 간의 이식성을 고려해야 합니다.

멀티 스레드 사용 시 고려 사항

  • 멀티 스레드 프로그래밍은 복잡하고 어려울 수 있으므로, 신중하게 설계하고 구현해야 합니다.
  • 스레드 간의 동기화 문제를 방지하기 위해 적절한 동기화 메커니즘을 사용해야 합니다.
  • 데드락을 방지하기 위해 스레드 간의 자원 접근 순서를 고려해야 합니다.
  • 스레드의 개수를 적절히 조절하여 오버헤드를 최소화해야 합니다.

멀티 스레드 vs 멀티 프로세스

멀티 스레드와 멀티 프로세스는 모두 여러 작업을 동시에 수행하는 방법이지만, 몇 가지 중요한 차이점이 있습니다.

멀티 스레드는 하나의 프로세스 내에서 여러 개의 스레드를 생성하여 각 스레드가 독립적으로 작업을 수행하는 방식입니다. 스레드는 프로세스 내에서 실행되는 코드 단위이며, 각 스레드는 자신만의 스택과 레지스터를 가지고 있습니다. 하지만 모든 스레드는 프로세스의 코드, 데이터, 힙 영역을 공유합니다.

멀티 프로세스는 여러 개의 프로세스를 생성하여 각 프로세스가 독립적으로 작업을 수행하는 방식입니다. 프로세스는 운영체제에서 실행되는 프로그램의 인스턴스이며, 각 프로세스는 자신만의 메모리 공간을 가지고 있습니다. 따라서 프로세스 간에는 데이터를 공유하지 않습니다.

멀티 스레드와 멀티 프로세스의 비교

특징멀티 스레드멀티 프로세스
메모리 공간공유독립적
자원 사용적음많음
생성 비용낮음높음
통신쉽고 빠름복잡하고 느림
안정성낮음높음
확장성제한적높음

멀티 스레드의 장점

  • 자원 사용량이 적습니다.
  • 생성 비용이 낮습니다.
  • 스레드 간 통신이 쉽고 빠릅니다.

멀티 스레드의 단점

  • 안정성이 낮습니다. 하나의 스레드에서 오류가 발생하면 전체 프로세스가 종료될 수 있습니다.
  • 확장성이 제한적입니다. 하나의 프로세스에서 사용할 수 있는 CPU 코어 수는 제한되어 있습니다.

멀티 프로세스의 장점

  • 안정성이 높습니다. 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 미치지 않습니다.
  • 확장성이 높습니다. 여러 개의 CPU 코어를 사용하여 병렬 처리 성능을 높일 수 있습니다.

멀티 프로세스의 단점

  • 자원 사용량이 많습니다.
  • 생성 비용이 높습니다.
  • 프로세스 간 통신이 복잡하고 느립니다.

어떤 방식을 사용할까?

멀티 스레드와 멀티 프로세스 중 어떤 방식을 사용할지는 애플리케이션의 특징과 요구 사항에 따라 결정해야 합니다.

  • 자원 사용량이 적고 스레드 간 통신이 중요한 경우에는 멀티 스레드를 사용합니다.
  • 안정성이 중요하고 여러 개의 CPU 코어를 사용하여 병렬 처리 성능을 높여야 하는 경우에는 멀티 프로세스를 사용합니다.

결론

  • '멀티 스레드'는 스레드 동기화 문제를 고려해야 합니다.
  • '멀티 프로세스'는 프로세스 간 통신 방법을 고려해야 합니다.

참조

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

0개의 댓글