Computer(IT)/JAVA

Thread의 개념

약탄치킨 2010. 1. 15. 19:32
반응형

프로세스는 실행되고 있는 프로그램을 의미합니다.

프로그램을 실행하게 되면 데이터가 메모리로 이동하면서 실행이 됩니다.
이 때, 메모리에 로딩된 프로그램을 프로세스라고 합니다.

프로세스간에는 서로 독립적인 메모리 공간과 CPU를 사용하기 때문에
서로간의 불가침을 하고 있지요. 서로가 서로에게 영향을 줄 수 없습니다.

쓰레드는 주로 프로세스(실행되고 있는 프로그램)에서 만들어집니다.
만약,  하나의 데이터가 있다고 가정하면..
이 데이터를 서로 다른 방법으로 처리하면서 결과값을 주고 받아야 합니다.
하지만 프로세스는 서로의 영역에 통신을 할 수 가 없습니다.

그때 프로세스가 통신을 위해 파생시키는 것이 Thread입니다.

프로세스와는 달리 자기들끼리 통신도 하고 데이터도 공유합니다.

프로세스와는 달리 불가침 따위는 없습니다. 같은 공간을 공유하고 있으므로 하나의 Thread에 이상이 있으면 다른 Thread에도 영향을 주게 됩니다.

대개의 경우 프로세스는 단독으로 실행이 가능하지만 쓰레드는 프로세스가 있고 그 하위에 쓰레드가 여러개 생성되는 것이 일반적입니다

[출처] Thread란 무엇인가??|작성자 셰프

1. 프로세스와 스레드
프로세스(process)란 간단히 말해서 '실행 중인 프로그램(program)' 이다. 프로그램을 실행하면 OS로 부터 실행에 필요한
자원(메모리)을 할당받아 프로세스가 된다.


       실행
프로그램   --------------------------->  프로세스

프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 스레드로 구성되어 있으며 프로세스의 자원을
이용해서 실제로 작업을 수행하는 것이 바로 스레드이다.
그래서 모든 프로세스는 최소한 하나 이상의 스레드가 존재하며, 둘 이상의 스레드를 가진 프로세스를 멀티스레드 프로세스(multi-threaded process)
라고 한다.

[참고] 스레드를 프로세스라는 작업공간(공장)에서 작업을 처리하는 일꾼(worker)으로 생각하면 이해하기 쉬울 것이다.

싱글스레드 프로세스 = 자원 + thread
멀티스레드 프로세스 = 자원 + thread + thread + ....

하나의 프로세스가 가질 수 있는 스레드의 개수는 제한되어 있지 않으나 스레드가 작업을 수행하는데 개별적인 메모리공간(호출스택)을 필요로 하기
때문에 프로세스의 메모리 한계(호출스택의 크기)에 따라 생성할 수 있는 스레드의 수가 결정된다. 실제로는 프로세스의 메모리 한계에 다다를 정도로 많은
스레드를 생성하는 일은 없을 것이니 이에 관해서는 걱정하지 않아도 된다.
현재 우리가 사용하고 있는 윈도우나 유닉스를 포함한 대부분의  OS는 멀티태스킹(multi-tasking, 다중작업)을 지원하기 때문에 여러 개의 프로세스가 동시에 실행될 수 있다.
멀티태스킹과 마찬가지로 멀티스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것이 가능하다. 실제로는 한 개의 CPU가 한 번에 단 한가지 작업만 수행할 수 있기 때문에 아주 짧은 시간 동안 여러 작업을 번갈아 수행함으로써 동시에 여러 작업이 수행되는 것처럼 보이게 하는 것이다. 그래서 프로세스의 성능이 스레드의 개수에 비례하지 않으며, 하나의 스레드를 가진 프로세스 보다 두 개의 스레드를 가진 프로세스가 오히려 더 낮은 성능을 보일 수도 있다.
도스와 같이 한 번에 한가지 작업만 할 수 있는 OS와 윈도우와 같이 멀티태스킹이 가능한 OS의 차이는 이미 경험으로 잘 알고 있을 것이다. 싱글스레드 프로그램과 멀티스레드 프로그램의 차이도 이와 같다고 생각하면 된다.

멀티스레딩의 장점
- CPU의 사용률을 향상시킨다.
- 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.

메신저의 경우 채팅하면서 파일을 다운로드 받거나 음성대화를 나눌 수 있는 것이 가능한 이유가 바로 멀티스레드로 작성되어 있기 때문이다. 만일 싱글스레드로 작성되어 있다면 파일을 다운로드 받는 동안에는 채팅을 할 수 없을 것이다.
여러 사용자에게 서비스를 해주는 서버프로그램의 경우 멀티스레드로 작성하는 것은 필수적이어서 하나의 서버프로세스가 여러 개의 스레드를 생성해서 스레드와 사용자의 요청이 일대일로 처리되도록 멀티스레드로 프로그래밍해야 한다.
만일 싱글스레드로 서버프로그램을 작성한다면 사용자의 요청 마다 새로운 프로세스를 생성해야 하는데 프로세스를 생성하는 것은 스레드를 생성하는 것에 비해 훨씬 더 많은 시간과 메모리공간을 필요하기 때문에 많은 수의 사용자 요청을 서비스하기 어렵다.

[참고] 스레드를 가벼운 프로세스, 즉 경량프로세스(LWP, light-weight process)라고 부르기도 한다.

그러나 멀티스레딩에 장점만 있는 것은 아니어서 멀티스레드 프로세스는 여러 스레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화(synchronization), 교착상태(deadlock)와 같은 문제들을 고려해서 신중히 프로그래밍해야 한다.

[참고] 교착상태란 두 스레드가 자원을 점유한 상태에서 서로 상대편이 점유한 자원을 사용하려고 기다리느라 진행이 멈춰있는 상태를 말한다

출처 by KimSSUNG
반응형