mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-06 17:29:31 +08:00
Add FairShareScheduling
algorithm (#5815)
This commit is contained in:
@ -530,6 +530,7 @@
|
||||
* [ScanScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/ScanScheduling.java)
|
||||
* [SSFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/SSFScheduling.java)
|
||||
* [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java)
|
||||
* [FairShareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FairShareScheduling.java)
|
||||
* [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java)
|
||||
* [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java)
|
||||
* [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java)
|
||||
@ -1129,6 +1130,7 @@
|
||||
* [ScanSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/ScanSchedulingTest.java)
|
||||
* [SSFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/SSFSchedulingTest.java)
|
||||
* [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java)
|
||||
* [FairShareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FairShareSchedulingTest.java)
|
||||
* [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java)
|
||||
* [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java)
|
||||
* [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java)
|
||||
|
@ -0,0 +1,65 @@
|
||||
package com.thealgorithms.scheduling;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* FairShareScheduling allocates CPU resources equally among users or groups
|
||||
* instead of individual tasks. Each group gets a proportional share,
|
||||
* preventing resource hogging by a single user's processes.
|
||||
*
|
||||
* Use Case: Multi-user systems where users submit multiple tasks simultaneously,
|
||||
* such as cloud environments.
|
||||
*
|
||||
* @author Hardvan
|
||||
*/
|
||||
public final class FairShareScheduling {
|
||||
|
||||
static class User {
|
||||
String name;
|
||||
int allocatedResources;
|
||||
int totalWeight;
|
||||
|
||||
User(String name) {
|
||||
this.name = name;
|
||||
this.allocatedResources = 0;
|
||||
this.totalWeight = 0;
|
||||
}
|
||||
|
||||
void addWeight(int weight) {
|
||||
this.totalWeight += weight;
|
||||
}
|
||||
}
|
||||
|
||||
private final Map<String, User> users; // username -> User
|
||||
|
||||
public FairShareScheduling() {
|
||||
users = new HashMap<>();
|
||||
}
|
||||
|
||||
public void addUser(String userName) {
|
||||
users.putIfAbsent(userName, new User(userName));
|
||||
}
|
||||
|
||||
public void addTask(String userName, int weight) {
|
||||
User user = users.get(userName);
|
||||
if (user != null) {
|
||||
user.addWeight(weight);
|
||||
}
|
||||
}
|
||||
|
||||
public void allocateResources(int totalResources) {
|
||||
int totalWeights = users.values().stream().mapToInt(user -> user.totalWeight).sum();
|
||||
for (User user : users.values()) {
|
||||
user.allocatedResources = (int) ((double) user.totalWeight / totalWeights * totalResources);
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, Integer> getAllocatedResources() {
|
||||
Map<String, Integer> allocation = new HashMap<>();
|
||||
for (User user : users.values()) {
|
||||
allocation.put(user.name, user.allocatedResources);
|
||||
}
|
||||
return allocation;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package com.thealgorithms.scheduling;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class FairShareSchedulingTest {
|
||||
|
||||
private FairShareScheduling scheduler;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
scheduler = new FairShareScheduling();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllocateResourcesSingleUser() {
|
||||
scheduler.addUser("User1");
|
||||
scheduler.addTask("User1", 5);
|
||||
scheduler.allocateResources(100);
|
||||
Map<String, Integer> expected = Map.of("User1", 100);
|
||||
assertEquals(expected, scheduler.getAllocatedResources());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllocateResourcesMultipleUsers() {
|
||||
scheduler.addUser("User1");
|
||||
scheduler.addUser("User2");
|
||||
scheduler.addUser("User3");
|
||||
scheduler.addTask("User1", 2);
|
||||
scheduler.addTask("User2", 3);
|
||||
scheduler.addTask("User3", 5);
|
||||
scheduler.allocateResources(100);
|
||||
Map<String, Integer> expected = Map.of("User1", 20, "User2", 30, "User3", 50);
|
||||
assertEquals(expected, scheduler.getAllocatedResources());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllocateResourcesZeroWeightUser() {
|
||||
scheduler.addUser("User1");
|
||||
scheduler.addUser("User2");
|
||||
scheduler.addTask("User2", 5);
|
||||
scheduler.allocateResources(100);
|
||||
Map<String, Integer> expected = Map.of("User1", 0, "User2", 100);
|
||||
assertEquals(expected, scheduler.getAllocatedResources());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllocateResourcesEqualWeights() {
|
||||
scheduler.addUser("User1");
|
||||
scheduler.addUser("User2");
|
||||
scheduler.addTask("User1", 1);
|
||||
scheduler.addTask("User2", 1);
|
||||
scheduler.allocateResources(100);
|
||||
Map<String, Integer> expected = Map.of("User1", 50, "User2", 50);
|
||||
assertEquals(expected, scheduler.getAllocatedResources());
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user