/ JAVA

프로세스와 쓰레드


[프로세스와 쓰레드의 개념]

프로세스(process)란 간단히 말해서 ‘실행 중인 프로그램(program)’이다. 지금 당장 작업 관리자를 열어 확인 할 수 있는 실행 중인 프로그램을 말한다. (멜론, 이클립스.. )
프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다. 정확히는 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있으며, 이 때 쓰레드는 실제로 작업을 수행하는 친구이다.

이제보니 프로세스와 쓰레드의 차이를 알기가 참 쉽다. 프로세스는 프로그램(멜론), 쓰레드는 그 안에서 열심히 실행하는 것

아무튼 모든 프로세스에는 최소 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 '멀티쓰레드 프로세스' 라고 한다. 하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않으나 쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 숫자가 결정된다.

멀티태스킹과 멀티쓰레딩은?
대부분의 OS는 멀티태스킹(다중작업)을 지원해서 여러 개의 프로세스가 동시에 실행될 수 있다. 이와 마찬가지로 멀티쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것이다.
CPU의 코어가 한 번에 단 하나의 작업만 수행할 수 있어, 실제 동시 처리 가능한 작업의 개수는 코어의 개수와 일치해야한다. 하지만 현재 작업관리자를 열어보면 현재 플레이 되고 있는 멜론, 유투브, 이클립스 등 참으로 많다. 그 이유는 뭘까? 바로 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보이는 것이다.
즉, 멀티태스킹은 동시에 여러 개의 프로세스를 동시에 실행시킬 수 있는 시스템(실제 번갈아가며 수행)
멀티 쓰레드는 하나의 프로그램을 여러개의 기능(쓰레드)으로 나누어 동시에 실행

멀티 쓰레드를 이해하기 아주 좋은 예가 있다.
MP3 음악플레이어
MP3 파일은 기본적으로 압축된 음성 데이터 파일이라 압축 해제가 필요한데, MP3 파일의 데이터 압축을 해제하면서 동시에 사운드카드를 통해 스피커로 음악을 올려보내주는 일을 하는 것이 멀티 쓰레드의 형태이다. 이해끝!

멀티쓰레드의 장담점
장점

  • CPU의 사용률을 향상
  • 자원을 보다 효율적으로 사용
  • 사용자에 대한 응답성이 향상
  • 작업이 분리되어 코드가 간결해짐
싱글쓰레드와 멀티쓰레드

카톡에서 채팅과 다운로드가 동시에 이루어 질 수 있는 이유는 바로 멀티쓰레드로 작성되어 있기 때문이다. 만일 싱글쓰레드로 작성되어 있다면 다운로드가 끝나기 전까지 채팅은 할 수 없을것이다.

그래서 사용자가 여럿인 서버 프로그램의 경우 멀티쓰레드로 작성하는 것이 필수적이어서 하나의 서버 프로세스가 여러 개의 쓰레드를 생성해서 쓰레드와 사용자의 요청이 일대일로 처리되도록 프로그래밍해야 한다. 만일 싱글쓰레드로 서버 프로그램을 작성한다면 사용자의 요청마다 매번 새로운 프로세스를 생성해야하는데 이것은 쓰레드를 생성하는 것보다 더 많은 시간과 메모리 공간을 소비하게된다.
그래서 쓰레드를 가벼운 프로세스, 경량 프로세스라고 부르기도 한다.

앞선 글만 읽는다면 무조건 멀티쓰레드만 사용하면 되겠네! 싶을거다. 근데 무엇이든 때와 장소를 봐야한다는 것을 알고있을거다. 작업 수행 시간으로 차이를 더 살펴보자
싱글, 하나의 쓰레드로 두개의 작업을 수행하는 경우 걸리는 시간과
멀티, 두 개의 쓰레드로 두 개의 작업을 수행하는 경우의 시간은 큰 차이가 없지만

엄밀히 따지면 두개의 쓰레드로 작업한 경우가 시간이 더 걸리게 된다. 그 이유는 쓰레드간의 작업전환(context switching)에 시간이 걸리기 때문이다.

작업 전환을 할 때는 현재 진행 중인 작업의 상태, 예를 들면 다음에 실행해야할 위치(PC, 프로그램 카운터) 등의 정보를 저장하고 읽어 오는 시간이 소요된다.

그래서 싱글 코어에서 단순히 CPU만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적이다.

또한 멀티쓰레드 프로세스는 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하며 작업하기 때문에 발생할 수 있는 동기화, 교착상태와 같은 문제들을 고려해서 신중히 프로그래밍해야한다.

참고문서-자바의 정석