본문 바로가기

BackEnd/구 생활코딩 자바

프로세스(process)와 스레드(thread)

반응형


1. 프로세스(process)란?

프로세스(process)란 간단히 말해서 ‘실행 중인 프로그램(program)’이다. 


프로그램을 실 행하면 0S로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다.


즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.


프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되


어 있다.


2. 스레드(thread)란?

스레드(thread)란 프로세스(process) 내에서 자원을 이용해서 실제로 작업을 수행하는 주체를 의미


다. 즉, 하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위를 말한다.


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


 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.


또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.




3. 멀티태스킹과 멀티쓰레딩


현재 우리가 사용하고 있는 윈도우나 유닉스를 포함한 대부분의 0S는 멀티태스킹(multitasking,


다중작업)을 지원하기 때문에 여러 개의 프로세스가 동시에 실행될 수 있다.


이와 마찬가지로 멀티쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수


행하는 것이다.


CPU의 코어(core)가 한 번에 단 하나의 작업만 수행할 수 있으므로, 실제로 동시에 처리되는 작


업의 개수는 코어의 개수와 일치한다. 그러나 그림 13-1 에서 알수 있듯이 처리해야하는 쓰레드


의 수는 코어의 개수보다 훨씬 많기 때문에 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 


가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보이게 한다.


그래서 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니며,하나의 쓰레


드를 가진 프로세스 보다 두 개의 쓰레드를 가진 프로세스가 오히려 더 낮은 성능을 보일


수도 있다.


4. 스레드의 생성과 실행


자바에서 스레드를 생성하는 방법에는 다음과 같이 두 가지 방법이 있다.

 

4-1) Runnable 인터페이스를 구현하는 방법

4-2) Thread 클래스를 상속받는 방법

 

두 방법 모두 스레드를 통해 작업하고 싶은 내용을 run() 메소드에 작성하면 된다.


5. 간단한 구현


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
32
33
34
35
36
import java.util.Random;

public class ThreadTest extends Thread {
 
    private int id = -1;
 
    public ThreadTest(int id){
        this.id = id;
    }
 
    public void run(){
 
        System.out.println( id + "번 쓰레드 동작 중..." );
        Random r = new Random(System.currentTimeMillis());
        try {
            long s = r.nextInt(3000);
            Thread.sleep(s); // 쓰레드를 잠시 멈춤
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println( id + "번 쓰레드 동작 종료..." );
    }
    
    public static void main(String[] args) {
        
        System.out.println("Start main method.");
        
        for(int i = 0 ; i < 10 ; i++ ){
            ThreadTest test = new ThreadTest(i);
            test.start(); // 이 메소드를 실행하면 Thread 내의 run()을 수행한다.
        }
        
        System.out.println("End main method.");
    }
}
cs


5-1) 결과


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Start main method.
2번 쓰레드 동작 중...
1번 쓰레드 동작 중...
0번 쓰레드 동작 중...
3번 쓰레드 동작 중...
End main method.
6번 쓰레드 동작 중...
4번 쓰레드 동작 중...
5번 쓰레드 동작 중...
7번 쓰레드 동작 중...
8번 쓰레드 동작 중...
9번 쓰레드 동작 중...
9번 쓰레드 동작 종료...
6번 쓰레드 동작 종료...
7번 쓰레드 동작 종료...
5번 쓰레드 동작 종료...
0번 쓰레드 동작 종료...
1번 쓰레드 동작 종료...
3번 쓰레드 동작 종료...
2번 쓰레드 동작 종료...
4번 쓰레드 동작 종료...
8번 쓰레드 동작 종료...
cs


참고사이트 : http://tcpschool.com/java/java_thread_concept , 자바의정석


반응형