ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스(Process)와 쓰레드(Thread), 멀티쓰레드(Multi-Thread)
    Web Programming 2020. 9. 17. 16:46
    반응형

     

    쓰레드(Thread)에 공부하기 위해서는 먼저 프로세스(Process)에 대한 이해가 필요하다.

    Process와 Thread는 모두 프로그램 실행의 한 단위를 의미하지만 개념은 다르다.

     

    프로세스(Process) : 운영체제에 의해 메모리 공간을 할당받아 실행 중인 프로그램
    쓰레드(Thread) : 컴퓨터 실행 흐름의 최소 단위

     

    원래 프로그램을 실행하는 흐름은 Process가 유일했다. 하지만 소프트웨어가 복잡해지며 하나의 프로그램에서 동시 작업이 요구되는 상황이 발생하고 이를 해결하기 위해 등장하는 것이 쓰레드다. Process는 타 프로세스와의 데이터 공유가 힘들기 때문에 동시 작업에서는 많은 비효율성을 갖는다. Thread의 경우, 한 Process 내부를 여러 Thread로 나눠 데이터 영역을 공유하며 동시 작업이 가능하기 때문에 동시 작업에서는 매우 효율적이다. 두 개 이상의 Thread를 가지는 프Process멀티쓰레드 프로세스(Multi-Threaded Process)라고 한다. 

     

    다음과 같은 Process의 구조도가 있다. 이 Process는 두개의 Thread로 구성된다. 여기서 Thread에 대한 특징이 정확하게 나타난다.

     

    각 Thread는 각각의 Stack을 갖고 있고 Code, Data, Heap은 공유한다.

    Stack과 Heap은 조금 생소한 개념일 수 있으니 한번 정리하고 넘어가자.

     

    Stack(스택) : 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하는 공간

    Heap(힙) : 사용자가 인위적으로 할당하고 해제할 수 있는 유동적인 메모리 영역

     

     

    멀티쓰레드 프로세스의 장점

    • 생성 및 스위칭이 빠르다.
    • Process와 달리 Thread 간 데이터 공유가 가능하다.
    • 데이터 교환에서 특별한 기법이 필요없다.

    멀티쓰레드 프로세스의 단점

    • 동일한 자원에 대한 동시 접근을 신경써야한다.
    • 동기화 작업을 통한 작업 처리 순서 컨트롤이 필요하다.
    • 병목 현상으로 인해 성능이 저하될 수 있다.

     

    예제

    Java를 활용해 Thread를 직접 구현해보고 그 구조를 이해해보자.

     

    하나의 클래스가 실행될 때 이는 하나의 Process가 된다.

    따라서 내부에서 동작하는 Main Method 역시 하나의 Thread로 동작한다.

    우리는 여기에 또 하나의 Thread를 추가하여 Multi Thread Process를 구현해보려한다.

     

    class MyThread extends Thread{
    
    	@Override
    	public void run() {
    		System.out.println("-------------------------------------");
    		System.out.println("MyThread Start.");
    		System.out.println("-------------------------------------");
    		for(int i = 1; i <= 10; i++) {
    			System.out.println("MyThread ing...");
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    		System.out.println("-------------------------------------");
    		System.out.println("MyThread End.");
    		System.out.println("-------------------------------------");
    	}
    }

    다음과 같이 Thread를 상속받는 MyThread를 만들었다. Thread.sleep(100)을 통해 출력에 0.1초의 딜레이를 주고 출력이 마무리 될 경우 End Message가 출력이 되는 구조다.

     

    public class Threading {
    	public static void main(String[] args) {
    		Thread t = new MyThread();
    		t.start();
    		System.out.println("-------------------------------------");
    		System.out.println("MainThread Start.");
    		System.out.println("-------------------------------------");
    		for (int i = 1; i < 10; i++) {
    			System.out.println("MainThread ing...");
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		System.out.println("-------------------------------------");
    		System.out.println("MainThread End");
    		System.out.println("-------------------------------------");
    	}
    
    }

    메인 클래스에서 MyThread를 객체로 받아오고 start 메소드를 사용해 MyThread를 실행해준다. 이후 Main Method 내부에도 0.1초의 딜레이를 가지는 출력을 만든다. 위와 같이 작성하고 이제 Main Method를 실행하자.

     

    -------------------------------------
    MainThread Start.
    -------------------------------------
    MyThread Start.
    -------------------------------------
    MyThread ing...
    -------------------------------------
    MainThread ing...
    MyThread ing...
    MainThread ing...
    MainThread ing...
    MyThread ing...
    MyThread ing...
    MainThread ing...
    MainThread ing...
    MyThread ing...
    MyThread ing...
    MainThread ing...
    MyThread ing...
    MainThread ing...
    MyThread ing...
    MainThread ing...
    MyThread ing...
    MainThread ing...
    MyThread ing...
    -------------------------------------
    MainThread End
    -------------------------------------
    -------------------------------------
    MyThread End.
    -------------------------------------

    출력 결과를 보면 MyThread와 MainThread가 뒤죽박죽 출력된 것을 확인할 수 있다.

    하지만 각 Thread 간에 영향을 주지는 않고 출력이 된다.

     

    반응형

    'Web Programming' 카테고리의 다른 글

    정규표현식  (0) 2020.10.27
    http와 https의 차이  (0) 2020.09.25
    3 Way-Handshake 란?  (0) 2020.09.16
    JSTL(JSP Standard Tag Library) 정리  (0) 2020.09.15
    컴포넌트(Component)와 모듈(Module)  (0) 2020.09.11
Designed by Tistory.