스레드 (Thread)

yeoro·2021년 6월 29일
0
post-thumbnail
post-custom-banner

📚 정의

스레드는 한 프로세스 내에서 실행되는 여러 흐름의 단위이며, 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

기본적으로 하나의 프로세스가 생성되면 하나의 메인 스레드가 같이 생성되며, 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행된다.


📚 멀티 스레드 (Multi Thread)

하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다.

하나의 프로세스에서 병렬 실행을 하고, 동일한 환경에서 서로 다른 일을 동시에 처리하기 위해 멀티 스레드를 사용한다. (웹 브라우저의 렌더링)

각 스레드는 프로세스 내에서 Stack만 따로 할당받고 같은 프로세스에 속한 다른 스레드와 Code, Data, Heap 등 운영체제 자원을 공유한다.

Stack을 독립적으로 할당하는 이유?

Stack은 함수 호출시 전달되는 인자, 되돌아갈 주소값 및 함수에 선언하는 변수 등을 저장하기 위해 사용하는 공간이다. 이러한 stack을 스레드끼리 공유한다면, 스레드가 섞여있는 순서대로 호출되기 때문에 복잡해진다.
따라서 원활한 실행을 위해 스레드별로 stack을 따로 할당받아 독립적으로 실행하게 한다.

한 스레드가 프로세스 자원을 변경하면, 이웃 스레드(Sibling Thread)도 변경 결과를 즉시 볼 수 있다.

멀티 스레드의 메모리 구조




❓ 스레드를 사용하는 이유

시스템 자원 소모 감소 (자원의 효율성 증대)

프로세스를 생성하려면 메모리 공간, 프로그램 코드 등 실행 환경을 구축해야 하지만, 스레드를 생성하는 데는 환경을 구축할 필요가 없기 때문에 오버헤드가 적다.

따라서, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있기 때문에 멀티 프로세스보다 적은 메모리 공간을 차지한다.

응답 시간 단축

스레드는 프로세스 내의 stack 영역을 제외한 모든 메모리를 공유하기 때문에 IPC 통신이 필요하지 않아 부담이 적다.


스레드끼리 공유하는 자원에 우리가 흔히 알고 있는 스레드가 공유하는 변수도 포함되어있는지?

📚 구현 예제 (Java)

Beep 소리와 글자 동시 출력

BeepThread.java

import java.awt.Toolkit;

public class BeepThread extends Thread{

	@Override
	public void run() {
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		
		for(int i = 0; i < 5; i++) {
			toolkit.beep();
			
			try {
				Thread.sleep(500);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

BeepPrint.java

public class BeepPrint {
	public static void main(String[] args) {
		Thread beepThread = new BeepThread();
		
        	// 익명 클래스
		Thread anonymousThread = new Thread() {

			@Override
			public void run() {
				for(int i = 0; i < 5; i++) {
					System.out.println("beep");
					
					try {
						Thread.sleep(500);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		};
		
		beepThread.start();
		anonymousThread.start();
	}
}

[참고]

post-custom-banner

0개의 댓글