提交 6af71821 编写于 作者: hm12299's avatar hm12299

add cpu utility

上级 b028d277
use lazy_static::*;
use core::cell::RefCell;
use crate::timer::get_time;
pub struct CpuStat{
inner: RefCell<CpuStatInner>,
}
struct CpuStatInner{
start: usize,
busy_start: usize,
sample_duration: usize,
sample_busy_duration: usize,
}
......@@ -16,8 +14,7 @@ impl CpuStat{
pub fn new() -> Self{
Self{
inner: RefCell::new(CpuStatInner{
start: get_time(),
busy_start: 0,
sample_duration: 0,
sample_busy_duration: 0,
}),
}
......@@ -29,25 +26,15 @@ lazy_static! {
pub static ref CPUSTAT: CpuStat = CpuStat::new();
}
pub fn add_sample_busy_duration(num: usize){
let mut inner = CPUSTAT.inner.borrow_mut();
inner.sample_busy_duration += num - inner.busy_start;
// println!("num: {} idle_start: {} all: {} start:{}",num, inner.busy_start, r_cycle(), inner.start);
//println!("add {}", num);
// println!("delta:{}", num - inner.busy_start);
// println!("duration:{} all:{}", inner.sample_busy_duration, r_cycle() - inner.start);
pub fn set_sample_busy_duration(num: usize){
CPUSTAT.inner.borrow_mut().sample_busy_duration = num;
}
pub fn set_busy_start(num: usize){
//println!("set start {}", num);
CPUSTAT.inner.borrow_mut().busy_start = num;
pub fn set_sample_duration(num: usize){
CPUSTAT.inner.borrow_mut().sample_duration = num;
}
pub fn get_cpu_info() -> (usize, usize){
let inner = CPUSTAT.inner.borrow_mut();
(get_time() - inner.start, inner.sample_busy_duration)
(inner.sample_duration, inner.sample_busy_duration)
}
pub fn get_busy_start() -> usize{
CPUSTAT.inner.borrow().busy_start
}
\ No newline at end of file
......@@ -7,7 +7,7 @@ use lazy_static::*;
use super::{fetch_task, TaskStatus};
use super::__switch;
use crate::trap::TrapContext;
use super::cpu::{add_sample_busy_duration, set_busy_start, get_busy_start};
use super::cpu::{set_sample_duration, set_sample_busy_duration};
use crate::timer::r_cycle;
pub struct Processor {
......@@ -36,6 +36,9 @@ impl Processor {
}
pub fn run(&self) {
//println!("run");
let mut all: usize = 0;
let mut busy_time:usize = 0;
let mut timestamp = get_time();
loop {
if let Some(task) = fetch_task() {
let busy_start = r_cycle();
......@@ -54,18 +57,29 @@ impl Processor {
//let mut task_inner = self.inner.borrow().current.unwrap().acquire_inner_lock();
//let inner_lock = self.inner.borrow_mut().current.as_ref().unwrap().acquire_inner_lock();
//let _ = inner_lock.stamp();
let busy_start = get_time();
unsafe {
__switch(
idle_task_cx_ptr2,
next_task_cx_ptr2,
);
}
//println!("set {}", get_time_ms());
set_busy_start(get_time());
busy_time += get_time() - busy_start;
//println!("out");
//task_inner.cpu_time += get_time_ms() - start_time;
}
let now = get_time();
all += now - timestamp;
timestamp = now;
if all / 12500 > 100{
//println!("1");
set_sample_duration(all);
set_sample_busy_duration(busy_time);
all = 0;
busy_time = 0;
}
}
}
pub fn take_current(&self) -> Option<Arc<TaskControlBlock>> {
......@@ -110,5 +124,4 @@ pub fn schedule(switched_task_cx_ptr2: *const usize) {
idle_task_cx_ptr2,
);
}
add_sample_busy_duration(get_time());
}
......@@ -4,7 +4,6 @@
{"message":"unused import: `get_time`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/syscall/process.rs","byte_start":192,"byte_end":200,"line_start":10,"line_end":10,"column_start":20,"column_end":28,"is_primary":true,"text":[{"text":"use crate::timer::{get_time, get_time_ms};","highlight_start":20,"highlight_end":28}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/syscall/process.rs","byte_start":192,"byte_end":202,"line_start":10,"line_end":10,"column_start":20,"column_end":30,"is_primary":true,"text":[{"text":"use crate::timer::{get_time, get_time_ms};","highlight_start":20,"highlight_end":30}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `get_time`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/syscall/process.rs:10:20\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m10\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse crate::timer::{get_time, get_time_ms};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
{"message":"unused import: `ToString`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/task/task.rs","byte_start":389,"byte_end":397,"line_start":16,"line_end":16,"column_start":29,"column_end":37,"is_primary":true,"text":[{"text":"use alloc::string::{String, ToString};","highlight_start":29,"highlight_end":37}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/task/task.rs","byte_start":387,"byte_end":397,"line_start":16,"line_end":16,"column_start":27,"column_end":37,"is_primary":true,"text":[{"text":"use alloc::string::{String, ToString};","highlight_start":27,"highlight_end":37}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `ToString`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/task/task.rs:16:29\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m16\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse alloc::string::{String, ToString};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\n"}
{"message":"unused import: `k210_hal::cache::Uncache`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/task/processor.rs","byte_start":98,"byte_end":122,"line_start":4,"line_end":4,"column_start":5,"column_end":29,"is_primary":true,"text":[{"text":"use k210_hal::cache::Uncache;","highlight_start":5,"highlight_end":29}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the whole `use` item","code":null,"level":"help","spans":[{"file_name":"src/task/processor.rs","byte_start":94,"byte_end":123,"line_start":4,"line_end":4,"column_start":1,"column_end":30,"is_primary":true,"text":[{"text":"use k210_hal::cache::Uncache;","highlight_start":1,"highlight_end":30}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `k210_hal::cache::Uncache`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/task/processor.rs:4:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m4\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse k210_hal::cache::Uncache;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\n"}
{"message":"unused import: `get_busy_start`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/task/processor.rs","byte_start":316,"byte_end":330,"line_start":10,"line_end":10,"column_start":60,"column_end":74,"is_primary":true,"text":[{"text":"use super::cpu::{add_sample_busy_duration, set_busy_start, get_busy_start};","highlight_start":60,"highlight_end":74}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/task/processor.rs","byte_start":314,"byte_end":330,"line_start":10,"line_end":10,"column_start":58,"column_end":74,"is_primary":true,"text":[{"text":"use super::cpu::{add_sample_busy_duration, set_busy_start, get_busy_start};","highlight_start":58,"highlight_end":74}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `get_busy_start`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/task/processor.rs:10:60\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m10\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse super::cpu::{add_sample_busy_duration, set_busy_start, get_busy_start};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^\u001b[0m\n\n"}
{"message":"unused import: `ToString`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/fs/proc.rs","byte_start":79,"byte_end":87,"line_start":3,"line_end":3,"column_start":29,"column_end":37,"is_primary":true,"text":[{"text":"use alloc::string::{String, ToString};","highlight_start":29,"highlight_end":37}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/fs/proc.rs","byte_start":77,"byte_end":87,"line_start":3,"line_end":3,"column_start":27,"column_end":37,"is_primary":true,"text":[{"text":"use alloc::string::{String, ToString};","highlight_start":27,"highlight_end":37}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `ToString`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/fs/proc.rs:3:29\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m3\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse alloc::string::{String, ToString};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\n"}
{"message":"unused import: `Deserialize`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/fs/proc.rs","byte_start":231,"byte_end":242,"line_start":10,"line_end":10,"column_start":23,"column_end":34,"is_primary":true,"text":[{"text":"use super::{Serialize,Deserialize};","highlight_start":23,"highlight_end":34}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/fs/proc.rs","byte_start":230,"byte_end":242,"line_start":10,"line_end":10,"column_start":22,"column_end":34,"is_primary":true,"text":[{"text":"use super::{Serialize,Deserialize};","highlight_start":22,"highlight_end":34}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `Deserialize`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/fs/proc.rs:10:23\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m10\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse super::{Serialize,Deserialize};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m\n\n"}
{"message":"unused imports: `sync::Arc`, `vec::Vec`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/fs/cpu.rs","byte_start":29,"byte_end":38,"line_start":2,"line_end":2,"column_start":13,"column_end":22,"is_primary":true,"text":[{"text":"use alloc::{sync::Arc, vec::Vec};","highlight_start":13,"highlight_end":22}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/fs/cpu.rs","byte_start":40,"byte_end":48,"line_start":2,"line_end":2,"column_start":24,"column_end":32,"is_primary":true,"text":[{"text":"use alloc::{sync::Arc, vec::Vec};","highlight_start":24,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the whole `use` item","code":null,"level":"help","spans":[{"file_name":"src/fs/cpu.rs","byte_start":17,"byte_end":50,"line_start":2,"line_end":2,"column_start":1,"column_end":34,"is_primary":true,"text":[{"text":"use alloc::{sync::Arc, vec::Vec};","highlight_start":1,"highlight_end":34}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `sync::Arc`, `vec::Vec`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/fs/cpu.rs:2:13\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m2\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse alloc::{sync::Arc, vec::Vec};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^\u001b[0m\n\n"}
......@@ -13,6 +12,6 @@
{"message":"unused import: `spin::Mutex`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/fs/cpu.rs","byte_start":158,"byte_end":169,"line_start":6,"line_end":6,"column_start":5,"column_end":16,"is_primary":true,"text":[{"text":"use spin::Mutex;","highlight_start":5,"highlight_end":16}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the whole `use` item","code":null,"level":"help","spans":[{"file_name":"src/fs/cpu.rs","byte_start":154,"byte_end":170,"line_start":6,"line_end":6,"column_start":1,"column_end":17,"is_primary":true,"text":[{"text":"use spin::Mutex;","highlight_start":1,"highlight_end":17}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `spin::Mutex`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/fs/cpu.rs:6:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m6\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse spin::Mutex;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m\n\n"}
{"message":"unused import: `super::TaskStatus`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/fs/cpu.rs","byte_start":211,"byte_end":228,"line_start":10,"line_end":10,"column_start":5,"column_end":22,"is_primary":true,"text":[{"text":"use super::TaskStatus;","highlight_start":5,"highlight_end":22}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the whole `use` item","code":null,"level":"help","spans":[{"file_name":"src/fs/cpu.rs","byte_start":207,"byte_end":229,"line_start":10,"line_end":10,"column_start":1,"column_end":23,"is_primary":true,"text":[{"text":"use super::TaskStatus;","highlight_start":1,"highlight_end":23}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `super::TaskStatus`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/fs/cpu.rs:10:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m10\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse super::TaskStatus;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^\u001b[0m\n\n"}
{"message":"unused import: `Deserialize`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/fs/cpu.rs","byte_start":252,"byte_end":263,"line_start":11,"line_end":11,"column_start":23,"column_end":34,"is_primary":true,"text":[{"text":"use super::{Serialize,Deserialize};","highlight_start":23,"highlight_end":34}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove the unused import","code":null,"level":"help","spans":[{"file_name":"src/fs/cpu.rs","byte_start":251,"byte_end":263,"line_start":11,"line_end":11,"column_start":22,"column_end":34,"is_primary":true,"text":[{"text":"use super::{Serialize,Deserialize};","highlight_start":22,"highlight_end":34}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused import: `Deserialize`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/fs/cpu.rs:11:23\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m11\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0muse super::{Serialize,Deserialize};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^\u001b[0m\n\n"}
{"message":"aborting due to 3 previous errors; 12 warnings emitted","code":null,"level":"error","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: aborting due to 3 previous errors; 12 warnings emitted\u001b[0m\n\n"}
{"message":"aborting due to 3 previous errors; 11 warnings emitted","code":null,"level":"error","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: aborting due to 3 previous errors; 11 warnings emitted\u001b[0m\n\n"}
{"message":"Some errors have detailed explanations: E0432, E0433.","code":null,"level":"failure-note","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1mSome errors have detailed explanations: E0432, E0433.\u001b[0m\n"}
{"message":"For more information about an error, try `rustc --explain E0432`.","code":null,"level":"failure-note","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1mFor more information about an error, try `rustc --explain E0432`.\u001b[0m\n"}
......@@ -78,145 +78,155 @@ pub fn main() {
while true {
//let proc_stat : [ProcStat; 20];
sleep(1000);
//let mut proc_info_buf: [u8; 3500] = [WHITE_SPACE; 3500];
let mut proc_info_buf: [u8; 3500] = [WHITE_SPACE; 3500];
let mut cpu_info_buf:[u8; 50] = [WHITE_SPACE; 50];
let sart_read_time = get_time();
//let c = getchar();
/*if c == 113{
exit(0);
}*/
//read(PROC_INFO, &mut proc_info_buf);
read(PROC_INFO, &mut proc_info_buf);
read(CPU_INFO,&mut cpu_info_buf);
let time_end = get_time();
let time_sec = (time_end - sart_time) / 1000;
let time_end_sec = time_end - sart_read_time;
//println!("{}",from_utf8(&buf).unwrap().to_string());
//let temp_proc_info = from_utf8(&proc_info_buf).unwrap().trim();
let temp_proc_info = from_utf8(&proc_info_buf).unwrap().trim();
let temp_cpu_info = from_utf8(&cpu_info_buf).unwrap().trim();
if time_sec > 40{
exit(0);
}
//let mut pool = Vec::new();
//let proc_stat: Vec<ProcInfoDirect> = from_str(&temp_proc_info).unwrap();
let mut pool = Vec::new();
let proc_stat: Vec<ProcInfoDirect> = from_str(&temp_proc_info).unwrap();
let cpu_stat: (usize,usize) = from_str(&temp_cpu_info).unwrap();
let cpu_per = cpu_stat.1*100/cpu_stat.0;
//let cpu_stat = ((100*from_str(&temp_cpu_info).unwrap().1)/(from_str(&temp_cpu_info).unwrap().0));
// pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
// pool.push(format_to_string_ln!(" rCore-Tutorial-v3 Resource Monitor CPU: {}% Time: {} s Read Time: {}ms",cpu_per, time_sec, time_end_sec));
// pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
// pool.push(format_to_string_ln!("Process | pid | ppid | status | heap | mem | cpu time | syscall | times | duration "));
// pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
// for i in 0..proc_stat.len() {
// if proc_stat[i].status == TaskStatus::Zombie {
// continue;
// }
// //println!("{} ", proc_stat[i].name);
// pool.push(format_to_string!(
// "{:<15}{:<10}{:<10}",
// proc_stat[i].name, proc_stat[i].pid, proc_stat[i].ppid
// ));
// match proc_stat[i].status {
// TaskStatus::Ready=> pool.push(format_to_string!("Ready")),
// TaskStatus::Running => pool.push(format_to_string!("Running")),
// _ => panic!("wrong status"),
// };
// pool.push(format_to_string!("\n{:<82}", ""));
// let sycall_cnt = proc_stat[i].syscall_cnt;
// if sycall_cnt.syscall_dup.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_DUP", sycall_cnt.syscall_dup.0, sycall_cnt.syscall_dup.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_open.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_OPEN", sycall_cnt.syscall_open.0, sycall_cnt.syscall_open.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_close.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_CLOSE", sycall_cnt.syscall_close.0, sycall_cnt.syscall_close.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_pipe.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_PIPE", sycall_cnt.syscall_pipe.0, sycall_cnt.syscall_pipe.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_read.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_READ", sycall_cnt.syscall_read.0, sycall_cnt.syscall_read.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_write.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_WRITE", sycall_cnt.syscall_write.0, sycall_cnt.syscall_write.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_yield.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_YIELD", sycall_cnt.syscall_yield.0, sycall_cnt.syscall_yield.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_get_time.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_GET_TIME",
// sycall_cnt.syscall_get_time.0,
// sycall_cnt.syscall_get_time.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_getpid.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_GETPID", sycall_cnt.syscall_getpid.0, sycall_cnt.syscall_getpid.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_fork.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_FORK", sycall_cnt.syscall_fork.0, sycall_cnt.syscall_fork.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_exec.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_EXEC", sycall_cnt.syscall_exec.0, sycall_cnt.syscall_exec.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// if sycall_cnt.syscall_waitpid.0 != 0 {
// pool.push(format_to_string!(
// "{:<18}{:<6} {}ms",
// "SYSCALL_WAITPID", sycall_cnt.syscall_waitpid.0, sycall_cnt.syscall_waitpid.1
// ));
// pool.push(format_to_string!("\n{:<82}", ""));
// }
// pool.push(format_to_string_ln!(""));
// }
// //pool.push(format_to_string!("-----------------------------------------------------------------------------------------------------------------------"));
// //println!("{} ", proc_stat[i].total_size);
// //println!("{} ", proc_stat[i].cpu_time);
// let whole = pool.join("");
// let cpu_stat = ((100*from_str(&temp_cpu_info).unwrap().1)/(from_str(&temp_cpu_info).unwrap().0));
pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
pool.push(format_to_string_ln!(" rCore-Tutorial-v3 Resource Monitor CPU: {}% Time: {} s Read Time: {}ms",cpu_per, time_sec, time_end_sec));
pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
pool.push(format_to_string_ln!("Core"));
pool.push(format_to_string!("["));
for i in 0..cpu_per{
pool.push(format_to_string!("|"));
}
for i in cpu_per..100{
pool.push(format_to_string!(" "));
}
pool.push(format_to_string_ln!("] {}%", cpu_per));
pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
pool.push(format_to_string_ln!("Process | pid | ppid | status | heap | mem | cpu time | syscall | times | duration "));
pool.push(format_to_string_ln!("-------------------------------------------------------------------------------------------------------------------------"));
for i in 0..proc_stat.len() {
if proc_stat[i].status == TaskStatus::Zombie {
continue;
}
//println!("{} ", proc_stat[i].name);
pool.push(format_to_string!(
"{:<15}{:<10}{:<10}",
proc_stat[i].name, proc_stat[i].pid, proc_stat[i].ppid
));
match proc_stat[i].status {
TaskStatus::Ready=> pool.push(format_to_string!("Ready")),
TaskStatus::Running => pool.push(format_to_string!("Running")),
_ => panic!("wrong status"),
};
pool.push(format_to_string!("\n{:<82}", ""));
let sycall_cnt = proc_stat[i].syscall_cnt;
if sycall_cnt.syscall_dup.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_DUP", sycall_cnt.syscall_dup.0, sycall_cnt.syscall_dup.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_open.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_OPEN", sycall_cnt.syscall_open.0, sycall_cnt.syscall_open.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_close.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_CLOSE", sycall_cnt.syscall_close.0, sycall_cnt.syscall_close.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_pipe.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_PIPE", sycall_cnt.syscall_pipe.0, sycall_cnt.syscall_pipe.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_read.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_READ", sycall_cnt.syscall_read.0, sycall_cnt.syscall_read.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_write.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_WRITE", sycall_cnt.syscall_write.0, sycall_cnt.syscall_write.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_yield.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_YIELD", sycall_cnt.syscall_yield.0, sycall_cnt.syscall_yield.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_get_time.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_GET_TIME",
sycall_cnt.syscall_get_time.0,
sycall_cnt.syscall_get_time.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_getpid.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_GETPID", sycall_cnt.syscall_getpid.0, sycall_cnt.syscall_getpid.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_fork.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_FORK", sycall_cnt.syscall_fork.0, sycall_cnt.syscall_fork.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_exec.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_EXEC", sycall_cnt.syscall_exec.0, sycall_cnt.syscall_exec.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
if sycall_cnt.syscall_waitpid.0 != 0 {
pool.push(format_to_string!(
"{:<18}{:<6} {}ms",
"SYSCALL_WAITPID", sycall_cnt.syscall_waitpid.0, sycall_cnt.syscall_waitpid.1
));
pool.push(format_to_string!("\n{:<82}", ""));
}
pool.push(format_to_string_ln!(""));
}
//pool.push(format_to_string!("-----------------------------------------------------------------------------------------------------------------------"));
//println!("{} ", proc_stat[i].total_size);
//println!("{} ", proc_stat[i].cpu_time);
let whole = pool.join("");
print!("\x1b[2J");
print!("\x1b[1;1H");
// print!("{}",whole);
println!("{},{}",cpu_stat.0,cpu_stat.1);
print!("{}",whole);
//println!("{},{}",cpu_stat.0,cpu_stat.1);
}
}
\ No newline at end of file
......@@ -14,7 +14,7 @@ pub fn main() {
let mut pid: isize = 0;
let runtime = [30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2];
let mut child_id: usize = 0;
for i in 0..32 {
for i in 0..6 {
pid = fork();
if pid == 0 {
child_id = i;
......@@ -25,10 +25,9 @@ pub fn main() {
if pid == 0 {
let time_start = get_time();
let x = 3;
let x = runtime[child_id];
while true {
let x = x * x - x * 3;
if get_time() - time_start > runtime[child_id] * 1000 {
break;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册