mojo's Blog
Multitasking 본문
Multitasking
Multitasking = multi + tasking 의 합성어로 다수의 작업을 동시에 처리하는 것을 말한다.
간단한 응용프로그램은 보통 하나의 작업(task)만 하는 경우가 대부분이지만, 큰 규모의 응용프로그램은 많은 경우 여러 작업(task)를 동시에 실행한다.
멀티태스크(Multitask) 응용프로그램을 작성하기 위한 스레드(thread) 개념을 알아보도록 한다.
thread란 thread of control의 준말로서 프로그램 코드를 실행하는 하나의 실 혹은 제어의 개념이다. 하나의 실로 하나의 바느질밖에 할 수 없듯이, 하나의 스레드로 하나의 작업밖에 처리할 수 없다.
구체적으로 스레드는 운영체제, JVM에서 작업(task)를 실행하는 단위로서, 운영체제나 JVM에 의해 관리되는 단위이다.
Multi-Processing, Multi-Threading
컴퓨터 기술의 발전과 함께 멀티태스킹을 실현하기 위해 2가지 방법이 사용된다.
1. Multi-Processing : 하나의 응용프로그램을 여러 개의 프로세스(process)로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 기법이다.
각 프로세스는 고유한 메모리 영역을 보유하고 독립적으로 실행된다. 그러므로 하나의 응용프로그램에 속한 프로세스들은 변수를 공유할 수 없기 때문에, 프로세스들 사이의 통신(IPC, Inter Process Communication)이 어렵고 한다해도 오버헤드가 크다.
또한 프로세스 사이의 문맥 교환(Context switch)에 따른 과도한 작업량과 시간 소모의 문제점이 있다.
2. Multi-Threading : 멀티 프로세싱의 문제점을 개선하기 위해 제안된 방법이다.
멀티스레딩은 하나의 응용프로그램을 동시처리가 가능한 여러 작업(코드)으로 분할하고 작업의 개수만큼 스레드를 생성하여 각 스레드로 하여금 하나의 작업을 처리하도록 하는 기법이다.
모든 스레드는 응용프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 작고, 스레드 사이의 문맥 교환 시 소요되는 작업량이 작아 문맥 교환이 빠른 장점이 있다.
윈도우, 리눅스 등 많은 운영체제들이 멀티프로세싱을 지원하고 있지만 멀티스레딩을 기본으로 하고 있다.
멀티스레딩 활용분야
Web Server Software를 대표적인 멀티스레드 응용프로그램이라고 할 수 있다.
네트워크 클라이언트로부터 웹 검색 요청이 전달되면 웹 서버 스레드는 클라이언트를 전담하는 웹 서비스 스레드를 생성하여 검색을 하고 결과를 클라이언트로 전송하도록 한다.
그러므로 동시에 100명의 클라이언트가 접속하면 100개의 웹 서비스 스레드가 각각 자신의 웹 클라이언트의 요청을 서비스한다.
만일 웹 서버 소프트웨어를 싱글스레드(Single thread)로 구현한다면 웹 서버가 한 번에 한 클라이언트씩 순차적으로 서비스하게 되므로 뒤에 접속한 클라이언트는 많은 시간을 기다려야만 한다.
멀티스레딩은 응용프로그램이 다수의 스레드를 가지고 다수의 작업을 동시에 처리함으로써, 한 스레드가 대기하는 동안 다른 스레드를 실행하여 시간 지연을 줄이고 자원의 비효율적 사용을 개선한다.
멀티스레드와 자바 가상 기계(JVM)
자바에는 프로세스가 존재하지 않고 스레드 개념만 존재하며, JVM은 멀티스레딩만 지원한다.
자바 스레드(Java thread)는 JVM에 의해 스케쥴되는 실행 단위 코드 블록이다.
하나의 JVM은 하나의 자바 응용프로그램만 실행한다. 사용자가 자바 응용프로그램을 실행시키면, JVM이 먼저 실행되고 JVM이 자바 응용프로그램을 로딩하여 실행시킨다.
자바 응용프로그램이 종료되면 JVM도 함께 종료된다.
만일 한 컴퓨터에서 n개의 자바 응용프로그램이 실행된다고 하면 n개의 JVM이 실행되고 있는 것이다.
각 자바 응용프로그램은 별개의 메모리 영역에서 독립적으로 실행된다.
JVM은 멀티스레딩을 제공하며 자바 응용프로그램은 하나 이상의 스레드를 생성할 수 있다.
(1) JVM은 한 개의 응용 프로그램만 실행 가능
(2) JVM은 여러 개의 응용 프로그램 실행 불가
(3) 하나의 응용프로그램이 여러 개의 스레드를 가질 수 있음
2개 이상의 자바 응용프로그램을 실행하고자 하는 경우 2개의 자바 응용프로그램이 각각 JVM에 의해 실행이 되며, 서로 정보를 주고받고자 하는 경우 소켓 통신과 같은 통신 방법을 이용한다.
자바 스레드, JVM
스레드 코드를 실행시키고, 잠깐 중단시키기도 하는 등 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다.
스레드가 몇 개 존재하는지, 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지, 스레드의 상태는 무엇인지, 스레드의 우선 순위는 얼마인지 등 많은 정보 역시 JVM이 관리한다.
개발자의 임무는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에게 요청하는 일뿐이다. 스레드를 관리하는 일은 모두 JVM의 일이다.
'Java' 카테고리의 다른 글
스레드 정보 출력 / 타이머 스레드 강제 종료 / flag를 이용한 스레드 종료 (0) | 2021.08.09 |
---|---|
스레드 만들어보기 (0) | 2021.08.08 |
명품 JAVA Programming 제 12장 실습문제 (3~4 제외) (0) | 2021.08.04 |
명품 JAVA Programming 제 12장 Open Challenge (0) | 2021.08.04 |
마우스를 이용하여 선 그리기 (0) | 2021.08.04 |