Skip to content

Commit acbce00

Browse files
authored
Add FairShareScheduling algorithm (#5815)
1 parent ecf4c37 commit acbce00

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@
530530
* [ScanScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/ScanScheduling.java)
531531
* [SSFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/SSFScheduling.java)
532532
* [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java)
533+
* [FairShareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FairShareScheduling.java)
533534
* [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java)
534535
* [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java)
535536
* [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java)
@@ -1129,6 +1130,7 @@
11291130
* [ScanSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/ScanSchedulingTest.java)
11301131
* [SSFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/SSFSchedulingTest.java)
11311132
* [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java)
1133+
* [FairShareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FairShareSchedulingTest.java)
11321134
* [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java)
11331135
* [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java)
11341136
* [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* FairShareScheduling allocates CPU resources equally among users or groups
8+
* instead of individual tasks. Each group gets a proportional share,
9+
* preventing resource hogging by a single user's processes.
10+
*
11+
* Use Case: Multi-user systems where users submit multiple tasks simultaneously,
12+
* such as cloud environments.
13+
*
14+
* @author Hardvan
15+
*/
16+
public final class FairShareScheduling {
17+
18+
static class User {
19+
String name;
20+
int allocatedResources;
21+
int totalWeight;
22+
23+
User(String name) {
24+
this.name = name;
25+
this.allocatedResources = 0;
26+
this.totalWeight = 0;
27+
}
28+
29+
void addWeight(int weight) {
30+
this.totalWeight += weight;
31+
}
32+
}
33+
34+
private final Map<String, User> users; // username -> User
35+
36+
public FairShareScheduling() {
37+
users = new HashMap<>();
38+
}
39+
40+
public void addUser(String userName) {
41+
users.putIfAbsent(userName, new User(userName));
42+
}
43+
44+
public void addTask(String userName, int weight) {
45+
User user = users.get(userName);
46+
if (user != null) {
47+
user.addWeight(weight);
48+
}
49+
}
50+
51+
public void allocateResources(int totalResources) {
52+
int totalWeights = users.values().stream().mapToInt(user -> user.totalWeight).sum();
53+
for (User user : users.values()) {
54+
user.allocatedResources = (int) ((double) user.totalWeight / totalWeights * totalResources);
55+
}
56+
}
57+
58+
public Map<String, Integer> getAllocatedResources() {
59+
Map<String, Integer> allocation = new HashMap<>();
60+
for (User user : users.values()) {
61+
allocation.put(user.name, user.allocatedResources);
62+
}
63+
return allocation;
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.Map;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class FairShareSchedulingTest {
10+
11+
private FairShareScheduling scheduler;
12+
13+
@BeforeEach
14+
public void setup() {
15+
scheduler = new FairShareScheduling();
16+
}
17+
18+
@Test
19+
public void testAllocateResourcesSingleUser() {
20+
scheduler.addUser("User1");
21+
scheduler.addTask("User1", 5);
22+
scheduler.allocateResources(100);
23+
Map<String, Integer> expected = Map.of("User1", 100);
24+
assertEquals(expected, scheduler.getAllocatedResources());
25+
}
26+
27+
@Test
28+
public void testAllocateResourcesMultipleUsers() {
29+
scheduler.addUser("User1");
30+
scheduler.addUser("User2");
31+
scheduler.addUser("User3");
32+
scheduler.addTask("User1", 2);
33+
scheduler.addTask("User2", 3);
34+
scheduler.addTask("User3", 5);
35+
scheduler.allocateResources(100);
36+
Map<String, Integer> expected = Map.of("User1", 20, "User2", 30, "User3", 50);
37+
assertEquals(expected, scheduler.getAllocatedResources());
38+
}
39+
40+
@Test
41+
public void testAllocateResourcesZeroWeightUser() {
42+
scheduler.addUser("User1");
43+
scheduler.addUser("User2");
44+
scheduler.addTask("User2", 5);
45+
scheduler.allocateResources(100);
46+
Map<String, Integer> expected = Map.of("User1", 0, "User2", 100);
47+
assertEquals(expected, scheduler.getAllocatedResources());
48+
}
49+
50+
@Test
51+
public void testAllocateResourcesEqualWeights() {
52+
scheduler.addUser("User1");
53+
scheduler.addUser("User2");
54+
scheduler.addTask("User1", 1);
55+
scheduler.addTask("User2", 1);
56+
scheduler.allocateResources(100);
57+
Map<String, Integer> expected = Map.of("User1", 50, "User2", 50);
58+
assertEquals(expected, scheduler.getAllocatedResources());
59+
}
60+
}

0 commit comments

Comments
 (0)