사실 코딩을 한 이래로, 프로세스니 쓰레드니 구분하거나 따로 관리하며 개발했던 적은 없는 것 같다.
현 회사에서 개발을 진행하다, 성능상 문제될 부분에 대해서 생각을 하다 문득 프로세스와 쓰레드에 대해 정리가 되어있지 않은 나를 발견하여, 이렇게 정리하게 되었다.
1. 프로세스와 스레드란?
1.1 프로세스(Process)
프로세스는 실행 중인 프로그램 그 자체이다. 각각의 프로세스는 독립된 메모리 공간을 가지며, 운영체제로부터 별도의 자원을 할당받는다. (코드 / 데이터 / 스택 / 힙)
1.1.1 정적 세그먼트
•
Code: 작성한 코드
•
Data: 전역변수, 정적변수
1.1.2 동적 세그먼트
•
Heap: 변수, 함수 저장, 호출 (동적인 공간)
•
Stack: 함수 호출시 생성되고, 함수 종료시 반환되는 임시 메모리 공간
1.1.3 특징
•
독립적 메모리 공간 사용
•
프로세스 간 데이터 공유가 어려움
•
독립적 실행 가능 (다른 프로세스에 영향받지 않음)
1.2 스레드(Thread)
스레드는 프로세스 내부에서 작업을 나눠 수행하는 실행단위(흐름)이다. 하나의 프로세스 안에서 여러 스레드가 동시에 실행될 수 있다.
1.2.1 특징
•
코드, 데이터, 파일을 공유하며 하나의 레지스터(CPU 내부의 저장장치)와 하나의 스택(레지스터 집합에 존재하는 저장장치)으로 표현
•
프로세스의 자원을 공유 (메모리 공유)
•
빠른 컨텍스트 스위칭(작업 전환) 가능
•
데이터 공유가 쉽지만, 동시에 관리도 복잡
1.3 멀티프로세스(Multiprocess)
멀티프로세스는 여러 개의 프로세스를 동시에 실행하는 구조. 각각의 프로세스가 독립적이기 때문에 안정성이 뛰어나지만, 메모리를 많이 사용하는 단점이 있음.
1.3.1 장점
•
안정성 우수 (하나가 죽어도 다른 프로세스에 영향 없음)
•
병렬 처리가 용이
1.3.2 단점
•
높은 메모리 사용량
•
프로세스 간 통신 비용이 높음 (IPC: Inter Process Communication)
1.3.3. 활용 사례
•
웹 브라우저 탭 별로 별도의 프로세스 (Chrome) 크롬창을 많이 켜놓으면 안된다는 말이 진짜였어
•
Python의 multiprocessing 라이브러리로 병렬 작업 처리
1.4 멀티스레드(Multithread)
멀티스레드는 하나의 프로세스 내에서 여러 스레드를 생성해 동시에 작업을 수행하는 방식이다. 메모리를 적게 사용하면서 효율적으로 작업을 나눌 수 있지만, 관리가 까다롭다.
1.4.1 장점
•
빠른 컨텍스트 전환으로 성능 우수
•
메모리 자원 공유 (효율적)
•
데이터 공유 및 관리 용이
1.4.2 단점
•
안정성 저하 (하나의 스레드에서 오류가 생기면 프로세스 전체가 영향받음)
•
동시성 문제 발생 가능 (동기화 이슈)
1.4.3 활용 사례
•
웹 서버의 요청 처리 (Java Spring, Node.js Worker Threads)
•
UI 응답성을 높이기 위한 백그라운드 작업 처리
Ref:
최근에 외주업체로부터 기능을 이관받아 우리 시스템에 합류를 시키려다 업무 마무리 일정 때문에 진행되지 못 했는데, 어떻게 보면 해당 기능은 각각의 쓰레드가 아닌 프로세스로 관리되어야 했던 게 아닌가 싶다. 그런 의미에서 오히려 현재 구조가 더 맞아보이기도 한다. (별도의 서버; 협력업체에서 프로세스를 나눠서 관리했는지는 모르겠다
)