프로세스와 스레드

Jeong Gyejin·2023년 3월 13일
0

JAVA

목록 보기
13/18

프로세스

실행 중인 프로그램을 의미하며, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행중인 것을 이야기합니다. 이 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원, 그리고 스레드로 구성되어 있습니다.

스레드란?

프로세스내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다. 또한, 두개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 합니다.

스레드의 생성과 실행

스레드의 생성과 실행
자바에서 스레드를 생성하는 방법에는 다음과 같이 두 가지 방법이 있습니다.

  1. Runnable 인터페이스를 구현하는 방법
lass ThreadWithClass extends Thread {

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(getName()); // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10);          // 0.01초간 스레드를 멈춤.

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}
  1. Thread 클래스를 상속받는 방법
class ThreadWithRunnable implements Runnable {

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(Thread.currentThread().getName()); // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

두 방법 모두 스레드를 통해 작업하고 싶은 내용을 run() 메소드에 작성하면 됩니다.

스레드의 우선순위

스레드는 우선순위에 관한 자신만의 필드가 있으며, 이런 우선순위에 따라서 특정 스레드가 더 많은 시간동안 작업을 할 수 있도록 설정할 수 있습니다.
getPriority()와 setPriority()를 이용해서 스레드의 우선순위를 반환하거나 변경할 수 있습니다.(1~10까지의 숫자를 가질 수 있음)
다만 스레드의 우선순위는 비례값이 아닌 상대적인 값을 나타냅니다.

스레드의 동기화

두 개 이상의 스레드가 공유 데이터에 동시에 접근하게 되면 예상과 벗어난 결과가 나타날 수 있기 때문에 이런 문제를 해결하기 위한 것이 스레드의 동기화입니다.

  • 임계영역과 락권한:
    • 임계영역: 둘 이상의 스레드가 동시에 접근해서는 안되는 코드의 영역을 뜻합니다. 즉 하나의 스레드만이 코드를 실행할 수 있는 영역을 이야기합니다.
    • 락 권한: 임계영역을 포함하고 있는 객체에 접근할 수 있는 권한을 의미합니다.
  • synchronized 키워드를 통해 동시 접근이 가능한 영역을 임계 영역으로 설정하여 동시 접근을 못하도록 설정을 합니다.
  • 스레드가 임계영역에 접근하게 되면 해당 스레드는 Lock권한을 얻게되며 Lock을 반납하기 이전에는 다른 스레드는 해당 임계 영역에 접근을 할 수 없습니다.

스레드의 동기화를 막기 위해서는 메서드 전체를 임계 영역으로 설정하거나 특정 영역을 임계영역으로 설정해야합니다.

스레드의 제어

스레드의 제어는 아래의 메서드를 이용해서 상태를 정리할 수 있습니다.

프로세스와 스레드의 차이

다른점프로세스스레드
정의메모리를 할당 받아 실행되는 컴퓨터 프로그램의 작업 단위프로세스가 할당 받은 자원을 이용하는 실행 단위 (즉, 1개의 프로세스는 1개 이상의 스레드를 가짐)
시스템 자원운영체제로부터 고유한 메모리 영역을 할당 받음스레드는 각각 stack만 따로 할당 받고, 프로세스 내의 주소 공간과 자원을 공유함
통신다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야함으로 덜 효율적임- 같은 프로세스 안에 있는 스레드들은 자원을 공유하기 때문에 한 스레드가 자원을 변경하면 다른 스레드(sibling thread)도 그 변경 결과를 즉시 알 수 있기 때문에 더 효율적임
처리 시간context switching 시간, 생성/종료하는데 시간이 더 걸림.context switching 시간과, 생성/종료하는데 시간이 덜 걸림.
System Call(process 변환은 OS의 인터페이스 사용)Library Call(thread 전환 시 OS 호출 없이 커널에 interrupt 발생)
중단 시다른 프로세스와는 독립적이기 때문에 중단 돼도 다른 프로세스 수행에 영향 미치지 않음 eg) Chromeuser-level thread가 중단되면 모든 다른 user-level thread가 중단됨 eg) Internet Explorer

멀티 프로세스 대신에 멀티 스레드를 사용하는 이유는?

멀티 프로세스란?

하나의 응용 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것을 의미합니다. ex) 크롬, 사파리

멀티 스레딩이란?

하나의 응용 프로그램을 여러개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하는 것을 의미합니다. ex) 아파치 톰캣

프로그램을 여러 개 실행시키는 것 보다는 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더 낫기 때문입니다.

멀티 스레드를 사용할 때의 장점
1. 운영체제가 시스템 자원을 효율적으로 관리를 할 수 있다.

  • 프로세스를 생성하고 시스템 자원을 할당하는 시스템 콜이 줄어들어서 자원을 효율적으로 관리할 수 있습니다.
  • 스레드는 프로세스 내의 메모리를 공유하기 때문에 여러 프로세스를 운영하는 것과는 달리 시스템 자원의 소모가 줄어듭니다.
  1. 통신 비용 감소 및 응답 시간의 단축
  • 스레드는 Stack 영역 이외의 프로세스의 자원을 공유하기 때문에 프로세스간 통신보다 비용이 적게 듭니다.
  • Context Switching 시 스레드는 Stack 영역에 대한 PCB 상태 처리를 하기 때문에 프로세스간의 전환속도보다 빠릅니다.

그렇다면 멀티 스레드가 무조건 좋을까?

  • 스레드를 활용하면 자원의 효율성이 증가하기도 하지만, 스레드 간의 자원공유는 전역 변수를 이용하므로 동기화 문제가 발생할 수 있기에 프로그래머의 주의가 필요합니다.
  • 또한, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화의 문제가 있을 수 있습니다.

Context switching 이란?

프로세스에게 CPU를 할당해 작업을 수행하는 과정을 의미합니다. 한번에 하나의 프로세스만 처리할 수 있는 CPU에게 여러 프로세스가 순차적으로 처리될 수 있도록 현재 진행중인 작업을 저장하고 다음에 진행될 작업의 상태값을 PCB로부터 읽고 CPU를 적재하는 과정을 이야기합니다.

PCB란?

특정 프로세스에 대한 정보를 저장하고 있는 커널 내의 자료구조를 의미합니다.

profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글