From 0e751d690fb9fe960ae9e7348b57830677cfc1d2 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Wed, 26 Mar 2025 20:17:38 +0800 Subject: [PATCH] optinal finished --- kernel/defs.h | 3 +-- kernel/proc.c | 22 +++++----------------- kernel/proc.h | 3 --- kernel/sysproc.c | 3 +-- user/sysinfo.c | 2 +- 5 files changed, 8 insertions(+), 25 deletions(-) diff --git a/kernel/defs.h b/kernel/defs.h index cbe6d66..e2e4eca 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -108,8 +108,7 @@ int either_copyout(int user_dst, uint64 dst, void *src, uint64 len); int either_copyin(void *dst, int user_src, uint64 src, uint64 len); void procdump(void); int proc_size(void); -int get_current_load(void); -void update_load_avg(void); +int update_load(void); // swtch.S void swtch(struct context *, struct context *); diff --git a/kernel/proc.c b/kernel/proc.c index 668bccb..ef26c81 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -5,8 +5,9 @@ #include "spinlock.h" #include "proc.h" #include "defs.h" +#include "sysinfo.h" -uint64 load_avg = 0; +uint64 current_load = 0; struct cpu cpus[NCPU]; @@ -453,6 +454,7 @@ scheduler(void) { struct proc *p; struct cpu *c = mycpu(); + /*update_load_avg();*/ c->proc = 0; for(;;){ @@ -469,6 +471,7 @@ scheduler(void) // before jumping back to us. p->state = RUNNING; c->proc = p; + current_load += 1; swtch(&c->context, &p->context); // Process is done running for now. @@ -705,21 +708,6 @@ proc_size() } int -get_current_load() { - struct proc *p; - int current_load = 0; - - for (p = proc; p < &proc[NPROC]; p++) { - if (p->state == RUNNING || p->state == RUNNABLE) { - current_load++; - } - } - +update_load() { return current_load; } - -void -update_load_avg() { - int current_load = get_current_load(); - load_avg = (load_avg * ALPHA) + (current_load * (1 - ALPHA)); -} diff --git a/kernel/proc.h b/kernel/proc.h index e220702..b14318b 100644 --- a/kernel/proc.h +++ b/kernel/proc.h @@ -1,7 +1,4 @@ #include "defs.h" -#define ALPHA 0.9 - -extern uint64 load_avg; // Saved registers for kernel context switches. struct context { diff --git a/kernel/sysproc.c b/kernel/sysproc.c index f114934..1b278d4 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -110,12 +110,11 @@ sys_sysinfo(void) uint64 addr; argaddr(0, &addr); if (addr < 0) return -1; - /*update_load_avg();*/ struct proc* p = myproc(); info.nproc = proc_size(); info.freemem = freemem(); info.unused_proc_num = NPROC - info.nproc; - info.load_avg = load_avg; + info.load_avg = update_load() * 100 / sys_uptime(); if (copyout(p->pagetable, addr, (char*)&info, sizeof(info)) < 0) return -1; return 0; diff --git a/user/sysinfo.c b/user/sysinfo.c index d862256..b85af14 100644 --- a/user/sysinfo.c +++ b/user/sysinfo.c @@ -15,7 +15,7 @@ int main() { printf(" Free Memory: %d bytes\n", info.freemem); printf(" Number of Processes: %d\n", info.nproc); printf(" Unused Process Slots: %d\n", info.unused_proc_num); - printf(" Load Average: %d\n", info.load_avg); + printf(" Load Average: %d / 100 \n", info.load_avg); exit(0); }