프로세스와 스레드 정리

방지환·2024년 10월 6일

Java

목록 보기
10/20

- 프로세스와 스레드 개념

  • 프로세스

    • 운영체제로부터 자원을 할당받는 작업의 단위
    • 디스크로부터 메모리에 적재되어 운영체제로부터 주소 공간, 파일, 메모리 등을 할당받음
    • 함수의 매개변수, 복귀 주소, 로컬 변수와 같은 임시 자료를 저장하는 프로세스 스택과 전역 변수들을 저장하는 데이터 섹션, 프로셋 실행 중에 동적으로 할당되는 메모리인 을 포함
  • 프로세스 자원 구조

  • 코드 영역(Code / Text) : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다.

  • 데이터 영역(Data) : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다. 데이터영역은 .data ,.rodata, .bss 영역으로 세분화 된다.

    • .data : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장
    • .BSS : 초기값 없는 전역 변수, static 변수가 저장
    • .rodata : const같은 상수 키워드 선언 된 변수나 문자열 상수가 저장
  • 스택 영역(Stack) : 지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 stack 영역을 초과하면 stack overflow 에러가 발생한다.

  • 힙 영역(Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

  • Stack과 Heap 영역이 위아래로 화살표

    • 코드 영역과 데이터 영역은 선언할 때 크기가 결정(정적 영역)
    • 스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기 조절(동적 영역)
  • 스레드

  • 프로세스가 할당받은 자원을 이용하는 실행의 단위
  • 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 Heap, Data, Code 영역을 공유
  • 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여, 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 함.
  • 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 가지고 있음
  • 싱글스레드와 멀티스레드

  • 싱글 스레드

    • 하나의 프로세스에서 하나의 스레드 실행
    • 하나의 레지스터와 스택으로 표현
  • 싱글 스레드 장점

    • 자원 접근데 대한 동기화를 신경쓰지 않아도 된다.
      • 여러개의 스레드가 공유된 자원을 사용할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며, 이 작업은 프로그래머에게 많은 노력을 요구하고 많은 비용을 발생시킨다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.
    • 작업전환 작업을 요구하지 않는다.
      • 작업전환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.
  • 싱글 스레드 단점

    • 여러 개의 CPU를 활용하지 못한다.
      • 프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나, 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.
    • 두 개의 작업을 하나의 스레드로 처리하는 경우와, 두 개의 스레드로 처리하는 경우를 가정했을 때, 후자의 경우는 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행한다. 그래서 동시에 두 작업이 처리되는 것과 같이 느끼게 된다.
    • 두 개의 스레드로 작업한 시간이 싱글스레드로 작업한 시간보다 더 걸릴 수도 있는데, 그 이유는 스레드 간의 작업전환(context switching)에 시간이 걸리기 때문이다.
    • 단순히 CPU만을 사용하는 계산작업이라면, 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적이다.
  • 멀티 스레드

    • 프로그램을 다수의 실행 단위로 나누어 실행.
    • 프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화
    • 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
    • 각각의 스레드가 고유의 레지스터와 스택으로 표현됨.
  • 멀티 스레드의 장점

    • 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.
    • 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.
    • 프로세스의 작업전환보다 스레드의 작업전환이 더 빠르다.
  • 멀티 스레드의 단점

    • 하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있다.
    • 멀티 스레딩을 위해 운영체제의 지원이 필요하다.
    • 스레드 스케쥴링을 신경써야 한다.
  • Thread 클래스 상속 방식

    • Thread 클래스를 상속한 클래스 정의
    • run() 메소드를 오버라이드하여 스레드 코드 작성
    • 스레드 객체 생성하기
    • start() 메소드로 스레드 시작하기
    public class HelloWorld {
    	public static void main(String[] args) {
    		MyThread mt1 = new MyThread();		// 3.스레드 객체 생성
    		mt1.start();				// 4.스레드 실행
    	}
    }
    class MyThread extends Thread {			// 1.Thread 클래스 상속한 클래스 정의
    	public void run() {				// 2.run()메소드 오버라이드 및 스레드 코드 작성
    		System.out.println(this.getName());
    	}
    }
  • Runnable 인터페이스 구현 방식

    • Runnable 인터페이스를 구현하는 클래스 정의
    • run() 메소드를 오버라이드하여 스레드 코드 작성
    • Runnable 객체 생성하기
    • Thread 객체 생성하기
    • start() 메소드로 스레드 시작하기
    public class HelloWorld {
    	public static void main(String[] args) {
    		Runnable r1 = new MyThread();		// 3.Runnable 객체 생성
    		Thread t1 = new Thread(r1);		// 4.Thread 객체 생성
    		t1.start();				// 5.스레드 실행
    	}
    }
    class MyThread implements Runnable {		// 1.Runnable 인터페이스를 구현하는 클래스 정의
    	public void run() {				// 2.run()메소드 오버라이드 및 스레드 코드 작성
    		System.out.println(Thread.currentThread().getName());
    	}
    }

출처

0개의 댓글