본문 바로가기
공부/JAVA

[Thread] Thread

by 밍미 2018. 6. 11.

Thread

 

Process와 Thread

프로세스는 운영체제에서 실행되고 있는 하나의 프로그램을 말한다. 이 프로세스는 반드시 하나 이상의 스레드를 포함하게 되는데, 이 스레드는 프로세스 내에서 실행되는 독립적인 실행 흐름의 단위라고 할 수 있다. 즉, 경량화 된 프로세스라고 보면 된다. 프로세스에서 실질적인 일 처리는 이 스레드가 담당하게 된다.

프로세스는 완전히 독립적인 단위이므로 메모리 영역을 다른 프로세스와 공유하지 않는다. 하지만 스레드는 해당 스레드를 위한 스택메모리를 생성할 뿐 그 외 메모리 영역은 공유한다. 이 때문에 멀티 프로세싱 하던 일을 스레드로 구현하면 메모리 공간과 자원을 절약할 수 있다.

스레드를 활용해서 프로세스를 수행했을 때, 시스템 단위시간 당 데이터 처리량이 향상된다. 따라서 프로그램 응답시간도 단축되며, 스레드끼리 메모리 영역을 공유하기 때문에 시스템 자원 소모도 적다.

하지만 단일프로세서 시스템에서는 딱히 큰 효과를 기대하기 어려우며, 디버깅도 어려워진다. 또한 교착상태에 빠질 수 있기 때문에 동기화 문제도 해결해주어야 한다.

 

 

main()

모든 자바 프로그램은 실행 시 메인 스레드가 생성되고, 메인 메소드를 실행하면서 메인 스레드가 시작된다. 메인 메소드에 작성된 코드의 첫 줄부터 순차적으로 실행되며, 마지막 코드를 실행하거나 return문을 만나게되면 실행이 종료된다.

싱글스레드의 경우 메인스레드가 종료되면 프로세스도 종료되지만, 멀티스레드의 경우 메인스레드가 종료되어도 다른 스레드가 실행중이면 프로세스는 종료되지 않는다.

 

 

Multi Tasking

멀티태스킹은 두가지 이상의 작업을 동시에 처리하는 것을 말한다.

 

  • Multi Process

    • 독립적으로 처리해야 할 작업의 개수만큼 프로세스를 만들고, 이 여러개의 프로세스들이 하나의 작업을 수행한다.
    • 각각의 프로세스는 서로 독립되어 있어 서로의 내부 메모리 및 자원에 접근할 수 없다.
    • 서로 데이터를 주고 받기 위해서는 OS의 도움이 필요하다.
  • Multi thread

    • CPU를 일정 시간으로 쪼개서 동시에 여러 연산을 할 수 있도록 하는 기법이다.
    • 여러 스레드로 나누어져 있지만 하나의 프로세스로 취급한다.
    • 프로세스를 수행할 때 반드시 main thread를 생성해야 하므로 프로세스는 하나 이상의 스레드를 가지게 된다.
    • 대용량의 데이터를 처리할 때, 많은 시간이 필요한 작업을 수행할 때 그리고 네트워크를 통해 데이터를 주고받을 때 모든 작업을 모두 완료한 후에 화면의 UI를 동작시키면, 그 긴 수행시간동안 화면이 멈춰있게 되어 사용자들이 오류라고 생각하게 할 수 있다. 그래서 데이터를 읽어오는 스레드, 데이터를 전송하는 스레드와 화면에 출력하는 스레드 등으로 나누어서 CPU시간을 적당히 쪼개어 동시에 수행되도록 한다.

 

 

멀티 스레드를 사용하는 이유

멀티 프로세스로도 작업을 수행할 수 있지만 멀티 스레드를 사용하는 이유는, 시스템 작업을 효율적으로 관리할 수 있기 때문이다.

멀티 프로세스는 완전히 독립된 여러개의 프로그램을 실행하기 위해 문맥교환(Context Switch, 프로세스 종료 전 상태정보를 저장하고 프로세스를 시작할 때 상태정보를 복원하는 과정)을 하게 되는데, 이로 인해 성능저하가 생기게 된다. 하지만 스레드는 프로세스처럼 완전히 독립적이지 않고 서로 몇몇 요소들을 공유하기 때문에 문맥교환에 더 적은 시간이 소요된다. 이렇게 프로세스 간 통신에 비해 통신비용이 적기 때문에 스레드를 사용할 경우 작업 간 통신부담이 줄게 된다.

 

 

멀티스레드 실행 방식

  • 동시성(Concurrency)

    • 동시에 실행되는 것처럼 보이게 한다.
    • 싱글코어에서 멀티스레드를 동작시키기 위한 방식
    • 멀티코어에서도 사용 가능
    • 여러개의 스레드를 빠르게 번갈아 실행시켜 동시에 일어나는 것처럼 보이게 하는 것이다.
    • 문맥교환이 일어난다.
  • 병렬성(Parallelism)

    • 실제로 작업이 동시에 실행된다.
    • 멀티코어에서 멀티스레드를 동작시키기 위한 방식
    • 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행된다.

 

 

Scheduling

스레드의 개수가 코어의 수보다 많을 경우, 동시성으로 작업을 수행하게 된다. 이 때 어떤 순서에 의해서 스레드를 동작시킬 것인지 결정하는 것을 스케줄링이라고 한다.

 

  • 우선순위 방식(Priority)

    • 스레드에 우선순위를 부여해서 우선순위가 높은 스레드가 실행상태를 더 많이 가지도록 한다.
    • 사용자 임의로 코드를 통해 우선순위를 지정할 수 있다.
  • 순환할당방식(Round-Robin)

    • 시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행한다.
    • 자바 가상기계(JVM)에 의해 정해지기 때문에 코드로 제어할 수 없다.

 

 

Thread pool

스레드풀은 스레드를 제한된 개수만큼 미리 만들어 놓고, 작업 큐에 들어오는 작업을 미리 만들어 놓은 스레드들이 하나 씩 맡아서 처리하게 한다.

 

  • 장점

    • 스레드 생성 및 수거에 드는 비용을 줄여 프로그램 성능 저하를 방지한다.
    • 다수의 사용자의 요청을 빠르게 대처할 수 있다.
  • 단점

    • 미리 스레드를 많이 만들어두기 때문에 메모리 낭비가 될 수 있다.
    • 각 작업들의 소요시간이 다른 경우 스레드 유휴시간이 생길 수 있다.

'공부 > JAVA' 카테고리의 다른 글

[디자인패턴] 싱글톤(Singleton)  (0) 2018.11.19
[Thread] 동기화와 교착상태  (0) 2018.06.11
[자료구조] 비선형구조  (0) 2018.06.08
[자료구조] 선형구조  (0) 2018.06.05
정규표현식(정규식, 표현식)  (0) 2018.06.05

댓글