Java/Thread

Thread (1) - 운영체제 관점에서의 멀티 스레드

수수한개발자 2023. 11. 7.
728x90

운영체제 관점에서의 스레드는 프로세스 위에서 동작하는 task(일)라고 생각할 수 있습니다.

즉 자바 애플리케이션(프로세스)에서 실행되는 코드, 동작하는 일을 스레드라고 할 수 있습니다.

 

public class Main {
	public void main(String[] args) {
    	System.out.println("Hello World!");
    }
}

 

 위의 메인 메인 메서드를 실행 시키면 우리는 Hello Wrold라는 출력문을 볼 수 있습니다.

이것은 메인 쓰레드가 위의 코드를 실행시키면서 출력된 것입니다.

 

이렇게 단일 스레드로도 충분히 애플리케이션을 실행시킬 수 있는데 멀티 스레드는 왜 사용할까요?

 

멀티 스레드의 사용 이유

멀티스레드의 사용이유에는  크게 두 가지를 생각할 수 있습니다.

  • 병행성
  • 성능

상품 구매하는 애플리케이션이 있다고 예를 들어보겠습니다.

 

 

Thread (1) - 운영체제 관점에서의 멀티 스레드 - 멀티 스레드의 사용 이유

 

 

빨간색 1번 유저가 상품 구입을 하고 결제를 기다리고 있습니다.

이때 파란색 2번 유저가 상품 구입을 하려고 하면 어떻게 될까요?

스레드는 하나의 일만 처리할 수 있기 때문에 2번 유저는 1번 유저의 처리가 끝날 때까지 무한정 대기를 하게 됩니다.

이러한 문제점을 해결하기 위해 멀티스레드를 활용하게 됩니다.

멀티 스레드를 사용하게 되면 1번 유저와 2번 유저의 일을 각각의 스레드가 처리하게 되면서 동시에 실행되는 것처럼 착각하게 됩니다.

이런 멀티 태스킹을 병행성이라고 합니다.

이런 병행성은 CPU하나만으로도 가능하기 때문에 만약 코어가 여러 개라면 여러 개의 작업을 완전히 병행할 수 있습니다.

 

 

자바에서의 스레드를 살펴보기 전에 이 스레드라는 게 어떻게 돌아가는지 알아보겠습니다.

우리는 애플리케이션을 실행시키면 운영체제는 디스크에서 메모리로 로드됩니다.

 

 

Thread (1) - 운영체제 관점에서의 멀티 스레드 - 멀티 스레드의 사용 이유

 

기본적으로 우리의 디스크(보조 기억장치)에는 크롬, 자바 코드 등 많은 것들이 저장되어 있습니다.

이때 우리가 자바 애플리케이션을 실행하면 운영체제는 디스크에 있던 프로그램을 메모리로 가져와 프로그램의 인스턴스를 생성해 줍니다.

이 인스턴스를 '프로세스', '애플리케이션 콘텍스트'라고 합니다.

각 프로세스는 시스템에서 실행되는 다른 프로세스와 완전 별개로 실행됩니다.

 

프로세스

Thread (1) - 운영체제 관점에서의 멀티 스레드 - 멀티 스레드의 사용 이유 - 프로세스

 

 

PID : 프로세스 ID는 애플리케이션이 읽고 쓰기 위해 여는 파일

Code : 코드는 CPU에서 실행되는 프로그램의 명령어

Data(Heap) : 힙에는 애플리케이션에서 필요한 데이터들이 들어있다.

Main Thread : 우리가 실행한 스레드

Stack : 각 스레드의 메모리 영역, 지역 변수가 저장되고 실행되는 영역이다.

Instruction Pointer : 스레드가 실행할 다음 명령어의 주소를 가리키는 역할을 한다.

 

context switch

CPU가 하나일 때 여러 개의 스레드 중에서 어떤 스레드를 사용할 것인지를 결정하고 실행시키는 장치이다.

결국 멀티스레드의 성능이 좋은 이유는 다른 프로세스에 있는 스레드끼리 콘텍스트 스위치가 일어나는 경우보다

같은 프로세스의 쓰레드끼리 컨텍스트 스위칭이 일어나는 것이 훨씬 효율적이기 때문이다. 

이 이유는 같은 프로세스 내에서는 공유자원이 많기 때문에 그만큼 비용이 적게 든다.

 

728x90

댓글