프로세스와 쓰레드

프로세스

프로세스는 실행 중인 프로그램을 말하며, 완벽하게 독립접으로 실행됩니다.

메모리에 올라와 있고 실행되고 있는 프로그램의 단위이며, 메모리 영역(Code, Data, Heap, Stack)을 가지게 됩니다.

프로세스는 최소 1개의 쓰레드(메인 스레드)를 가지고 있습니다.

 

각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스에서 다른 프로세스의 변수나 자료구조에 접근이 불가능 합니다.

접근하려면 파이프, 파일, 소켓 등의 통신 방법을 사용해야 합니다.

 

쓰레드

쓰레드는 프로세스 내에서 Stack만 따로 할당 받고, 그 이외의 메모리 영역 (Code, Data, Heap) 영역을 공유합니다.

프로세스 내에서 실행되는 여러 허름의 단위이며, 같은 프로세스 내의 여러 스레드들은 같은 힙 공간을 공유합니다.

따라서 다른 쓰레드의 실행 결과를 즉시 확인할 수 있습니다. 

쓰레드는 프로세스 내에 존재하며, 프로세스가 할당받은 자원을 이용하여 실행됩니다.

 

Main Thread와 ANR

메인 쓰레드는 액티비티와 컴포넌트들의 사용을 담당하고 연동하는 역할을 합니다.

System Call-Back Method, LifeCycle 관련 Method를 관리하며,

다른 작업에 의해 메인 쓰레드의 UI가 동기화 되지 못하고 지연 되는 경우 ANR 오류가 발생합니다.

 

ANR: Application Not Responding의 약자로 UI 작업이 일정기간 이상 반응하지 못하는 경우를 말합니다.

 

위의 문제를 해결하기 위해서 불안정한 UI 작업이나, 애니메이션과 같은 비동기 작업, 

Database 처리와 같은 High Cost의 연산 작업은 Worker Thread를 사용해 처리합니다.

 

안드로이드에서는 Worker Thread 환경에서의 작업을 보장하기 위해서 Async Task을 지원하였지만,

현재는 Deprecated 되어 RxJava나 Coroutine과 같은 기능이 생기게 되었습니다.

 

멀티 프로세스 

멀티 프로세스는 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 합니다.

 

여러 개의 자식 프로세스 중 하나의 문제가 발생하면 그 프로세스만 죽음으로써, 안정성을 확보 할 수 있다는 장점이 있습니다.

 

단점으로는 Context Switching에서의 오버헤드가 발생한다는 점입니다,

여기서 Context Switching이란 CPU에서 여러 프로세스가 돌아가면서 작업을 처리하는 과정입니다.

또한 캐쉬 메모리 초기화 등 무거운 작업이 진행되므로 많은 시간이 소모되고,

프로세스 사이에 어렵고 복잡한 통신 기법을 활용해야 한다는 단점이 있습니다.

 

멀티 쓰레드

멀티 프로세스보다 적은 메모리 공간을 차지하고, 문맥 전환이 빠르다는 장점이 있습니다.

시스템 자원 소모 감소와 처리량 증가, 간단한 통신 방법을 지원한다는 장점이 있습니다.

 

하지만 하나의 쓰레드가 문제가 생기면 전체 쓰레드가 영향을 받으며, 동기화 문제도 발생합니다.

이에 따라서 주의 깊은 설계와 까다로운 디버깅이 필요하며, 단일 프로세스 시스템의 경우 효과가 적다는 단점도 있습니다.

 

멀티 프로세스 대신 멀티 스레드를 사용하는 이유

 

프로그램을 여러개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더욱 효율적입니다.

쓰레드 사이에 공유 자원을 활용하여 처리량과 적은 메모리 공간을 활용할 수 있습니다.

주의할 점은 멀티 쓰레드의 단점을 명확하게 알고, 이를 대비해야 합니다.

 

다수의 쓰레드가 공유 데이터를 동시에 접근하는 경우에 상호배제 또는 동기화 기법을 통해

동시성 문제와 교착 상태가 발생하지 않도록 하는 것이 중요합니다.

 

멀티 쓰레드에서의 동시성과 병렬성 

동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행되는 것을 말합니다.

동시에 실행하는 것처럼 보이지만 사실 번갈아서 실행한다는 특징을 가지고 있습니다.

 

병렬성은 멀티 작업을 위해 멀티 코어에서 한 개 이상의 쓰레드를 포함하는 각 코어들을 동시에 실행하는 것을 말합니다.

 

데드락 

둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 상황

 

예를 들어, 자원 A를 가진 프로세스 P1과 자원 B를 가진 프로세스 P2가 있을 때, 

서서로 필요로 하는 경우가 발생하면 서로 자원을 기다리며 무한정 기다리게 됩니다.

 

데드락의 4가지 조건은 아래와 같습니다.

- 비선점 : 다른 프로세스의 자원을 뺏을 수 없음

- 순환 대기 : 두 개 이상의 프로세스가 자원 접근을 기다릴 때, 관계가 순환적 구조

- 점유 대기 : 공유 자원에 대한 접근 권한을 가진 채로 다른 자원에 대한 접근 권한을 요구

- 상호 배제 : 한 번에 한 프로세스만 공유 자원에 접근 가능하며, 접근 권한이 제한적일 경우