ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기아상태(Starvation)란?
    Computer Science/OS 2024. 4. 6. 17:22
    반응형

    기아상태(Starvation)는 멀티스레딩 환경에서 특정 스레드가 CPU 시간이나 필요한 자원을 충분히 할당받지 못해 원하는 작업을 수행하지 못하는 상태를 말합니다. 이는 일반적으로 우선순위가 높은 작업에 자원이 계속 할당되어 우선순위가 낮은 작업이 무한히 대기 상태에 머무르게 될 때 발생합니다.

    1. 기아상태란?

    기아상태는 시스템 내의 자원 할당 정책으로 인해 발생할 수 있습니다. 예를 들어, 특정 스레드나 프로세스가 자원을 오랜 시간 동안 독점하고 있을 때, 다른 스레드는 그 자원을 사용할 기회를 얻지 못할 수 있습니다. 특히, 멀티스레딩 환경에서 스레드에 우선순위를 할당하여 작업을 스케줄링할 때 기아상태가 발생하기 쉽습니다.

    2. 기아상태 코드 예시

    Java 예시: Java에서는 Thread 클래스의 우선순위 설정을 사용하여 기아상태를 시뮬레이션할 수 있습니다.

    public class StarvationExample {
        public static void main(String[] args) {
            final Object lock = new Object();
    
            // 고우선순위 스레드
            Runnable highPriorityTask = () -> {
                synchronized (lock) {
                    while (true) { // 무한 루프로 자원을 독점
                        System.out.println(Thread.currentThread().getName() + " is executing.");
                        try {
                            Thread.sleep(100); // 자원을 점유하는 동안 일시 중지
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
    
            // 저우선순위 스레드
            Runnable lowPriorityTask = () -> {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + " is executing.");
                }
            };
    
            Thread highPriorityThread = new Thread(highPriorityTask, "HighPriorityThread");
            Thread lowPriorityThread = new Thread(lowPriorityTask, "LowPriorityThread");
    
            highPriorityThread.setPriority(Thread.MAX_PRIORITY); // 우선순위를 높임
            lowPriorityThread.setPriority(Thread.MIN_PRIORITY); // 우선순위를 낮춤
    
            highPriorityThread.start();
            lowPriorityThread.start();
        }
    }

     

    Go 예시: Go에서는 고루틴(goroutines)과 채널(channels)을 사용하여 기아상태를 시뮬레이션할 수 있습니다. 하지만 Go의 스케줄러는 공평성(fairness)을 유지하려고 노력하기 때문에, Java보다 기아상태를 재현하기 어려울 수 있습니다. 아래 예시는 채널을 통한 자원 접근을 시뮬레이션하는 방법을 보여줍니다.

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	ch := make(chan int)
    	go func() {
    		for {
    			ch <- 1 // 계속해서 채널에 데이터를 보냄
    			time.Sleep(time.Second) // 다른 고루틴에 실행 기회를 주지 않음
    		}
    	}()
    
    	go func() {
    		for {
    			fmt.Println(<-ch) // 채널에서 데이터를 읽음
    			time.Sleep(2 * time.Second) // 상대적으로 더 많은 시간을 기다림
    		}
    	}()
    
    	select {} // 메인 고루틴이 종료되지 않도록 함
    }

     

    3. 추가 팁

    • 기아상태 방지: 기아상태를 방지하기 위해서는 공평한 자원 할당 정책이 필요합니다. 예를 들어, 자원을 요청하는 모든 스레드에게 공평하게 기회를 주는 라운드 로빈(Round Robin) 스케줄링을 사용할 수 있습니다.
    • 동적 우선순위 조정: 시스템이 실행되는 동안 스레드의 우선순위를 동적으로 조정하여, 장시간 자원을 할당받지 못한 스레드의 우선순위를 높여주는 방법도 있습니다.
    • 우선순위가 아닌 다른 기준 고려: CPU 시간, 메모리 사용량, 입출력 요청 등 다양한 기준을 고려하여 자원을 할당하는 것도 기아상태를 방지하는 데 도움이 됩니다.
    반응형
Designed by Tistory.