forked from remzi-arpacidusseau/ostep-code
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5a51470
commit f83b83e
Showing
3 changed files
with
96 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
|
||
## Proportional Share Scheduling | ||
|
||
Code from OSTEP chapter [Scheduling: Proportional Share](http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-sched-lottery.pdf). | ||
|
||
Compile with: | ||
|
||
``` | ||
prompt> gcc -o lottery lottery.c -Wall | ||
``` | ||
|
||
Run like this: | ||
|
||
``` | ||
./lottery 1 100 | ||
``` | ||
|
||
which uses random seed '1' to run a little lottery 100 different times. | ||
|
||
Read the source code for details. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <assert.h> | ||
|
||
// global ticket count | ||
int gtickets = 0; | ||
|
||
struct node_t { | ||
int tickets; | ||
struct node_t *next; | ||
}; | ||
|
||
struct node_t *head = NULL; | ||
|
||
void insert(int tickets) { | ||
struct node_t *tmp = malloc(sizeof(struct node_t)); | ||
assert(tmp != NULL); | ||
tmp->tickets = tickets; | ||
tmp->next = head; | ||
head = tmp; | ||
gtickets += tickets; | ||
} | ||
|
||
void print_list() { | ||
struct node_t *curr = head; | ||
printf("List: "); | ||
while (curr) { | ||
printf("[%d] ", curr->tickets); | ||
curr = curr->next; | ||
} | ||
printf("\n"); | ||
} | ||
|
||
int | ||
main(int argc, char *argv[]) | ||
{ | ||
if (argc != 3) { | ||
fprintf(stderr, "usage: lottery <seed> <loops>\n"); | ||
exit(1); | ||
} | ||
int seed = atoi(argv[1]); | ||
int loops = atoi(argv[2]); | ||
srandom(seed); | ||
|
||
// populate list with some number of jobs, each | ||
// with some number of tickets | ||
insert(50); | ||
insert(100); | ||
insert(25); | ||
|
||
print_list(); | ||
|
||
int i; | ||
for (i = 0; i < loops; i++) { | ||
int counter = 0; | ||
int winner = random() % gtickets; // get winner | ||
struct node_t *current = head; | ||
|
||
// loop until the sum of ticket values is > the winner | ||
while (current) { | ||
counter = counter + current->tickets; | ||
if (counter > winner) | ||
break; // found the winner | ||
current = current->next; | ||
} | ||
// current is the winner: schedule it... | ||
print_list(); | ||
printf("winner: %d %d\n\n", winner, current->tickets); | ||
|
||
} | ||
return 0; | ||
} | ||
|