운영체제와 연관이 있다.
1.프로세스란?
프로그램은 어떤 작업을 실행할 수 있는 파일이다.
프로세스는 컴퓨터 메모리에서 실행되고 있는 프로그램이다.
운영체제로부터 시스템 자원을 할당 받으며 자원의 종류의 예로 CPU 시간이나, 주소 공간, 메모리 영역이 있다.
할당되는 메모리영역은 Code, Data ,Stack, Heap 구역으로 나뉘어져 있다.
프로세스에는 최소 하나의 스레드를 가지고 있다.
각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
만약 각 프로세스의 자원끼리 통신을 하려면 파이프, 소켓, 파일 등의 통신 방법이 필요하다.
2.스레드란?
프로세스 내에서 실행되는 흐름의 단위이다.
프로세스가 할당받은 자원의 실행 단위이기도 하다.
프로세스는 스레드에게 별도의 레지스
터와 Stack만 따로 할당한다. 다른 Heap, Data, Code 영역은 각 스레드에서 공유한다. 때문에 한 스레드가 프로세스 자원을 변경하면 다른 스레드도 그 변경 결과를 알 수 있다.
3.멀티 프로세스와 멀티 스레드
- 멀티 프로세스
하나의 응용프로그램을 여러 개의 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
장점은
여러개의 자식 프로세스 중 하나에 문제가 발생해도 영향이 미비하다는 것
단점은
Context Switching에서의 오버헤드 문제가 있다.
Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 된다. 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching가 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
또 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)도 단점으로 작용한다.
프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.
Context Switching
CPU 는 여러 프로세스를 돌아가면서 작업을 처리한다. 그리고 이 과정을 Context Switching 이라 한다.
CPU는 한번에 하나의 프로세스를 처리한다. 돌아가면서 처리를 할때에는 동작중인 프로세스를 대기하고 해당
프로세스의 상태를 보관한다. 이때 프로세스의 상태는 Context 라고 한다. 대기를 당했던 프로세스가 다시 돌고자 할때
보관해놨다. Context 를 복구한다.
이 과정에서 CPU의 레지스터의 교체와 RAM과 CPU 사이 캐시 메모리 데이터가 초기화 된다.
- 멀티 스레딩
하나의 응용프로그램을 여러개의 스레드로 구성하고 각 스레드로 하나의 작업을 분산시켜 처리하는 것이다.
많은 운영체제가 멀티 스레딩을 기본으로 하고 있다. 웹 서버의 경우 대표적인 멀티 스레드 응용 프로그램이다.
장점
1.시스템 자원 소모 감소
프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
2.시스템 처리량 증가 (= 처리 비용 감소)
스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
스레드 사이의 작업량이 작아 Context Switching이 빠르다.
3.간단한 통신 방법으로 인한 프로그램 응답 시간 단축
스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
단점
주의 깊은 설계가 필요하다.
디버깅이 까다롭다.
단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
다른 프로세스에서 스레드를 제어할 수 없다. 즉, 프로세스 밖에서 스레드 각각을 제어할 수 없다.
멀티 스레드의 경우 자원 공유의 문제가 발생한다. 이것이 동기화의 문제이다.
하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
멀티 프로세스 보다 멀티 스레드를 사용하는 이유는?
프로그램을 여러개 켜서 한 작업을 처리하는 것보다. 한 프로그램 안에서 여러 작업을 해결하는게 쉽기 때문이다.
프로세스를 생성하여 자원을 할당하는 것도 하나의 호출인데(=시스템 콜) 이 호출이 줄어 자원의 효율성이 더 좋다.
스레드간의 데이터를 주고 받는게 프로세스간 데이터 통신보다 쉽다. 또 프로세스간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.
그럼 얼마만큼 스레드가 좋을까
적정 스레드 개수 = CPU 수 * (1+ 대기시간/ 서비스시간)
CPU 대기시간이 서비스 기간보다 짧다면 CPU 개수보다 스레드가 적어야 성능이 좋다.
이유는 대기가 짧기 때문에 스레드가 적어도 상관이 없기때문이다. 한마디로 과유불급이라는 얘기
스레드는 어떻게 보면 회사의 직원이라 생각하면된다.
회사(서비스) 입장에서는 서비스 대기를 줄이는게 좋다. 그래야 작업이 빨리 처리되니까
그럼 대기를 줄이려면? 직원을 많이 뽑던가 초S급 직원을 뽑던가이다. 스레드의 개수를 늘리는게 전자의 얘기이다.
그렇다고 대기도 없는데 직원을 많이 뽑으면 괜한 인력, 자원 낭비이다. 그러니 대기 시간이 짧을때는 스레드가 적다.
어디까지 생성이 되는가?
우선 메모리에 대한 얘기를 하자면 보통 Heap과 Stack사이는 원래는 미사용공간으로 비어있다. 스택은 함수가 호출될때, 힙은 동적으로 할당했을때 할당된다.
Heap과 Stack은 사용자 지정에 의해 최대 크기를 정할 수 있지만, 사용자 지정이 없다면
한 프로세스 내에서 Heap과 Stack 은 윈도우에서 설정한 RAM 의 남은 크기만큼 할당할 수 있다.
만약 RAM을 다 사용한다면 가상메모리를 사용할 것이다.
마찬가지로 스레드는 남은 RAM 크기 이상은 만들 수 없다. 스레드는 프로세스 내에서 실행이 되기 때문이다.
'참고자료' 카테고리의 다른 글
JSON Web Token (JWT) (0) | 2021.07.06 |
---|---|
쿠키, 세션, 캐시 (0) | 2021.07.06 |
JAVA - 추상메소드와 추상클래스 그리고 인터페이스는 왜 쓰는걸까? (0) | 2021.07.02 |
객체와 클래스 (0) | 2021.07.01 |
자바의 특징은 무엇일까 (0) | 2021.06.30 |