4
(18分)调度器是操作系统内核中依据调度算法进行进程切换选择的模块。
1)试描述步进调度算法(Stride Scheduling)的基本原理。
2)请补全下面 ucore代码中调度器和步进调度算法实现中所缺代码,以实现调度器和调度算法的功能。提示:每处需要补全的代码最
少只需要一行,一共有9个空要填。
当然,你可以在需要补全代码的地方写多行来表达需要实现的功能,也允许修改已给出的代码。
3)试描述斜堆(skew heap)在这个步进调度算法中的作用。
```
kern/process/proc.h
==================== kern/process/proc.h ========================
#ifndef KERN_PROCESS_PROC_H
#define KERN_PROCESS_PROC_H
#include
#include
#include
#include
#include
// process's state in his life cycle
enum proc_state {
PROC_UNINIT = 0, // uninitialized
PROC_SLEEPING, // sleeping
PROC_RUNNABLE, // runnable(maybe running)
PROC_ZOMBIE, // almost dead, and wait parent proc to reclaim his resource
};
// Saved registers for kernel context switches.
// Don't need to save all the %fs etc. segment registers,
// because they are constant across kernel contexts.
// Save all the regular registers so we don't need to care
// which are caller save, but not the return register %eax.
// (Not saving %eax just simplifies the switching code.)
// The layout of context must match code in switch.S.
struct context {
uint32_t eip;
uint32_t esp;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
uint32_t esi;
uint32_t edi;
uint32_t ebp;
};
#define PROC_NAME_LEN 15
#define MAX_PROCESS 4096
#define MAX_PID (MAX_PROCESS 2)
extern list_entry_t proc_list;
struct proc_struct {
enum proc_state state; // Process state
int pid; // Process ID
int runs; // the running times of Proces
uintptr_t kstack; // Process kernel stack
volatile bool need_resched; // bool value: need to be rescheduled to release CPU?
struct proc_struct parent; // the parent process
struct mm_struct mm; // Process's memory management field
struct context context; // Switch here to run process
struct trapframe tf; // Trap frame for current interrupt
uintptr_t cr3; // CR3 register: the base addr of Page Directroy Table(PDT)
uint32_t flags; // Process flag
char name[PROC_NAME_LEN + 1]; // Process name
list_entry_t list_link; // Process link list
list_entry_t hash_link; // Process hash list
int exit_code; // exit code (be sent to parent proc)
uint32_t wait_state; // waiting state
struct proc_struct cptr, yptr, optr; // relations between processes
struct run_queue rq; // running queue contains Process
list_entry_t run_link; // the entry linked in run queue
int time_slice; // time slice for occupying the CPU
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)
};
#define PF_EXITING 0x00000001 // getting shutdown
#define WT_CHILD (0x00000001 | WT_INTERRUPTED)
#define WT_INTERRUPTED 0x80000000 // the wait state could be interrupted