스레드

hyHA·2023년 11월 25일
0
post-custom-banner

프로그램이 실행될 때 작동되는 것

  • 프로그램
    • 컴퓨터가 실행할 수 있는 명령어들의 집합
  • 프로세스
    • 컴퓨터(운영체제)에서 실행중인 프로그램(애플리케이션).
    • 애플리케이션이 실행되면 운영체제로부터 실행에 필요한 메모리를 할당받는다
    • 각각의 프로세스는 독립된 메모리 공간을 할당받는다
    • 이 메모리 공간에 각각의 프로세스들의 명령어들과 데이터가 저장된다.
  • CPU
    • 프로세스의 명령어를 해석하고 실행하는 장치
    • 프로세스 코드가 실제로 실행되는 곳
  • 메모리(RAM)
    • 프로세스가 CPU에서 실행되기 위해 대기하는 곳
    • 프로세스 코드 실행에 필요한 데이터, 코드 실행 결과로 나온 데이터들이 상주하는 곳
  • HDD(하드디스크)
    • 프로그램 데이터가 영구적으로 저장되는 곳
    • 프로세스의 데이터 일부가 임시 저장되는 곳
    • 액세스해야 할 때 더 빠른 액세스를 위해 하드디스크에서 RAM으로 이동된다

여러 프로그램을 동시에 실행하기

단일 프로세스

초창기 시스템. 한번에 하나의 프로그램만 실행됨
다른 프로그램을 실행하려면 실행하던 프로그램을 종료 후 그 다음 프로그램을 실행해야

  • 단점 : CPU사용률이 좋지 않음. IO작업을 하면 CPU는 놀고 있음. 프로세스가 IO작업을 하는 동안에는 CPU는 놀고 있음
  • 해결방안 : 멀티 프로그래밍

멀티 프로그래밍

여러개의 프로그램이 동시에 실행되는 것
여러 개의 프로그램을 메모리에 올려놓고 동시에 실행.
ex) IO작업이 발생하면 다른 프로세스가 CPU에서 실행됨. CPU를 사용하던 프로세스가 IO작업을 해야 하는 상황이 오면 다른 프로세스가 CPU에서 실행됨.

  • 목적 : CPU사용률을 극대화 시키는 것
  • 단점 : CPU사용시간이 길어지면 다른 프로세스는 계속 대기
  • 해결책 : 멀티태스킹

멀티 태스킹

프로세스가 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하는 것
동시에 여러 프로그램을 실행시킨다는 면에서는 멀티프로그래밍과 유사.
거기에, CPU time을 아주 짧은 time slice로 쪼개서 그 시간안에서 여러 프로세스들이 서로 번갈아가면서 실행되도록 하는 것

  • 목적 : 프로세스의 응답시간을 최소화시키는데 목적. 사용자가 느끼기에는 여러 프로그램이 동시에 실행되는 것처럼 느낌
  • 한계
    • 하나의 프로세스가 동시에 여러 작업을 수행하지 못함
      • 프로세스를 여러개로 만들어 동작하는데는 단점이 있음.
    • 프로세스 컨텍스트 스위칭은 무거운 작업
    • 프로세스끼리 데이터 공유가 까다로움
      • 프로세스는 독립적인 메모리 공간을 가짐
    • 듀얼 코어가 등장하기 시작. 이걸 잘 활용하고 싶음
      • CPU제조사에서 하나의 CPU성능을 계속 발전시키는 것이 발열등의 이슈로 쉽지 않음 > 한 CPU안에 두개의 코어를 두어서 전체적인 성능을 향상시키는 방향
  • 해결방안 : 스레드

스레드의 등장

  1. 프로세스는 한 개 이상의 스레드를 가질 수 있다
  2. CPU에서 실행되는 단위(unit of execution)
  3. 같은 프로세스의 스레드들끼리 컨텍스트 스위칭은 가볍다
  4. 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유

멀티 스레딩

하나의 프로세스가 동시에 여러 작업을 실행
멀티태스킹이의 개념이 확장된 것
여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU타임을 나눠 가짐

멀티 프로세싱

두 개 이상의 프로세서나 코어를 활용하는 시스템

예제





멀티태스킹 : 코어별로 병합하는게 있어야. CPU시간을 잘게 쪼개서 그 시간안에서 프로세스(or스레드)들이 번갈아 실행

작업 스레드 생성과 실행

메인 스레드

자바의 모든 애플리케이션은 메인 스레드가 main()메소드를 실행하면서 시작된다
메인 스레드는 main()메소드의 첫 코드부터 아래로 순차적으로 실행한다
main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다

메인 메소드는 필요에 따라 작업 스레드들을 만들어서 병렬로 실행할 수 있다
즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.

멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있으면, 프로세스는 종료되지 않는다
메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 실행 중이라면 프로세스는 종료되지 않는다

작업 스레드 생성과 실행

멀티 스레드로 실행하는 어플리케이션을 개발하려면

  1. 몇 개의 작업을 병렬로 실행할지 결정하고
  2. 각 작업별로 스레드를 생성해야 한다
    • 자바에서는 작업 스레드도 객체로 생성되기 때문에 클래스가 필요하다
    • java.lang.Thread 클래스를 직접 객체화해서 생성해도 되지만
    • Thread 클래스를 상속해서 하위 클래스를 만들어 생성할 수도 있다

java.lang.Thread 클래스를 직접 객체화해서 생성하기

Runnable을 매개값으로 갖는 생성자 호출
Thread thread = new Thread(Runnable task)

  • Runnable
    • 작업 스레드가 실행할 수 있는 코드를 가지고 있는 인터페이스.
      • run() 메소드 하나가 정의되어 있음.
  • Runnable 구현객체
    • 구현 객체를 만들어 Runnable에 대입해야 함. 작업 내용을 가지고 있는 객체
      • run() 메소드를 재정의해서 작업 스레드가 실행할 코드를 작성해야 함
class Task implements Runnable{
	public void run() {
       	스레드가 실행할 코드;
    }
}
  • 스레드 생성1
Runnable task = new Task(); //Runnable 구현객체 생성
Thread thread = new Thread(task); //스레드 생성
  • 스레드 생성2 (익명 객체 사용)
Thread thread = new Thread(new Runnable() {
	public void run() {
    	스레드가 실행할 코드;
    }
});
  • 스레드 호출

Thread 클래스를 상속해서 하위 클래스를 만들어 생성하기

작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread의 하위 클래스로 작업 스레드를 정의하면서 작업내용을 포함시킬 수 있다.

  • 객체 생성 1
    • Thread클래스를 상속한 후 run()메소드를 재정의(오버라이딩)해서 스레드가 실행할 코드를 작성하면된다.
public class WorkerThread extends Thread { //스레드 하위 클래스 선언
	@Override
    public void run() {
    	//스레드가 실행할 코드;
	}
}

Thread thread = new WorkerThread(); //스레드 생성
  • 객체 생성 2 (익명 객체) ❓❓
    • Thread 익명 객체로 작업 스레드 객체를 생성해서 코드를 절약할 수 있다.
Thread thread = new Thread() {
	public void run() {
    	//스레드가 실행할 코드;
	}
}

스레드 이름

디버깅 시 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용됨

  • 메인스레드 이름 : main
  • 직접 생성한 스레드 : Thread-n이라는 이름으로 설정됨
  • setName(), getName()

동기화 메소드

스레드 제어

스레드 상태

스레드 상태 제어

데몬 스레드

참고
https://www.youtube.com/watch?v=QmtYKZC0lMU&list=PLcXyemr8ZeoRRaTfapB8GMMrLMlCTN4wJ&index=7

profile
룰루랄라
post-custom-banner

0개의 댓글