Coding 공부/Java

[Java_Summary] 스레드와 멀티테스킹, 프로세스, Thread, Runnable, 다형성, 동기화(Synchronized)

CBJH 2024. 3. 5. 15:14
728x90
반응형

1. 프로세스

 

1.1. 메모리 할당

  • 프로세스는 실행을 위해 메모리 공간을 할당받습니다. 이 공간에는 코드, 데이터, 스택 등이 포함됩니다.

1.2. 실행 상태

  • 프로세스는 일반적으로 생성(Create), 준비(Ready), 실행(Running), 대기(Waiting), 종료(Terminated) 등의 여러 상태를 가집니다. 프로세스 스케줄러는 이러한 상태들 사이에서 프로세스를 전환시키며 CPU 자원을 효율적으로 관리합니다.

1.3. 프로세스 ID(PID)

  • 운영 체제는 각 프로세스에 고유한 식별자인 프로세스 ID(PID)를 할당합니다. 이를 통해 프로세스를 구분하고 관리할 수 있습니다.

1.4. 컨텍스트 스위칭

  • 프로세스 간에 CPU 사용권이 전환될 때, 시스템은 이전 프로세스의 상태를 저장하고 새 프로세스의 상태를 로드하는 과정을 거칩니다. 이를 컨텍스트 스위칭이라고 합니다.

1.5. 독립성

  • 프로세스는 서로 독립적인 실행 흐름을 가지며, 각각의 주소 공간에서 실행됩니다. 이를 통해 하나의 프로세스가 다른 프로세스에 영향을 주지 않도록 합니다. 그러나 프로세스 간 통신(IPC, Inter-Process Communication) 메커니즘을 통해 데이터를 교환하거나 협력할 수 있습니다.

1.6. 멀티태스킹과 멀티프로세싱

  • 현대의 운영 체제들은 멀티태스킹을 지원하여 여러 프로세스가 동시에 실행되는 것처럼 보이게 합니다. 또한 멀티프로세싱 환경에서는 여러 CPU 코어를 활용하여 실제로 여러 프로세스를 동시에 실행할 수 있습니다.

프로세스는 시스템의 자원을 사용하여 작업을 수행하는 기본 단위로, 운영 체제의 중요한 구성 요소입니다.

 

 

 

 

2. 쓰레드(Thread)

 

쓰레드(Thread)는 프로세스 내에서 실행되는 실행의 단위입니다. 프로세스가 운영 체제로부터 자원을 할당받아 실행되는 프로그램의 인스턴스라면, 쓰레드는 그 프로세스 내에서 독립적으로 실행되는 경량의 실행 단위입니다.

 

2.1. 경량 프로세스

  • 쓰레드는 때때로 "경량 프로세스"라고 불리며, 이는 쓰레드가 프로세스에 비해 생성, 종료, 컨텍스트 스위칭의 비용이 적기 때문입니다. 이로 인해 프로그램의 반응성이 향상되고, 자원을 효율적으로 사용할 수 있습니다.

2.2. 공유 자원

  • 프로세스 내의 쓰레드들은 메모리(데이터 세그먼트와 힙 세그먼트)와 자원을 공유합니다. 이는 데이터를 공유하고 통신하는 것을 용이하게 하지만, 동시에 데이터 일관성과 동기화 문제를 야기할 수도 있습니다.

2.3. 독립적 실행 흐름

  • 각 쓰레드는 독립적인 실행 흐름을 가지며, 자신만의 쓰레드 ID, 프로그램 카운터, 레지스터 세트, 스택을 가집니다.

2.4. 멀티쓰레딩

  • 멀티쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 실행되는 기술입니다. 이를 통해 프로그램의 실행 효율성을 높이고, CPU 사용률을 최적화할 수 있습니다.

2.5. 병렬 처리

  • 멀티코어 프로세서에서 멀티쓰레딩을 활용하면, 여러 쓰레드가 실제로 동시에 실행되어 병렬 처리가 가능해집니다. 이는 작업의 처리 속도를 크게 향상시킬 수 있습니다.

2.6. 동기화

  • 쓰레드 간의 데이터 공유는 동기화 문제를 일으킬 수 있습니다. 따라서, 쓰레드가 공유 자원에 접근할 때는 락(lock)이나 세마포어(semaphore) 같은 동기화 메커니즘을 사용하여 데이터 일관성과 무결성을 유지해야 합니다.

쓰레드는 현대 컴퓨팅 환경에서 멀티태스킹과 병렬 처리를 가능하게 하는 핵심 기술입니다. 동시에 실행하진 않지만 사람이 인지하지 못하는 단위로 같이 실행하듯이 처리하는 기술이다.

 

2.7 쓰레드 예제

쓰레드 만드는 방법은 두가지가 있다.

  • Thread 클래스 이용
  • Runnable 인터페이스 이용

 

  • 스레드 시작 : start() 메소드 호출 >> JVM에 의해 run()메소드가 호출되어 실행을 시작한다.

2.8 쓰레드 예제02

실행 흐름

  1. 프로그램이 시작되면 main 메소드가 실행되는 메인 쓰레드가 활성화됩니다.
  2. main 쓰레드는 MyThread2 인스턴스 두 개(mt1과 mt2)를 생성하고, 이들을 시작합니다.
  3. 각 MyThread2 인스턴스는 별도의 쓰레드로 실행되며, run() 메소드에 정의된 작업을 병렬로 수행합니다.
  4. main 쓰레드는 mt1과 mt2의 start() 호출 후에 종료됩니다. 하지만 mt1과 mt2 쓰레드는 계속 실행됩니다.

따라서, 이 프로그램은 main 쓰레드를 포함해 총 세 개의 쓰레드가 동작하는 멀티쓰레딩 예제입니다. mt1과 mt2 쓰레드는 독립적으로 실행되어 각각의 이름과 $ 문자를 출력하며, 이 과정에서 멀티쓰레딩의 병렬 처리 능력을 보여줍니다.

 

 

2.9 쓰레드 예제(Runnable 인터페이스 구현)

 

 

2.10 쓰레드 예제(join() 메서드)

  • .join()메서드를 사용하면 해당 스레드가 모두 실행 될때까지 다른 스레드가 동작하지 않도록 보장해준다.

  • set.Priority(Thread.상수명);을 통해서 쓰레드 실행 우선순위를 설정할 수 있다.
  • 실행 순위는 상수의 숫자가 클수록 먼저 실행된다.(MAX는 10, MIN은 1)
  • 우선순위가 높다고해서 해당 스레드가 모두 실행될 때 까지 다른 스레드가 실행하지 못하는 것은 아니고, 우선순위가 높은 스레드가 먼저 할당되어 실행된다.

 

 

3. 다형성

 

  • 이 기능은 Java의 다형성을 활용하여 코드의 재사용성과 유연성을 높이는 데 매우 유용합니다.
  • Java에서 클래스를 정의할 때 하나의 클래스는 다른 클래스를 상속(extends)하는 동시에 하나 또는 여러 인터페이스를 구현(implements)할 수 있습니다.
  • 쓰레드로 사용하기 위해 Runnalbe 인터페이스를 구현하면서 다른 클래스를 상속 받는데 사용할 수 있다.

 

 

 

4. 동기화(Synchronized)

 

  • 동기화과정에서 자원이 독립적으로 되어있지 않다면 같은 자원에 여럿이 접근해 문제가 생길 수 있다.
  • 예시) 예전 기차 예약 시스템에서는 같은 좌석에 여러명이 접속해 예약했다. 그래서 한 시간, 한 자리에 여러명이 예약되기도 했다.