article thumbnail image
Published 2022. 10. 21. 11:44

- 프로세스 (Process)

운영체제에서 실행 중인 하나의 애플리케이션을 의미.

애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행한다.

 

 

- 스레드

하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 스레드가 2개라면 2개의 코드 실행 흐름이 생긴다는 의미이다.

하나의 프로세스 내부에서 독립적으로 실행되는 작업 단위이다.

운영체제에 의해 관리되는 하나의 작업 혹은 task를 의미한다.

다중 스레드 작업시에는 각 스레드끼리 정보를 주고받을 수 있어 처리 과정의 오류를 줄일 수 있다.

 

 

✔ 멀티 태스킹 (multi tasking)

두 가지 이상의 작업을 동시에 처리하는 것을 의미한다.

운영체제는 멀티 태스킹이 가능하도록  CPU와 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.

 

 

- 멀티 프로세스 

애플리케이션 단위의 멀티 태스킹을 의미한다.

 

 

- 멀티 스레드

애플리케이션 내부의 멀티 태스킹을 의미한다.

여러 스레드를 동시에 실행시키는 응용 프로그램을 작성하는 기법

메모리 공유로 인한 시스템 자원 소모가 줄어든다.

동시에 두 가지 이상의 활용이 가능하다.

서로 자원을 소모하다가 충돌이 일어날 가능성이 있다.

 

멀티 프로세스


- 멀티 프로세스 

운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 "독립적"이다.

따라서 하나의 프로세스는 오류가 발생해도 다른 프로세스에 영향을 미치지 않는다.

각 프로세스는 서로 정보를 주고받을 수 없다.

 

 

- 멀티 스레드

하나의 프로세스 내부에 생성된다, 따라서 하나의 스레드에 예외가 발생하면 다른 스레드에 영향을 미친다.

 

싱글 스레드 애플리케이션에서는 메인 스레드 ( main 메소드의 코드 흐름)가 종료되면 프로세스가 종료된다.

 

멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있다면 프로세스가 종료되지 않는다.

 

스레드 애플리케이션

 

- 멀티 스레드를 이용하는 곳

① 대용량 데이터의 처리 시간을 줄이기 위해 데이터를 분할해서 병렬 처리하는 곳

② UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용한다.

③ 다수 클라이언트의 요청을 처리하는 서버 개발 시 필요하다.

 


- 스레드 생성 방법

 

1) Thread 클래스 상속

public class 클래스명 extends Thread {
     public void run() {
         쓰레드 객체가 start() 호출하면 실행된 문장;
         ...
     }
}

Thread 참조변수 = new 클래스명();
참조변수.start();

✔ Thread 클래스는 start() 실행 시 run() 메소드가 수행되도록 내부적으로 처리한다.

 

 

2) Runnable 인터페이스 구현

public class 클래스명 implements Runnable {
     public void run(){
         쓰레드 객체가 start() 호출하면 실행할 문장;
         ...
     }
}

Runnable 참조변수1 = new 클래스명();
Thread 참조변수2 = new Thread(참조변수1);
참조변수2.start();

 

 


- 스레드 이름

메인 스레드 : main

직접 생성한 스레드 : Thread-n

스레드 이름을 직접 설정하고 싶으면  setName() 메소드 사용

 

 

- 스레드 우선순위

멀티 스레드는 동시성과 병렬성으로 실행된다.

싱글 코어 CPU를 이용한 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만, 사실 번갈아가며 실행하는 동시성 작업이다.

 

 

✔ 동시성 (Concurrenecy)

멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행되는 성질을 의미한다.

 

✔ 병렬성 (Parallelism)

멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질을 의미한다.

동시성과 병렬성

 


- 스레드 스케줄링

스레드의 개수가 코어의 수보다 많을 경우, 어떤 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가에 대한 결정을 하는 것을 의미한다.

스케줄링

 

1) 우선순위 방식

우선순위가 높은 스레드가 실행 상태를 더 많이 가져가도록 스케줄링하는 것이다.

순위 번호를 부여하기 때문에 개발자가 코드로 제어가 가능하다.

 

MAX_PROIRITY    :  가장 높은 순위, 10

NORM_PROIRITY : 일반적인 순위, 5

MIN_PROIRITY      : 가장 낮은 순위, 1

 

 

2)  순위 할당 방식

시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식이다.

자바 가상 머신 (JVM)에 의해 정해지기 때문에 코드로 제어가 불가능하다.

 

 


- 동기화 (synchronized)

멀티 스레드 프로세스에서는 다른 스레드의 작업에 영향을 미칠 수 있기 때문에 진행 중인 작업이 다른 스레드에 간섭을 받지 않게 동기화가 필요하다.

 

스레드가 객체 내부의 동기화 메소드 혹은 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역 코드를 실행하지 못하도록 한다.

 

 

✔ 임계 영역 (Criticlal Section)

멀티 스레드 프로그램에서 단 하나의 스레드만을 실행할 수 있는 코드 영역이다.

 

 

- 동기화 메소드

메소드 전체 내용이 임계 영역이므로 스레드가 동기화 메소드를 실행하는 즉시 객체에는 잠금이 일어나고, 스레드 동기화 메소드를 실행 종료하면 잠금이 풀린다.

 

 

- 동기화 블록

일부 내용만을 임계 영역으로 만들고 싶을 때 사용한다.

외부 코드들은 여러 스레드가 동시에 실행이 가능하지만, 블록 내부 코드들은 임계 영역이므로 한 번에 하나의 스레드만을 실행할 수 있고, 다른 스레드는 실행할 수 없다.

 

 


- 스레드 상태

실행 대기 상태 아직 스케줄링이 되지 않아서 실행을 기다리고 있는 상태
실행 상태 실행 대기 상태의 스레드 중 스케줄링으로 선택된 스레드가 CPU를 점유하고 run() 메소드를 실행한 상태
일시 정지 상태 스레드가 실행할 수 없는 상태

 


- 스레드 상태 제어 메소드

메소드 설명
notify() 동기화 블록 내에서 wait() 메소드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만든다.
notifyAll() notify()와 동일하지만, 모든 스레드를 실행 대기 상태로 만든다.
sleep() 주어진 시간동안 일시정지 상태로 만든다.
주어진 시간이 지나면 자동으로 실행 대기 상태로 만든다.
wait() 동기화 블록 내에서 스레드를 일시정지 상태로 만든다.
매개 변수로 시간을 넘길 수 있는데 
매개 변수가 없는 경우에는 notify(), notifyAll()을 통해
실행 대기 상태로 만들어준다.
yield() 실행 중에 우선순위가 동일한 다른 스레드에게
실행을 양보하고 실행 대기 상태가 된다.
join() 이 메소드를 호출한 스레드는 일시 정지 상태가 된다.
실행 대기 상태로 갈려면 이 메소드를 멤버로 가지는 스레드가 종료되거나 매개변수로 주어진 시간이 지나야한다.

 


Thread 사용해보기!

주인이 나중에 올릴예정..😥😥

 

 

 

복사했습니다!