티스토리 뷰

Java

프로세스와 스레드

lkh's 2018. 12. 28. 02:01

1. 프로세스 : 실행중인 프로그램


프로세스는 CPU로부터 시스템 자원을 할당받아 독립적으로 실행중인 프로그램을 의미한다. 여기서 주목해야할 키워드는 시스템 자원, 독립적 실행이다.

프로세스는 CPU로부터 각각 독립된 Code, Data, Stack, Heap 영역을 할당받는다. 각각의 프로세스는 독립적인 메모리 영역을 가지고 있기 때문에 다른 프로세스의 자원에 접근하기 위해서는 IPC (Inter Process Communication)를 사용해야 한다. IPC는 메일슬롯, 파이프, 파일, 소켓 등을 이용하여 통신할 수 있다.




2. 스레드 : 프로세스 내에서 실행되는 작업의 단위


프로세스 내부에는 하나 이상의 스레드가 존재한다. 그리고 각각의 스레드는 독립적으로 시스템 자원을 할당받는 프로세스와는 달리 일부 시스템 자원을 공유하고있다. 스레드는 스택 영역을 제외한 힙, 코드, 데이터 영역은 공유해서 사용한다. 그렇다면 왜? 스택 영역만은 공유하지 않고 별도로 가지고 있을까?

스택은 지역변수와 메소드를 보관할 수 있는 영역이다. 스택 공간이 독립적이라는 것은 각각의 스레드가 서로에게 영향을 미치지 않고 독립적으로 메소드를 

호출할 수 있으며, 이것은 최소한의 자원을 제공함으로써 독립적인 실행을 지원할 수 있다는 의미이다. 또한, 힙 영역을 공유해서 사용함으로써 발생할 수 있는

문제를 스택 영역을 통해 해결이 가능하다. 이 부분은 아래 링크에서 코드와 그림을 통해 자세히 설명되었기 때문에 아래 링크를 참고!



결과적으로 다시 정리하자면, 힙, 데이터, 코드 영역은 공유함으로써 시스템 자원의 효율성을 높이고, 스택 영역을 독립적으로 사용함으로써 독립적인 실행을 

통한 멀티 태스킹을 지원할 수 있다. 


3. 컨텍스트 스위칭


프로세스와 스레드에서  빠질 수 없는 개념중 하나가 컨텍스트 스위칭이다. 컨택스트 스위칭은 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다. 컨텍스트 스위칭은 프로세스의 PCB에 저장된다. PCB에서는 프로세스의 상태(생성, 준비, 대기, 수행, 정지), 프로그램 카운터(프로세스가 다음에 실행해야할 명령어 주소), 레지스터, 프로세스 번호를 저장한다. 참고로 컨택스트 스위칭때 CPU는 어떤 작업도 수행할 수 없기 때문에 컨텍스트 스위칭이 빈번하면 오버헤드가 발생해 성능이 저하진다.

스레드는 스택을 제외한 자원을 공유하고 있기 때문에 각각의 자원을 독립적으로 사용하는 프로세스보다 컨텍스트 스위칭의 오버헤드가 적다. 


4. 멀티 스레드


멀티 스레드는 멀티 프로세스 보다 자원의 효율성과 빠른 처리속도를 지원하고 있다. 우선적으로 앞에서 계속 강조해왔지만,  스레드는 자원을 공유하기 때문에

자원의 효율성을 지원하고, 자원을 공유하고 있기 때문에 컨텍스트 스위칭에 대한 오버헤드가 감소해서 멀티 프로세스보다 성능 저하가 낮다.

이런 멀티스레드를 지원하면 위에서 언급한 자원의 동기화 문제외에도 동시접속이라는 문제가 발생할 수 있다.

만약에 10만명 이상의 사용자가 동시에 접속한다면, 사용자마다 각각 스레드를 생성해줘야 한다고 했을 때, 10만개의 스레드를 생성해야 할까?

만약에 10만개의 스레드가 있다면, 스케줄링을 통해 각각의 스레드가 번갈아가며 작업이 수행될텐데.. 과연 내 차례는 언제올까? 

그리고 10만개의 스레드의 컨텍스트 스위칭이 일어나면 오버헤드가 발생하여 성능의 저하가 일어날텐데... 엄청난 문제가 되지 않을까?

그리고 10만개의 스레드를 생성하는 것만으로도 엄청난 작업이지 않을까? 이런 문제를 해결하기 위한 것이 스레드풀이다!

CPU는 스레드풀을 이용해서 생성할 수 있는 스레드의 갯수를 제한하고 있다. 기본적으로 톰캣은 200개의 스레드만 생성할 수 있게 설정되어 있다.

그리고 스레드풀은 미리 스레드를 생성하고 있으며, 한번 작업이 끝난 스레드는 소멸하는 것이 아닌 계속해서 재사용할 수 있다. 그렇기 때문에 스레드 생성에 

대한 성능저하도 해결할 수 있다. 그리고 스레드풀은 FIFO를 지원하는 작업큐가 존재한다. 


정리를 하자면, 프로세스와 스레드는 시스템 자원의 공유 유무로 부터 차이가 발생하고 있다. 컨텍스트 스위칭, 각각의 독립적인 실행이 자원을 통해 발생하기 때문이다.



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함