computer science

하루에 하나씩 배우는 컴퓨터 사이언스 개념: 데드락과 스타베이션 개념

vita12321 2023. 8. 11. 16:11
728x90
반응형

오늘은 컴퓨터 사이언스 개념 하나인 데드락(Deadlock) 스타베이션(Starvation) 대해 살펴봅니다. 가지 개념은 멀티 스레딩 환경에서 흔히 발생할 있는 문제로, 컴퓨터 공학 지식 기반의 원인 이해가 필요합니다. 이번 글에서 공유자원 액세스를 위한 잠금 기본 원칙, 그리고 데드락과 스타베이션의 정의, 원인 대응방안을 자세히 알아보겠습니다.


1. 공유자원 액세스를 위한 잠금 기본 원칙

 

멀티 스레딩 환경에서 여러 스레드가 동시에 공유 자원에 접근하려면 동기화가 필요합니다. 이를 확보하기 위해서는 잠금(Locking) 이라는 기본 원칙이 존재합니다.

 

그렇다면 잠금 기법이 완벽한 동기화를 보장할까요? 아쉽게도 잘못 사용된 경우 문제를 초래할 있습니다. 데드락과 스타베이션은 잠금 기법을 사용함에도 불구하고 발생하는 문제들로, 올바른 스레드 동기화 전략이 필요합니다.


2. 데드락(Deadlock) 개념

 

데드락은 이상의 스레드가 서로의 자원을 기다리고 있어 작업을 진행할 없는 상태를 말합니다. 데드락 상태가 되면, 아무 것도 실행되지 않아 시스템 전체 성능이 저하되거나 완전히 멈추게 됩니다.

 

데드락 발생 원인:

1) 상호 배제(Mutual Exclusion):
공유 자원 하나 이상이 번에 개체만 사용할 있을 상호 배제가 발생합니다.

2) 점유와 대기(Hold and Wait):
스레드가 이미 자원을 점유한 상태에서 다른 자원이 필요한 경우, 점유한 자원을 반납하지 않고 필요한 자원이 사용 가능할 때까지 대기하는 상황입니다.

3) 비선점(No Preemption):
다른 스레드가 이미 점유한 자원을 강제로 뺏어올 없는 경우를 말합니다.

4) 원형 대기(Circular Wait):
여러 개의 스레드가 원형 구조를 이루며 다음 자원을 대기하는 상황입니다.

 

데드락 해결 방안:

  • 자원 할당 정책 변경: 자원 할당 순서를 정하여 원형 대기를 방지할 수 있습니다.
  • 기다림 여부 확인: 스레드가 필요한 자원을 기다리는 동안 다른 자원의 사용을 중단합니다.
  • 자원 점유 시간 제한: 스레드가 자원을 일정 시간 동안만 점유할 수 있도록 제한하고, 시간이 초과될 경우 자원을 반환하게 할 수 있습니다.

3. 스타베이션(Starvation) 개념

 

스토베이션은 어떤 스레드가 너무 오랫동안 자원을 할당받지 못하는 상황을 말합니다. 이로 인해 해당 스레드는 실행을 멈추거나, 실행 속도가 저하되거나, 실행에 실패할 있습니다.

 

스타베이션 원인:

1) 우선순위 부여: 우선순위 스레드가 계속적으로 자원을 점유하는 경우 낮은 우선순위 스레드에게 자원이 배분되지 않을수 있습니다.

2) 공정하지 않은 자원 배분: 자원을 배분하는 정책이 공정하지 않은 경우 일부 스레드가 끊임없이 배제될 있습니다.

 

스타베이션 해결 방안:

  • 우선순위 변경: 스레드의 우선순위를 재조정하여 공정한 자원 배분을 도모합니다.
  • 자원 할당 정책 개선: 자원 배분 정책을 개선하여 모든 스레드가 공평하게 접근할 수 있도록 합니다.
  • 우선순위 상속 기법 사용: 저우선순위 스레드가 우선순위가 높은 스레드로부터 자원을 빌려 올릴 수 있도록 시스템을 개선합니다.

4. 자바를 사용한 데드락 예제

 

아래 예제에서 스레드는 개의 객체에 동시에 동기화를 시도하며, 데드락이 발생합니다.

public class DeadlockDemo {

    public static void main(String[] args) {

        Object resource1 = new Object();

        Object resource2 = new Object();

 

        Thread t1 = new Thread(() -> {

            synchronized (resource1) {

                System.out.println("Thread1 locked resource1");

                try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }

 

                synchronized (resource2) {

                    System.out.println("Thread1 locked resource2");

                }

            }

        });

 

        Thread t2 = new Thread(() -> {

            synchronized (resource2) {

                System.out.println("Thread2 locked resource2");

                try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }

 

                synchronized (resource1) {

                    System.out.println("Thread2 locked resource1");

                }

            }

        });

 

        t1.start();

        t2.start();

    }

}

 

위에서 정의된 스레드는 서로의 자원을 기다리며 데드락 상태에 빠집니다. 이를 막기 위해서는 자원 접근 순서를 조정하거나, 데드락을 감지하여 해결하는 등의 올바른 동기화 전략을 사용해야 합니다.

 

 

 

이번 글에서는 데드락과 스타베이션에 대해 다루었습니다. 이러한 개념을 바탕으로, 멀티스레드 환경에서 발생할 있는 다양한 문제를 해결하는 방법과 자바를 활용한 예제를 학습하는 것이 도움이 것입니다. 컴퓨터 공학 지식을 바탕으로 개념을 이해하고, 자바를 이용해 적용하면서 효과적으로 멀티스레딩 동기화 이슈 해결 능력을 키워보시길 바랍니다.

728x90
반응형