도당탕탕
Thread와 Process 본문
INTRO
- Process 란?
- Thread 란?
- Multi Process vs Multi Thread
Process
- 운영체제로부터 시스템 자원을 할당 받는 작업의 단위이다.
- 쉽게 말해 실행된 프로그램을 의미한다.
- 프로그램이란?
- 명령어, 코드 및 정적인 데이터의 묶음 코드들의 집합
- 어떤 작업을 위해 실행할 수 있는 파일을 의미
- Code, Data, Stack, Heap의 구조로 이루어져 있다.
- Code(Text): 프로그램의 코드
- Data: 전역 변수
- Heap: 동적으로 할당 되는 메모리
- Stack: 매개변수, 지역 변수 등 임시적인 자료
Process의 특징
- 기본적으로 한개의 프로세스당 최소 한개의 쓰레드를 가지고 있다.
- 각 프로세스는 별도로 실행된다. 즉, 프로세스끼리 자원을 공유할 수 없다.
- 즉, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원을 접근하려면 프로세스 간의 통신을 해야한다.
- IPC: 파이프,파일,소켓 등 이것들을 이용해 통신하는 방법
Thread
- 프로세스 내에서 여러개가 실행되는 흐름의 단위이다.
- 프로세스의 특정한 수행 경로이다.
- CPU이용의 기본단위 이다.
Thread의 특징
- 하나의 프로세스 내에서 여러개의 쓰레드를 가질 수 있다.
- 각각의 쓰레드는 별도의 Stack을 가진다.
- 쓰레드는 하나의 프로세스에서 Code, Data, Heap영역을 공유한다.
- 즉, 쓰레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스내의 주소 공간이나 자원들을 같은 프로세스 내에 쓰레드끼리 공유하면서 실행된다.
- Java Thread: 일반 쓰레드랑 거의 차이가 없다.
Multi Processing
- 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 방법이다.
특징
- 장점
- 여러개의 자식 프로세스 중 하나가 문제가 생겨도 다른 프로세스에게 영향을 주지 않는다.
- 단점
- Context Switching 비용이 크다.
- 프로세스 사이의 통신이(IPC) 어렵다.
- Context Switching이란?
- CPU에서 여러 프로세스를 돌아가면서 작업들을 처리하는데 이 과정을 Context Switching이라고 말한다.
- 동작중에 있는 프로세스가 대기를 하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전의 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
- Multi Processing에서 Context Switching이 큰 이유는 이 과정에서 무거운 작업이 진행되 많은 작업 시간이 걸려 오버헤드가 크다.
- 예를 들어 프로세스는 독립된 메모리 영역을 할당 받았기 때문에 프로세스 사이에서 공유하는 메모리 데이터가 없어 Context Switching이 발생하면 캐쉬에 있던 모든 데이터들을 초기화 하고 다시 캐쉬 정보를 불러와야 한다.
Multi Thread
- 하나의 응용프로그램을 여러개의 쓰레드로 구성하고 그 쓰레드로 작업을 처리하도록 하는 방법이다.
특징
- 장점
- 프로세스의 자원을 공유하기 때문에 자원을 효율적으로 관리할 수 있다. (자원 할당을 하는 시스템 콜이 적음)
- 쓰레드간 데이터를 주고 받는 것이 간단하다.
- Context Switching 비용이 적다.
- 응답 시간이 빠르다.
- 단점
- 단일 쓰레드일 경우 효과를 기대하기 어렵다.
- 자원을 공유하는 만큼 충돌을 주의 해야한다.(Sync)
- 다른 프로세스에서 쓰레드를 제어 할 수 없다.
- 하나의 쓰레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
Multi Processing VS Multi Thread
- 멀티 프로세싱 > 멀티 쓰래드
- 프로그램을 여러개 키는 것이 유리할 경우 사용한다.
- Google Chrome
- 멀티 프로세싱 < 멀티 쓰레드
- 하나의 프로그램안에서 여러 작업을 해결하는 것이 유리할 경우 사용한다.
- Web Server
- 여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 여러 쓰레드를 나눠가면서 하는 이유는?
- 자원의 효율성을 증대 - 멀티 프로세스를 실행되는 작업을 멀티 쓰레드로 할 경우 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어든다.
- 프로세스간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이 캐쉬 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크다.
- 쓰레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 쓰레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
- 처리 비용 감수 및 응답 시간 단축 - 프로세스 간의 통신 보다 쓰레드 간의 통신의 비용이 적어 작업들 간의 통신 부담이 줄어든다.
- 쓰레드는 Stack영역을 제외한 모든 메모리를 공유한다.
- 프로세스간의 전환 속도보다 쓰레드간의 전환 속도가 빠르다.
- Context Switching시 쓰레드는 Stack영역만 처리한다.
- 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
'CS' 카테고리의 다른 글
Sync와 Async 그리고 Blocking과 Non-Blocking (0) | 2020.01.16 |
---|
Comments