멀티스레딩 시리즈 2부에 오신 것을 환영합니다! 1부에서는 원자성과 불변성에 대해 살펴보았습니다.
이 부분에서는 공정성과 시스템 성능을 보장하기 때문에 엔지니어에게 필수적인 기아 현상을 더 깊이 이해해 보겠습니다. 엔지니어는 기아 위험을 인식함으로써 공정성을 우선시하고, 리소스 독점을 방지하고, 모든 스레드가 최적으로 작동하는 데 필요한 CPU 시간과 리소스를 확보하도록 하는 시스템을 설계할 수 있습니다.
온라인 멀티플레이어 게임을 하고 있고 팀 전투와 같은 인기 있는 게임 모드의 로비에 참가하려고 한다고 상상해 보세요. 한동안 로비에서 기다리고 있었지만 경기가 시작될 때마다 인터넷 속도가 더 빠르거나 스킬 순위가 더 높은 새로운 플레이어 배치가 우선적으로 게임에 추가됩니다. 경기가 계속해서 시작되는 것을 보지만 결코 입장할 생각이 없는 것 같습니다!
기술적으로는 대기열에 있지만 응답 시간이 빠르거나 순위가 높은 다른 플레이어가 계속 먼저 게임에 참여하기 때문에 대기실에 무기한 방치됩니다. 완벽하게 작동하는 시스템을 갖추고 있음에도 불구하고 매치메이킹 알고리즘이 다른 플레이어를 부당하게 우선시하는 방식으로 인해 플레이할 기회가 거부됩니다.
기아상태는 해당 리소스를 사용할 수 있음에도 불구하고 진행하는 데 필요한 리소스에 대한 프로세스의 액세스가 지속적으로 거부되는 상황입니다. 우선 순위가 높은 프로세스나 기타 리소스 할당 정책으로 인해 필요한 리소스를 확보하지 못하기 때문에 프로세스는 대기 상태로 유지됩니다. 교착 상태와 달리 리소스를 완전히 사용할 수 없는 것은 아니지만, 불공정한 스케줄링으로 인해 프로세스가 리소스에 액세스할 수 없습니다.
우선순위 반전: 우선순위가 높은 프로세스가 우선순위가 낮은 프로세스가 보유한 리소스를 기다리고 있는 경우 우선순위가 낮은 프로세스는 다른 높은 우선순위의 프로세스가 실행될 경우 CPU 시간이 부족할 수 있습니다. 프로세스가 계속 도착합니다.
리소스 할당 정책: 일부 예약 알고리즘은 특정 프로세스(일반적으로 우선순위가 더 높은 프로세스)를 선호할 수 있으며, 이로 인해 우선순위가 낮은 프로세스에 리소스가 거의 할당되지 않는 상황이 발생할 수 있습니다.
잘못 설계된 알고리즘: 자원 할당 알고리즘이 균형이 맞지 않거나 공정하지 않으면 특정 프로세스가 지속적으로 간과될 수 있습니다.
높은 리소스 수요: 몇몇 프로세스가 과도한 양의 리소스를 요구하는 경우 해당 리소스를 독점하여 다른 프로세스가 고갈될 수 있습니다.
긴 대기 시간: 자주 선점되거나 제한된 리소스를 놓고 경쟁하는 프로세스에서는 기아 상태가 발생할 수 있습니다.
Java의 ReentrantLock은 공정성을 강화할 수 있는 옵션을 제공합니다. true 인수와 함께 ReentrantLock 생성자를 사용하면 스레드가 선착순(FCFS) 방식으로 잠금을 획득하여 기아 상태를 방지할 수 있습니다.
private final Lock lock = new ReentrantLock(true); // Fair lock
세마포어는 제한된 수의 리소스에 대한 액세스를 제어하는 데 사용됩니다. 공정성이 활성화된 세마포어를 사용하면 스레드가 기아를 방지하면서 공정한 순서로 허가를 획득하도록 할 수 있습니다.
private final Semaphore sp = new Semaphore(1, true); // Fair semaphore
세마포어(1, true)는 단 하나의 허가와 공정성이 활성화된 세마포어입니다.
전통적인 생산자-소비자 문제에서는 생산자가 소비자를 압도하거나 소비자가 공유 자원에 대한 접근을 거부하는 경우 기아가 발생할 수 있습니다. BlockingQueue는 생산자와 소비자 간의 동기화를 자동으로 처리하므로 이를 방지합니다. 대기열이 가득 차거나 비어 있으면 생산자와 소비자가 모두 차단됩니다. 이는 둘 사이의 공정한 균형을 보장하고 하나가 다른 하나를 압도하는 것을 방지하여 기아를 방지합니다.
여러 작업이 분기되고 조인되는 시나리오에서 Java의 ForkJoinPool은 스레드 간에 작업 균형을 공정하게 조정하는 방법을 제공합니다. 작업 도용을 보장하여 덜 활동적인 스레드의 고갈을 방지합니다. Java의 ForkJoinPool은 작업 분할 및 균형 조정을 효율적으로 처리하여 작업이 부족한 스레드가 없도록 보장합니다. 이는 모든 작업을 원활하게 진행하기 위해 유휴 스레드가 바쁜 스레드에서 작업을 훔치는 작업 훔치기 알고리즘을 사용하여 달성됩니다.
운영 체제(OS)는 기아 상태, 즉 우선순위가 더 높은 작업이 지배하기 때문에 특정 프로세스나 스레드에 필요한 리소스(예: CPU 시간, 메모리 또는 I/O 액세스)가 오랫동안 거부되는 상황을 방지하기 위해 다양한 기술을 사용합니다. OS가 기아를 방지하는 몇 가지 일반적인 방법은 다음과 같습니다.
No. | Method | Description | Prevents Starvation By |
---|---|---|---|
1 | Aging | Gradually increases priority of waiting processes. | Prevents long waits by adjusting priority based on wait time. |
2 | Round-Robin Scheduling | Allocates CPU time in a fixed cyclic order. | Ensures all processes get CPU time, avoiding starvation. |
3 | Completely Fair Scheduler | Allocates CPU based on fairness, independent of priority. | Ensures fair distribution of CPU time. |
4 | Priority Boosting | Temporarily raises the priority of starved processes holding important resources. | Prevents priority inversion and ensures high-priority tasks get needed resources. |
5 | Multilevel Feedback Queues | Dynamically adjusts process priorities based on behavior. | Promotes long-waiting processes to higher-priority queues. |
6 | Semaphores with Fairness | Ensures fair access to resources through FIFO queues. | Prevents low-priority tasks from being perpetually blocked by higher-priority tasks. |
7 | Fair Resource Allocation | Distributes system resources like CPU and memory based on process demand and need. | Prevents resource-hogging processes from starving others. |
8 | Fair I/O Scheduling | Prioritizes I/O requests to ensure timely completion for all processes. | Prevents disk I/O starvation for processes making low-priority requests. |
이러한 전략을 구현함으로써 운영 체제는 어떤 프로세스나 스레드에도 리소스가 무한정 부족하지 않도록 보장하여 시스템 리소스를 보다 공정하고 효율적으로 사용할 수 있도록 합니다.
이 글을 쓸 수 있게 해준 온라인 문서, 커뮤니티 및 모든 리소스에 큰 감사를 드립니다.
위 내용은 멀티스레딩 개념 부분 기아의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!