diff --git a/README.md b/README.md index c5d8c54..d54d876 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ CPU Virtualization Chapters: * Direct Execution * CPU Scheduling * Multi-level Feedback -* Lottery Scheduling +* [Lottery Scheduling](https://github.com/remzi-arpacidusseau/ostep-code/tree/master/cpu-sched-lottery) * Multi-CPU Scheduling Memory Virtualization Chapters: diff --git a/cpu-sched-lottery/README.md b/cpu-sched-lottery/README.md new file mode 100644 index 0000000..eca6742 --- /dev/null +++ b/cpu-sched-lottery/README.md @@ -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. + diff --git a/cpu-sched-lottery/lottery.c b/cpu-sched-lottery/lottery.c new file mode 100644 index 0000000..a4ef241 --- /dev/null +++ b/cpu-sched-lottery/lottery.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include + +// 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 \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; +} +