본문 바로가기
Network

[Network] 프로세스와 스레드(단일 스레드, 멀티 스레드)

by 하부루 2024. 11. 24.

프로세스

  • 프로세스는 실행 중인 프로그램의 인스턴스이다.
  • 각 프로세스는 독립적인 메모리 공간을 갖고 있으며, 운영체제에서 별도의 작업 단위로 분리해서 관리된다.
  • 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않는다. 그리고 프로세스가 서로의 메모리에 직접 접근할 수 없다.
  • 만약 A 프로세스에서 진행중인 게임을 관리 하고있고, B 프로세스에서 유튜브 뮤직을 관리하고 있다면, A 프로세스에 문제가 발생해도 A 프로세스만 종료되고 B 프로세스에는 영향을 주지않는다.

 

프로세스의 메모리 구성

  • 코드 섹션 : 실행할 프로그램의 코드가 저장되는 영역
  • 데이터 섹션 : 전역 변수 및 정적 변수가 저장되는 영역
  • 힙 (Heap) : 동적으로 할당되는 메모리 영역
  • 스택 (Stack) : 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)

프로세스 예시

 

스레드(Thread)

  • 프로세스는 하나 이상의 스레드를 반드시 포함한다.
  • 스레드는 프로세스 내에서 실행되는 작업의 단위이고 한 프로세스에서 여러 스레드가 존재 가능하며, 프로세스가 제공하는 동일한 메모리 공간을 공유한다.

 

스레드의 메모리 구성

  • 공유 메모리 : 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
  • 개별 스택 : 각 스레드는 자신의 스택을 가지고 있다.

 

싱글 스레드와 멀티 스레드

  • 싱글 스레드
    • 하나의 작업 단위(스레드)가 순차적으로 실행되는 구조
    • 한 번에 하나의 작업만 처리하며, 다음 작업은 이전 작업이 완료된 후 실행
  • 멀티 스레드
    • 여러 개의 작업 단위(스레드)가 동시에 실행되는 구조
    • 여러 작업을 병렬적으로 처리하여 효율성을 높일 수 있다.

 

단일, 멀티 스레드 차이점

 

싱글 스레드와 멀티 스레드 예제

public class SingleThreadExample {
    public static void main(String[] args) {
        System.out.println("싱글 스레드 시작");

        // 첫 번째 작업
        printNumbers("Task 1");

        // 두 번째 작업
        printNumbers("Task 2");

        System.out.println("싱글 스레드 종료");
    }

    public static void printNumbers(String taskName) {
        for (int i = 1; i <= 5; i++) {
            System.out.println(taskName + " - " + i);
            try {
                Thread.sleep(500); // 0.5초 대기
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

== 결과 ==
싱글 스레드 시작
Task 1 - 1
Task 1 - 2
Task 1 - 3
Task 1 - 4
Task 1 - 5
Task 2 - 1
Task 2 - 2
Task 2 - 3
Task 2 - 4
Task 2 - 5
싱글 스레드 종료
public class MultiThreadExample {
    public static void main(String[] args) {
        System.out.println("멀티 스레드 시작");

        // 첫 번째 작업 스레드 생성
        Thread task1 = new Thread(() -> printNumbers("Task 1"));

        // 두 번째 작업 스레드 생성
        Thread task2 = new Thread(() -> printNumbers("Task 2"));

        // 두 작업을 동시에 실행
        task1.start();
        task2.start();

        System.out.println("멀티 스레드 종료 (메인 스레드 종료)");
    }

    public static void printNumbers(String taskName) {
        for (int i = 1; i <= 5; i++) {
            System.out.println(taskName + " - " + i);
            try {
                Thread.sleep(500); // 0.5초 대기
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

== 결과 ==
멀티 스레드 시작
Task 1 - 1
Task 2 - 1
Task 1 - 2
Task 2 - 2
Task 1 - 3
Task 2 - 3
Task 1 - 4
Task 2 - 4
Task 1 - 5
Task 2 - 5
멀티 스레드 종료 (메인 스레드 종료)