프로세스(Process) 와 쓰레드(Thread) 의 차이점

2024/09/16 Process Thread 총 2324 자,약 7 문장

프로세스(Process)쓰레드(Thread)는 동시에 여러 작업을 수행하기 위한 두 가지 중요한 개념입니다. 오늘은 그 차이점을 알아보고, Perl을 이용한 간단한 테스트 예제를 통해 이들을 비교해보겠습니다.


프로세스 (Process)

프로세스는 실행 중인 프로그램의 인스턴스를 의미합니다. 각 프로세스는 독립적인 메모리 공간을 가지며, 자원을 할당받아 독립적으로 실행됩니다. 프로세스 간에는 메모리를 공유하지 않기 때문에, 한 프로세스의 오류가 다른 프로세스에 영향을 미치지 않습니다.

:bulb: NOTE: 프로세스의 특징
독립적인 메모리 공간: 각 프로세스는 자신만의 메모리 공간을 가집니다.
자원 분리: 프로세스 간에 자원이나 데이터가 공유되지 않습니다.
안전성: 한 프로세스의 오류가 다른 프로세스에 영향을 미치지 않습니다.


쓰레드 (Thread)

쓰레드는 프로세스 내에서 실행되는 실행 단위입니다. 같은 프로세스 내의 쓰레드는 메모리와 자원을 공유하며, 이는 쓰레드 간의 상호작용을 더 빠르고 효율적으로 만들지만 동기화 문제를 일으킬 수 있습니다.

:bulb: NOTE: 쓰레드의 특징
공유된 메모리 공간: 같은 프로세스 내의 쓰레드는 메모리를 공유합니다.
자원 공유: 쓰레드 간에 자원이나 데이터가 공유됩니다.
경량성: 쓰레드는 프로세스보다 가볍고, 생성 및 관리가 더 빠릅니다.


Perl을 이용한 프로세스와 쓰레드 테스트

Perl에서는 fork를 이용하여 프로세스를 생성하고, threads 모듈을 사용하여 쓰레드를 생성할 수 있습니다. 간단한 예제를 통해 프로세스와 쓰레드를 테스트해보겠습니다.


프로세스 예제

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw(time);

my $start_time = time();

my $num_processes = 4;
my @pids;

for (1..$num_processes) {
    my $pid = fork();

    if (!defined($pid))
    {
        die "Failed to fork: $!";
    }
    elsif ($pid == 0)
    {
        # 자식 프로세스
        calculate_primes();
        exit 0;
    }
    else
    {
        push(@pids, $pid);
    }
}

foreach my $pid (@pids)
{
    waitpid($pid, 0);
}

my $end_time = time();

print "Time taken using processes: ", $end_time - $start_time, " seconds\n";

sub calculate_primes
{
    my $max = 10_000;
    my $count = 0;

    for (my $num = 2; $num <= $max; $num++) {
        my $is_prime = 1;

        for (my $i = 2; $i * $i <= $num; $i++)
        {
            if ($num % $i == 0)
            {
                $is_prime = 0;
                last;
            }
        }

        $count++ if $is_prime;
    }
}


# 결과
Time taken using processes: 0.0511531829833984 seconds


쓰레드 예제

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw(time);
use threads;

my $start_time = time();

my $num_threads = 4;
my @threads;

for (1..$num_threads)
{
    push(@threads, threads->create(\&calculate_primes));
}

foreach my $thread (@threads)
{
    $thread->join();
}

my $end_time = time();
print "Time taken using threads: ", $end_time - $start_time, " seconds\n";

sub calculate_primes
{
    my $max = 10_000;
    my $count = 0;

    for (my $num = 2; $num <= $max; $num++)
    {
        my $is_prime = 1;

        for (my $i = 2; $i * $i <= $num; $i++)
        {
            if ($num % $i == 0)
            {
                $is_prime = 0;
                last;
            }
        }

        $count++ if $is_prime;
    }
}


# 결과
Time taken using threads: 0.0478110313415527 seconds

두 비교 코드에서는 4개의 프로세스/쓰레드를 생성하여 각각 10,000까지의 소수를 계산합니다. 모든 작업을 병렬로 수행한 뒤 총 실행 시간을 측정합니다.


  • 프로세스: 프로세스 간 메모리와 자원 분리가 있어 상대적으로 오버헤드가 발생하며, 생성 및 관리 비용이 높습니다. 계산 작업이 병렬로 수행되지만, 프로세스 간의 통신 비용이 발생할 수 있습니다.
  • 쓰레드: 쓰레드는 메모리와 자원을 공유하여 생성과 관리가 더 가볍고 빠릅니다. CPU 집약적인 작업을 더 효율적으로 처리할 수 있습니다.


멀티 프로세스, 멀티 쓰레드의 환경에서도 각각의 장단점을 가지고 있기에, 각 환경에 적합한 방식을 선택해야 합니다.

  • 속도보다는 안정성, I/O 가 많은 어플리케이션이라면, 멀티 프로세스!
  • 안정성 보다는 속도가 중요시 되는 어플리케이션이라면, 멀티 쓰레드!


:bulb: NOTE
Context Switching Overhead : 쓰레드 전환시 발생되는 비용, 쓰레드가 프로세스보다 빠르지만, 코어는 한정적이므로 무조건적으로 빠르다고는 볼 수 없다.
자원 공유 : 프로세스는 독립적인 메모리를 가지고, 쓰레드는 공유 메모리를 가지고 있어, 쓰레드가 자원 공유를 하기 쉽지만, 자원을 공유하기 위한 syncronize 를 거쳐야 하므로, lock 에 의한 교착상태가 발생할 수 있다.

HeonJe Lee | 선임연구원
게이트웨이 On-promise 제품 팀에서 시스템 모니터링 및 관리를 쉽게 다가갈 수 있도록 하기 위한 업무를 하고 있습니다.

Contact: lhjnano@gmail.com

Search

    Table of Contents