[Java] Multi Process & Multi Thread
프로세스(Process)와 스레드(Thread)
프로세스를 구성하는 요소 중 하나가 스레드 이기 때문에 스레드를 이해하기 위해서 프로세스를 먼저 알아보자.
프로세스(Process)란?
프로세스란 단순하게 말하면 실행 중인 프로그램 이라고 할 수 있다.
하나의 자바 애플리케이션을 실행중이라면 그것이 바로 프로세스이다.
다시 말해, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 + 스레드로 구성된다.
ex) 크롬 브라우저 창 2개 -> 프로세스 2개
- 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
- 메모리에 올라와 실행되고 있는 독립적인 인스턴스(개체)
- 운영체제로부터 시스템 자원을 할당받는 작업 단위
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가진다. ex) 자바의 main 실행 함수
- 프로세스는 독립된 메모리 영역(code, data, stack, heap)을 할당 받는다.
- 프로세스는 별도의 주소 공간에서 실행되므로, 다른 프로세스의 주소 공간(변수, 자료구조 등)에 접근할 수 없다.(독립적)
프로세스 간의 데이터 통신을 위해 IPC(Inter-Process Communication)을 통해 데이터를 주고 받을 수 있다.
프로세스 : 운영체제로부터 메모리 공간을 할당받아 실행중인 프로그램. {자원 + 스레드(Thread)}
프로그램: 어떤 작업을 위해 실행할 수 있는 파일. 파일을 실행하지 않은 코드 덩어리 상태 (정적인 개념)
프로세스의 자원 구조
프로세스는 자원과 스레드로 구성되는데, 보통 자원 하나와 스레드 하나 이상으로 구성되어 있으며,
자원을 여러 스레드가 공유하는 형태이다. 그 중 자원의 구조는 아래와 같다.
※ Stack 영역과 Heap영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어드는 동적 영역이다.
TEXT : 코드 영역으로 프로그래머가 작성한 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다.
DATA : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터가 모여있다.
HEAP : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들이 존재하는 공간으로 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
STACK : 지역 변수와 호출한 함수가 종료되면 되돌아 올 임시적인 자료를 저장하는 독립적인 공간이다. Stack 은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만약 stack 영역을 초과하면 stack overflow가 발생한다. 다른 자원과 달리 각각의 스레드가 독립적으로 갖는다.
멀티 프로세스란?
- 여러 개의 프로세스가 서로 협력적으로 일을 처리하는 것.
- 여러 개의 프로세스가 작업을 병렬처리하는 것.
- 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할때 사용.
멀티 프로세스의 특징
독립성:
멀티 프로세스는 각각의 프로세스가 독립적인 메모리 공간을 가지고 실행된다.
한 프로세스에서의 오류가 다른 프로세스에 영향을 미치지 않는다는 장점이 있다.
안전성:
하나의 프로세서 충돌 또는 오류로 인해 시스템 전체가 영향을 받지 않는다.
한 프로세스가 비정상 종료되더라도 다른 프로세스는 계속 실행된다.
병렬성:
멀티 프로세스는 여러 CPU 코어에서 병렬로 실행될 수 있으므로 병렬 처리를 구현하기 쉽다.
각 프로세스는 독립적으로 작업을 수행하며, 병렬 작업을 수행하기 위해 프로세스 간 통신(IPC)이 필요하다.
"자원을 공유하는 멀티 스레드와 달리 프로세스는 프로세스끼리 메모리에 직접 접근이 불가능하다."
앞 서 작성한 바와 같이 각각의 프로세스는 별도의 주소 공간에서 실행되므로 데이터를 주고 받을 수 없다.
예를 들어, 크롬 브라우저에 네이버 로그인을 진행한다. 새로운 크롬 브라우저 창을 켜서 네이버에 들어가보면 똑같이 로그인이 되어있는 것을 볼 수 있다.
각 프로세스는 독립적인 메모리 공간을 가지므로,
한 프로세스에서 로그인한 정보(예: 세션 정보, 쿠키 등)를 다른 프로세스에서 직접적으로 접근할 수 없다.
따라서, 크롬 브라우저는 IPC(Inter-Process Communication) 기법을 사용하여 서로 다른 프로세스 간에 필요한 정보를 공유한다. 예를 들어, 사용자가 한 탭에서 네이버에 로그인하면, 해당 로그인 정보는 브라우저의 세션 관리 시스템에 저장된다.
이후 다른 탭이나 창에서 네이버를 열 때, 브라우저는 IPC를 통해 로그인 정보를 공유하여 자동으로 로그인이 되도록 한다.
프로세스의 자원 공유 방법
IPC(Inter-Process Communication) :
서로 다른 프로세스 간에 데이터를 교환하거나 통신할 수 있도록 하는 방법.
- Pipes(부모 프로세스와 자식 프로세스 간),
- 메시지 큐(프로세스 간에 메시지를 전송할 수 있는 큐를 제공),
- 공유 메모리(여러 프로세스가 동일한 메모리 공간을 공유하여 데이터를 교환하는 방법),
- 소캣(네트워크를 통해 서로 다른 시스템의 프로세스 간에 통신할 수 있도록 하는 방법)...등의 방법이 존재한다.
스레드란?
프로세스의 한 요소인 스레드란 무엇일까?
스레드란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 말한다.
크롬 브라우저를 예를 들어 설명하자면 다음과 같다.
- 크롬 브라우저를 실행한다 => 하나의 프로세스가 생성된다.
- 크롬 브라우저에서 그림 파일을 다운 받는다 => 하나의 스레드가 생성된다.
- 크롬 브라우저에서 동시에 쇼핑을 한다 => 또 하나의 스레드가 생성된다.
모든 프로세스는 한 개 이상의 스레드가 존재하여 작업을 수행한다. 자바에서는 JVM(Java Virtual Machine)에 의해 관리된다.
멀티 스레드(Multi Thread)란?
두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 하며, 자바에서는 멀티 스레드를 지원한다.
모든 프로세스는 한 개 이상의 스레드가 존재한다고 했다.
즉, 프로세스를 생성하면 기본적으로 하나의 main 스레드가 생성되는 것이다. 스레드를 개발자가 2개, 3개... 추가 생성하게 되면 멀티 스레드 환경이 되는 것이다. 이러한 스레드들은 프로세스의 리소스(자원)를 공유하기 때문에 효율적이긴 하지만 잠재적인 문제점에 노출될 수도 있다.
스레드의 자원 공유
스레드는 어떻게 하나의 프로세스에서 동시에 작업을 할 수 있게 해주는 걸까?
그 이유는 바로 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문이다.
프로세스의 Heap, data, text은 프로세스 내 다른 스레드들과 공유되고 "stack 영역만" 할당받아 복사된다.
Stack 영역만 별도로 가지는 이유?
Stack은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문이다. 즉, 독립적인 Stack을 가졌다는 것은 독립적인 함수 호출이 가능하다는 의미이다.
그리고 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름을 가질 수 있다는 의미이다.
멀티 스레드(Multi Thread)를 사용하는 이유
자바에서 멀티 스레드를 사용하는 이유는 CPU 사용율을 향상시켜 자원을 보다 효율적으로 사용할 수 있기 때문이다.
정확히는 CPU 사용율을 높이기 위해 멀티스레딩을 사용하는 것이다.
CPU는 일반적으로 여러개의 코어를 가지고 있기 때문에 멀티 스레드를 사용하게 되면 각 스레드가 서로 다른 코어에서 실행될 수 있어, CPU의 전체 성능을 극대화할 수 있다.
스레드의 자원 공유에서 볼 수 있듯이 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복을 최소화하여 수행 능력을 향상시킨다.
멀티 스레드의 특징
공유 메모리
: 멀티 스레드는 하나의 프로세스 내에서 실행되며, 이들 스레드는 같은 메모리 공간을 공유한다.
따라서 데이터 공유 및 통신이 쉽고 빠르다.
경량성
: 스레드는 프로세스보다 더 가벼우며, 스레드 간 전환이 빠르다.
이로 인해 스레드 간 작업 분배 및 동기화가 더 효율적으로 이루어진다.
병렬성
: 멀티 쓰레드는 동일한 프로세스 내에서 병렬 실행되므로 프로세스 간 통신이 필요하지 않다.
하지만 여러 쓰레드 간의 동시성 관리 및 동기화 문제가 발생할 수 있다.
안정성
: 한 쓰레드 오류가 다른 쓰레드에 영향을 미칠 수 있으므로 쓰레드 간의 조심스러운 동기화가 필요하다.
따랏 프로그래밍이 복잡할 수 있다.
멀티 스레드 장단점
장점
- 시스템 자원(예) CPU)을 보다 효율적으로 사용할 수 있다.
- 비동기적 작업 수행 가능: 사용자에 대한 응답성이 향상된다.
- 예를 들어, 채팅 프로그램의 경우 싱글 스레드 프로그램일 경우 파일 전송을 마칠 때까지 채팅 기능을 사용할 수 없지만, 멀티 스레드로 가능하다.
- 작업이 분리되어 코드가 간결해진다.
- 작업을 쓰레드별로 나눠서 작성하기 때문에 코드가 간결해 진다.멀티 스레드를 사용하면 프로그램의 여러 작업을 동시에 실행할 수 있다. 예를 들어, 사용자 인터페이스(UI)와 데이터 처리 작업을 분리할 수 있다. UI 스레드는 사용자 입력을 처리하고 화면을 업데이트하는 반면, 데이터 처리 스레드는 파일 읽기, 데이터 계산 등의 작업을 수행한다. 이렇게 작업을 분리하면 각 스레드가 독립적으로 실행되므로 코드가 더 명확해진다.
단점
- 시스템 자원을 여러 스레드가 공유해야 한다.
- 동기화로 인한 성능 저하
- 멀티 스레드는 여러 개의 스레드가 공유 자원에 동시에 접근할 수 있기 때문에 동기화 문제가 발생할 수 있다.예를 들어) 여러 스레드가 동시에 한 자원을 변경해 버린다면, 의도되지 않은 엉뚱한 값을 읽어 서비스에 치명적인 버그가 발생할 수 있다. 값이 예상과 다르게 될 수 있어 의도 되지 않은 결과를 초래할 수 있다. 따라서 스레드 간 동기화는 데이터 접근을 제어하기 위한 필수적인 기술이다.
- 동기화 작업은 여러 스레드들이 자원에 대한 접근을 순차적으로 통제하는 것이다. 그러면 동시 접근으로 인한 동시 수정과 같은 현상은 일어나지 않는다. 그러나 동기화 작업은 여러 스레드의 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하될 가능성이 높다.
- 병목현상: 동기화가 필요한 자원에 대해 여러 스레드가 대기하게 되면, 자원에 대한 접근이 제한되어 전체 성능이 저하될 수 있다. 특히, 자원에 대한 접근이 빈번한 경우 병목 현상이 심각해질 수 있다.
- 교착상태(dead-lock)이 발생하지 않도록 주의해야 한다.
- 교착상태란, 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황이다. 여러 개의 스레드가 서로 대기하면서 무한정 기다리게되는 무한 루프와 같은 증상이라고 볼 수 있다.
Q. 멀티 프로세스와 멀티 쓰레드의 특징에 대해 설명해주세요.
멀티 프로세스는 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행된다는 장점이 있지만,
멀티 쓰레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있습니다.
멀티 쓰레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만
하나의 쓰레드에 문제가 생기면 전체 쓰레드가 영향을 받으며 동기화 문제도 있다는 단점이 있습니다.
Q. 멀티스레드란? 그리고 사용하는 이유
멀티 스레드란 2개 이상의 스레드를 가지는 프로세스를 말합니다. 여기서 프로세스란 운영체제(OS)가 메모리를 할당하여 실행중인 프로그램을 말하며, 스레드란 이 프로세스내에서 작업을 수행하는 주체입니다.
하나의 스레드만 존재하는 싱글 스레드일 경우 하나의 작업이 모두 끝난 뒤 다른 작업을 수행할 수 있습니다.
반면, 멀티 스레드의 경우에는 하나의 프로그램에서 파일을 다운 받는 동시에 검색이 가능한 것과 같이 여러 작업을 동시에 수행할 수 있습니다. (비동기성)
또한 멀티 스레드의 경우 프로세스의 스택 영역을 제외한 힙, 데이터, 코드(텍스트) 영역의 자원을 공유하기 때문에 자원의 생성과 관리의 중복을 최소화 할 수 있습니다. 이러한 이유 때문에 멀티 스레드를 사용합니다.
참고자료
[JAVA]프로세스와 스레드의 차이점
프로세스(process)란 무엇일까? > 프로세스란 운영체제로부터 자원(공간)을 할당받은 작업의 단위입니다. 프로그램과 프로세스의 차이점은 프로그램은 실행되지않은 정적인 파일(\.EXE, \.TXT)이고
velog.io
https://dev-dobim.tistory.com/103
[백엔드] 기술 면접 Top30 - #24 멀티 프로세스와 멀티 스레드
멀티 프로세스와 멀티 스레드 멀티 프로세스 ( Mutil - Process ) 독립성 멀티프로세스는 각각의 프로세스가 독립적인 메모리 공간을 가지고 실행된다. 따라서 한 프로세스에서의 오류가 다른 프로
dev-dobim.tistory.com