diff --git a/labcodes_answer/lab6_result/kern/process/proc.c b/labcodes_answer/lab6_result/kern/process/proc.c index 3c3fea5..994e77c 100644 --- a/labcodes_answer/lab6_result/kern/process/proc.c +++ b/labcodes_answer/lab6_result/kern/process/proc.c @@ -820,9 +820,19 @@ user_main(void *arg) { panic("user_main execve failed.\n"); } +static int +my_test_user_main(void *arg) { + int num = (int)arg; + int priority = (rand() % 100) * 100; + cprintf("process %d, priority %d\n", num, priority); + lab6_set_priority(priority); + cprintf("process %d end\n", num); +} + // init_main - the second kernel thread used to create user_main kernel threads static int init_main(void *arg) { + srand((unsigned int)0); size_t nr_free_pages_store = nr_free_pages(); size_t kernel_allocated_store = kallocated(); @@ -831,6 +841,13 @@ init_main(void *arg) { panic("create user_main failed.\n"); } + // error: ‘for’ loop initial declarations are only allowed in C99 mode + int i = 0; + for (; i < 10; i++) { + int pid = kernel_thread(my_test_user_main, (void *)i, 0); + struct proc_strucht *proc = find_proc(pid); + } + while (do_wait(0, NULL) == 0) { schedule(); } diff --git a/labcodes_answer/lab6_result/kern/process/proc.h b/labcodes_answer/lab6_result/kern/process/proc.h index 26abc49..f357b8f 100644 --- a/labcodes_answer/lab6_result/kern/process/proc.h +++ b/labcodes_answer/lab6_result/kern/process/proc.h @@ -64,6 +64,7 @@ struct proc_struct { skew_heap_entry_t lab6_run_pool; // FOR LAB6 ONLY: the entry in the run pool uint32_t lab6_stride; // FOR LAB6 ONLY: the current stride of the process uint32_t lab6_priority; // FOR LAB6 ONLY: the priority of process, set by lab6_set_priority(uint32_t) + uint32_t lab6_ticket_start; }; #define PF_EXITING 0x00000001 // getting shutdown diff --git a/labcodes_answer/lab6_result/kern/schedule/default_sched.c b/labcodes_answer/lab6_result/kern/schedule/default_sched.c index 0d01a13..5932170 100644 --- a/labcodes_answer/lab6_result/kern/schedule/default_sched.c +++ b/labcodes_answer/lab6_result/kern/schedule/default_sched.c @@ -2,9 +2,10 @@ #include #include #include +// #include // 没有这个文件 #include -#define USE_SKEW_HEAP 1 +#define USE_SKEW_HEAP 0 /* You should define the BigStride constant here*/ /* LAB6: YOUR CODE */ @@ -152,6 +153,85 @@ stride_proc_tick(struct run_queue *rq, struct proc_struct *proc) { } } +static void +ticket_init(struct run_queue *rq) { + list_init(&(rq->run_list)); + rq->lab6_run_pool = NULL; + rq->proc_num = 0; +} + +static void +ticket_enqueue(struct run_queue *rq, struct proc_struct *proc) { + /* LAB6: YOUR CODE */ +#if USE_SKEW_HEAP + rq->lab6_run_pool = + skew_heap_insert(rq->lab6_run_pool, &(proc->lab6_run_pool), proc_stride_comp_f); +#else + assert(list_empty(&(proc->run_link))); + list_add_before(&(rq->run_list), &(proc->run_link)); +#endif + if (proc->time_slice == 0 || proc->time_slice > rq->max_time_slice) { + proc->time_slice = rq->max_time_slice; + } + proc->rq = rq; + proc->lab6_ticket_start = rq->lab6_total_num + 1; + rq->proc_num ++; + rq->lab6_total_num += proc->lab6_priority + 1; + +} + +static struct proc_struct * +ticket_pick_next(struct run_queue *rq) { + /* LAB6: YOUR CODE */ + uint32_t target_index = rand() % rq->lab6_total_num; +#if USE_SKEW_HEAP + if (rq->lab6_run_pool == NULL) return NULL; + struct proc_struct *p = le2proc(rq->lab6_run_pool, lab6_run_pool); +#else + list_entry_t *le = list_next(&(rq->run_list)); + + if (le == &rq->run_list) + return NULL; + + struct proc_struct *p; + int32_t temp_ticket_sum = 0; + while (le != &rq->run_list) + { + p = le2proc(le, run_link); + temp_ticket_sum += p->lab6_priority + 1; + if (temp_ticket_sum >= target_index) + break; + le = list_next(le); + } +#endif + return p; +} + +static void +ticket_dequeue(struct run_queue *rq, struct proc_struct *proc) { + /* LAB6: YOUR CODE */ +#if USE_SKEW_HEAP + rq->lab6_run_pool = + skew_heap_remove(rq->lab6_run_pool, &(proc->lab6_run_pool), proc_stride_comp_f); +#else + assert(!list_empty(&(proc->run_link)) && proc->rq == rq); + list_del_init(&(proc->run_link)); +#endif + rq->proc_num --; + rq->lab6_total_num -= proc->lab6_priority; +} + +static void +ticket_proc_tick(struct run_queue *rq, struct proc_struct *proc) { + /* LAB6: YOUR CODE */ + if (proc->time_slice > 0) { + proc->time_slice --; + } + if (proc->time_slice == 0) { + proc->need_resched = 1; + } +} + struct sched_class default_sched_class = { .name = "stride_scheduler", .init = stride_init, @@ -161,3 +241,11 @@ struct sched_class default_sched_class = { .proc_tick = stride_proc_tick, }; +struct sched_class ticket_sched_class = { + .name = "ticket_scheduler", + .init = ticket_init, + .enqueue = ticket_enqueue, + .dequeue = ticket_dequeue, + .pick_next = ticket_pick_next, + .proc_tick = ticket_proc_tick, +}; diff --git a/labcodes_answer/lab6_result/kern/schedule/default_sched.h b/labcodes_answer/lab6_result/kern/schedule/default_sched.h index 2f21fbd..dd81154 100644 --- a/labcodes_answer/lab6_result/kern/schedule/default_sched.h +++ b/labcodes_answer/lab6_result/kern/schedule/default_sched.h @@ -4,6 +4,7 @@ #include extern struct sched_class default_sched_class; +extern struct sched_class ticket_sched_class; #endif /* !__KERN_SCHEDULE_SCHED_RR_H__ */ diff --git a/labcodes_answer/lab6_result/kern/schedule/sched.c b/labcodes_answer/lab6_result/kern/schedule/sched.c index 9298d89..cc70217 100644 --- a/labcodes_answer/lab6_result/kern/schedule/sched.c +++ b/labcodes_answer/lab6_result/kern/schedule/sched.c @@ -46,7 +46,7 @@ void sched_init(void) { list_init(&timer_list); - sched_class = &default_sched_class; + sched_class = &ticket_sched_class; rq = &__rq; rq->max_time_slice = MAX_TIME_SLICE; diff --git a/labcodes_answer/lab6_result/kern/schedule/sched.h b/labcodes_answer/lab6_result/kern/schedule/sched.h index 2b3230d..2908205 100644 --- a/labcodes_answer/lab6_result/kern/schedule/sched.h +++ b/labcodes_answer/lab6_result/kern/schedule/sched.h @@ -42,6 +42,7 @@ struct run_queue { int max_time_slice; // For LAB6 ONLY skew_heap_entry_t *lab6_run_pool; + uint32_t lab6_total_num; }; void sched_init(void);