본문 바로가기
프로그래밍/AI

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

by slowin 2024. 12. 11.

강사님: 김용담

프로세스와 쓰레드란?

프로세스

  • 프로세스는 실행중인 프로그램의 인스턴스이다.
  • 프로세스 간의 메모리는 공유되지 않고 독립된 메모리 공간을 가진다.
  • 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않는다.
  • 운영체제에 의해 관리 된다.

쓰레드

  • 프로세스 내의 작업 단위
  • 같은 프로세스의 쓰레드는 메모리 공유가 가능하다.
  • 프로세스보다 가벼운 실행 단위

멀티 프로세스

정의

하나의 프로그램이 여러 프로세스를 만들어 작업을 수행방식을 말합니다.

특징

  • 각 프로세스는 메모리 독립입니다.
  • 각 프로세스는 영향을 받지 않기 때문에 다른 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않습니다.

장단점

  • CPU 코어를 더욱 효율적으로 사용가능합니다.
  • 독립된 메모리 공간을 가지기 때문에 메모리를 많이 소비합니다.

멀트 쓰레드

정의
하나의 프로세스에서 여러 쓰레드를 만들어 작업을 수행하는 방식을 말합니다.

특징

  • 각 쓰레드는 메모리 공유 가능합니다.
  • 쓰레드간 Context Switching 가 비교적 빠릅니다.

장단점

  • 메모리 관리가 효율적입니다.
  • 공유 메모리로 인해 메모리 동시 접근 경합(Race condition)이 발생 할 수 있습니다.

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

특징 멀티 쓰레드 멀티 프로세스
메모리 사용 적음 높음
안정성 낮음 높음
문맥 전환 비용 낮음 높음
통신 속도 빠름 느림
사용 사례 I/O 바운드 작업 CPU 바운드 작업

멀티 프로세스 코드

import time  
from multiprocessing import Pool, cpu_count  

# 행렬 곱셈 작업 함수
def matrix_multiplication_task(matrix_pair):  
    A, B = matrix_pair  
    result = [[0] * len(B[0]) for _ in range(len(A))]  
    for i in range(len(A)):  
        for j in range(len(B[0])):  
            for k in range(len(B)):  
                result[i][j] += A[i][k] * B[k][j]  
    return result  

# 단일 프로세스 실행  
def single_process(matrix_pairs):  
    results = []  
    for pair in matrix_pairs:  
        results.append(matrix_multiplication_task(pair))  
    return results  

# 다중 프로세스 실행  
def multi_process(matrix_pairs):  
    with Pool(cpu_count()) as pool:  
        results = pool.map(matrix_multiplication_task, matrix_pairs)  
    return results  

def main():  
    matrix_size = 100  
    num_matrices = 50  
    matrices = [(  
        [[i + j for j in range(matrix_size)] for i in range(matrix_size)],  
        [[i * j for j in range(matrix_size)] for i in range(matrix_size)]  
    ) for _ in range(num_matrices)]  

    # 단일 프로세스 테스트  
    start_time = time.time()  
    single_process(matrices)  
    single_duration = time.time() - start_time  
    print(f"Single process duration: {single_duration:.2f} seconds")  

    # 다중 프로세스 테스트  
    start_time = time.time()  
    multi_process(matrices)  
    multi_duration = time.time() - start_time  
    print(f"Multi-process duration: {multi_duration:.2f} seconds")  


if __name__ == "__main__":  
    main()

결과
Single process duration: 4.00 seconds
Multi-process duration: 1.81 seconds

결론, 연산의 갯수가 많을수록 멀티 프로세스를 활용한 빠른 처리 속도를 경험 할 수 있었습니다.

'프로그래밍 > AI' 카테고리의 다른 글

Git 활용 전략  (1) 2024.12.16
Git 학습  (1) 2024.12.16
Python List  (0) 2024.12.11
해시 함수 와 해시충돌  (1) 2024.12.11
Computational Thinking  (0) 2024.12.06