OS monitor 项目

项目目标

统计磁盘某个文件目录下子目录、子文件所占空间的大小
通过曲线图实时展示 CPU 占有率
掌握多线程编程技术
深入理解树的遍历方法

项目使用技术栈或平台

所用技术:javaSE/javafx
平台与环境:windows 10/jdk1.8/idea

项目功能

显示 CPU 占有率
文件目录扫描

项目演示

在这里插入图片描述
在这里插入图片描述

项目分模块讲解思路

项目总体模块框图
创建主程序
fxml 描述 UI
CPU 占有率 Tab 页设计
磁盘扫描 Tab 页设计
Controller 模块
系统资源获取模块
文件目录扫描模块

项目总体模块框图

OS Monitor 项目结构分为两部分:UI 部分逻辑部分
UI 部分包括:主程序、磁盘空间扫描 Tab 页、CPU 占有率 Tab 页、Controller。UI 部分是通过 javafx 来实现。
逻辑部分包括:系统资源获取、文件目录扫描。系统资源是通过OperatingSystemMXBean 来获取。
在这里插入图片描述

javafx

javaFX 是 JAVA 的 GUI 工具箱(GUI 是图形用户界面的缩写),用 JavaFX 创建桌面应用程序和游戏非常容易。

javaFX 已经取代了 Swing 成为 Java 推荐的 GUI 工具包。此外,JavaFX在设计上比 Swing 更一致,并 且具有更多功能。它也更现代,使您能够使用布局文件(XML)设计 GUI 并使用 CSS 设置样式,就像 我们习惯于 Web 应用程序一样。 JavaFX 还将 2D 和 3D 图形、图表,以及音频、视频和嵌入式Web应 用程序集成到一个一致的GUI工具包中。

Gluon 公司已经将 JavaFX 移植到了 Android 和 iOS 上运行。 javafx 的核心构架:
在这里插入图片描述
在这里插入图片描述

intel 系列 CPU 及其架构

CPU的起源可以一直追溯到1971年。在那一年,当时还处在起步阶段的Intel公司推出了世界上第一颗微处理器4004。这不但是第一个用于计算器的4位微处理器,也是第一款个人有能力买得起的电脑处理器!

Intel 8008 为世界上第一款八位元处理器。8008共推出两种速度,0.5 Mhz 以及 0.8 Mhz,虽然比 4004 的工作时慢,不过因为是八位元处理器(比起4004的四位元),整体效能要比4004好上许多。8008 可以支援到 16KB 的内存。Intel 8080 指令执行速度是8008的10倍。8080可寻址的范围(64KB)是8008(16KB)的4倍,这些改进导致进入了8080时代,并且使微处理器继续繁荣昌盛。Intel 8085 的主频,它低主频3 MHz,高主频也不过6MHz。当年使用此CPU的厂商非常多, 包括了AMD,TOSHIBA,FUJI,SIEMENS等等。

Intel 8086,Intel 公司在 1978 年首次生产出 16 位微处理器,并命名为 i8086。毫无疑问,8086是 在我们曾经的计算机课本中出现频率高的一个型号。

1982年,Intel 推出了划时代的新产品 80286 芯片,该芯片比 8086 和 8088 都有了飞跃的发展,虽然它仍旧是16位结构,但是在CPU的内部含有13.4万个晶体管,时钟频率由初的6MHz逐步提高到20MHz。其内部和外部数据总线皆为16位,地址总线24位。与 8086 相比,80286 寻址能力达到 了16MB,可以使用外存储设备模拟大量存储空间,从而大大扩展了80286的工作范围,还能通过多任务硬件机构使处理器在各种任务间来回快速切换,以同时运行多个任务,其速度比 8086 提高了5倍甚至 更多。从80286开始,CPU的工作方式也演变出两种来:实模式和保护模式。

1985 年, Intel 推出了80386 芯片,它是 80x86 系列中的第一种 32 位微处理器,而且制造工艺也有了很大的进步。与80286相比,80386内部内含27.5万个晶体管,时钟频率为12.5MHz,后逐步提高到20MHz、25MHz、33MHz。80386的内部和外部数据总线都是32位,地址总线也是32位,可寻址高达4GB内存。同时也是第一种具有“多任务 ”功能的处理器——这对微软的操作系统发展有着重要的影响,所谓“多任务”就是说处理器可以在同时处理几个程序的指令。1989年,Intel 推出 80486 芯片由,这种芯片的伟大之处就在于它实破了100 万个晶体管的界限, 集成了120万个晶体管。80486的时钟频率从25MHz逐步提高到33MHz、50MHz。80486是将80386和数学协处理器80387以及一个8KB的高速缓存集成在一个芯片内,并且在80x86系列中首次采用了 RISC(精简指令集)技术,可以在一个时钟周期内执行一条指令。它还采用了突发总线方式,大大提高 了与内存的数据交换速度。

1999年英特尔发布了Pentium III处理器。从Pentium III开始,英特尔又引入了 70 条新指令 (SIMD,SSE),主要用于因特网流媒体扩展(提升网络演示多媒体流、图像的性能)、3D、流式音频、视频和语音识别功能的提升。Pentium III 可以使用户有机会在网络上享受到高质量的影片,并以 3D的形式参观在线博物馆、商店等,Pentium III 处理器集成了950万个晶体管,并且是首个使用0.26微米技术的微处理器。Pentium III处理器也发生过错误的事故,可能使用户储存的数据出错,但是英特尔处理这类问题的措施已经炉火纯青,所以只是帮助部分受影响的客户更换主板或者更新微码就解决了该问题。但是另外一个更严重的事情是:英特尔在Pentium III开始引入了硬件序列号功能,每一片 Pentium III处理器都有独特的硬件序列号,这样就有可能区分出具体的某台电脑特征。不过很遗憾的是,世界上大多数人都对这个新特性非常不满;尤其是隐私保护团体不断游说,要求取消这个功能。这样,英特尔公司也作出了妥协,允许在硬件设置中关闭该功能,终在处理器内部取消了这个功能收 场。同样,Pentium III也有对应型号的 Celeron 处理器,来应对低端市场。 2000 年英特尔发布了Pentium 4 处理器,自此 Intel 来到了一个一统江湖的时代。基于Pentium 4 处理器的个人电脑,可以让用户创建专业品质的影片,透过因特网传递电视品质的影像,并进行实时语 音、影像通讯,实时3D渲染,快速进行MP3编码解码运算,在连接因特网时运行多个多媒体软件。

2001年英特尔安腾(Itanium)处理器 英特尔安腾处理器是英特尔推出的64位处理器家族中的首款产品。该处理器是在基于英特尔简明并行指令计算(EPIC)设计技术的全新架构之基础上开发制造的,设计用于高端、企业级服务器和工作站。该处理器能够为要求苛刻的企业和高性能计算应用(包括电子商务安全交易、大型数据库、计算机辅助的机械工程以及精密的科学和工程计算)提供全球出色的性能。

2002年:英特尔安腾2处理器(Itanium2) Intel Pentium 4 /Hyper Threading处理器

英特尔安腾2处理器是安腾处理器家族的第二位成员,同样是一款企业用处理器。该处理器家族为数据密集程度高、业务关键和技术要求高的计算应用提供英特尔架构的出色性能及规模经济等优势。该处理器能为数据库、计算机辅助工程、网上交易安全等提供领先的性能。2003年英特尔奔腾 M(Pentium M) /赛扬 M (Celeron M)处理器 英特尔奔腾M处理器,英特尔855芯片组家族以及英特尔PRO/无线2100网卡是英特尔迅驰? 移动计算技术的三大组成部分。英特尔迅驰移动计算技术专门设计用于便携式计算,具有内建的无线局域网能力和突破性的创新移动性能。该处理器支持更耐久的电池使用时间,以及更轻更薄的笔记本电脑造形。

2005年Intel Pentium D 处理器首颗内含2个处理核心的Intel Pentium D处理器登场,正式揭开x86处理器多核心时代。(绰号胶水 双核,被别人这样叫是有原因的,PD由于高频低能噪音大,所以才有这个称号)

2005年:Intel Core处理器 这是英特尔向酷睿架构迈进的第一步。但是,酷睿处理器并没有采用酷睿架构,而是介于NetBurst 和Core之间(第一个基于Core架构的处理器是酷睿2)。初酷睿处理器是面向移动平台的,它是英特 尔迅驰3的一个模块,但是后来苹果转向英特尔平台后推出的台式机就是采用的酷睿处理器。酷睿使双 核技术在移动平台上第一次得到实现。与后来的酷睿2类似,酷睿仍然有数个版本:Duo双核版,Solo 单核版。其中还有数个低电压版型号以满足对节电要求苛刻的用户的要求。

2006年:(酷睿2,俗称“”)/ 赛扬 Duo 处理器
Core微架构桌面/移动处理器:桌面处理器核心代号Conroe。将命名为Core 2 Duo/Extreme家族,其E6700 2.6GHz型号比先前推出之强的Intel Pentium D 960(3.6GHz)处理器,在效能方面提升了40%,省电效率亦增加40%,Core 2 Duo处理器内含2.91亿个晶体管。移动处理器核心代号 Merom。是迅驰3.5和迅驰4的处理器模块。当然这两种酷睿2有区别,主要的就是将FSB由 667MHz/533MHz提升到了800MHz。 2007年:Intel 四核心服务器用处理器 英特尔已经推出了若干四核台式机芯片,作为其双核Quad和Extreme家族的组成部分。在服务器 领域,英特尔将在其低电压3500和7300系列中交付使用不少于具有9个四核处理器的Xeons。
比特科技

2007年:Intel QX9770四核至强45nm处理器 先进制程带来的节能冷静,HI-K的引进使CPU更加稳定。先进的SSE4.1指令集、快速除法器,卓越 的执行效率,INTEL在处理器方面不断领先

2008年:Intel Atom凌动处理器 低至0.6W的超低功耗处理器,带给大家的是难以想象的节能与冷静

2008年11月17日:Intel发布core i7处理器 2009-2010分别推出之后 i5,i3 系列,至此Intel 家族 core 系列发布完毕

创建工程

打开IDEA,选择菜单新建 project.
在这里插入图片描述

创建主程序

将项目自动生成的主程序替换成我们的 OSMonitorApplication

// 所有 javafx 主程序必须派生自 Application 类 
// 子类必须 override 父类的 start 方法 
public class OSMonitorApplication extends Application {
    @Override    
    public void start(Stage primaryStage) throws Exception {        
    	// 1. 加载 .fxml 文件        
    	FXMLLoader loader = new 	
 		FXMLLoader(getClass().getClassLoader().getResource
 		("os_monitor_tab1.fxml")); 
    	Parent root = loader.load();
 		// 2. 创建一个场景对象                
 		Scene scene = new Scene(root, 800, 600);        
 		// 3. 给舞台对象设置标题        
 		primaryStage.setTitle("OS Monitor");        
 		// 4. 给舞台对象 stage 设置场景对象 scene        	
 		primaryStage.setScene(scene);       
 		// 5. 展示舞台        
 		primaryStage.show();    
 	} 
 }

fxml 描述 UI

我们要用自己设计的 UI 替换工程自动生成的 .fxml 文件。

UI 的主题框架是通过 fxml 来描述。UI 交互比较简单,只有两个 tab 页。fxml 中所有元素名称都是 javafx 中的类名或者是类的属性名。元素的属性是 javafx 中类的属性。

OS Monitor UI 主框架包含两个 tab 页,用到的控件是 和 。 代表 tab 页所在的容器面板, 代表一个个的 tab 页。

<?xml version="1.0" encoding="UTF-8"?> 
// 导入类路径 
<?import javafx.geometry.Insets?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="com.haska.ui.OSMonitorController">   
	<children>      
		<TabPane tabClosingPolicy="UNAVAILABLE">         
			<tabs>            
				<Tab onSelectionChanged="#handleCPUSelectionChanged" text="CPU 占有 率">               
					<content>                 
					...               
					</content>           
				</Tab>            
				<Tab text="磁盘空间统计">              
					 <content>                
					  ...               
					  </content>            
				</Tab>         
			</tabs>      
		</TabPane>   
	</children> 
</VBox> 

CPU 占有率 Tab 页设计

CPU 占有率 = CPU 执行程序时间 / 统计周期时间。比如,每 100ms 统计一次占用率,如果 CPU 执行 程序用了 90ms,那么 CPU 占用率是 90/100 = 90%。CPU 执行程序时间包括:用户程序执行时间 和 内核空间执行时间。

CPU 占有率 Tab 页主要是通过 控件绘制曲线图,x 轴 和 y 轴都用 控 件。通过 控件的 onSelectionChanged 属性设置监听事件的方法:
handleCPUSelectionChanged。

<LineChart fx:id="cpuChart" animated="false" HBox.hgrow="ALWAYS">   
	<xAxis>       
		<NumberAxis animated="false" label="Seconds" side="BOTTOM" />   
	</xAxis>   
	<yAxis>       
		<NumberAxis animated="false" label="Percent" side="LEFT" />   
	</yAxis> 
</LineChart>

磁盘扫描 Tab 页设计

磁盘扫描 Tab 页主要是用到了 控件,绘制一个树形表格。另外设计了一个 控件来选择文件目录,通 控件的 onAction 属性设置监听事件的方法: handleSelectFile。

<Label text="选择文件目录:"></Label> 
<Button mnemonicParsing="false" onAction="#handleSelectFile" prefWidth="80.0" text="选择" GridPane.columnIndex="1">   
	<GridPane.margin>      
		<Insets bottom="5.0" top="5.0" />   
	</GridPane.margin> 
</Button>

<TreeTableView fx:id="fileStat" HBox.hgrow="ALWAYS">   
	<columns>      
		<TreeTableColumn prefWidth="75.0" text="目录名">          
			<cellValueFactory>             
				<TreeItemPropertyValueFactory property="fileName" />          
			</cellValueFactory>      
		</TreeTableColumn>      
		<TreeTableColumn prefWidth="75.0" text="总长度">           
			<cellValueFactory>             
				<TreeItemPropertyValueFactory property="totalLength" />           
			</cellValueFactory>      
		</TreeTableColumn>  
	</columns> 
</TreeTableView>

Controller 模块

Controller 主要是用于处理 UI 事件,需要将此类添加到 .fxml 文件中,我们用到的顶级容器是 ,通过 fx:controller 属性设置 Controller 类的包路径,方法如下:

<VBox maxHeight="-Infinity" maxWidth="-Infinity" 
minHeight="-Infinity" minWidth="-Infinity" 	
xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.haska.ui.OSMonitorController">
</VBox>

在 Controller 中,我们需要处理两个事件:CPU占有率和目录结构统计,代码如下:

// 磁盘目录扫描事件处理方法 
public void handleSelectFile(ActionEvent actionEvent) {    
	// 1. 打开文件选择对话框    
	// 2. 开启磁盘目录扫描线程    
	// 3. 渲染TreeTableView 
} 
// CPU 占有率事件处理方法 
public void handleCPUSelectionChanged(Event event) {    
	// 1. 创建一个定时器,每隔一秒获取一次 CPU 资源绘制曲线图    
	// 2. 绘制 LineChart 
}

系统资源获取模块

系统资源获取采用的是 OperatingSystemMXBean,这是一个 JMX 接口,用于获取运行 JVM 的系统的 资源信息,比如,CPU 占有率,OS 版本,内存大小等等。我们用的是 com.sun.management.OperatingSystemMXBean 类,接口比较简单,参考官方文档即可。 绘制 CPU 占有率曲线的核心思想:
1. 每隔一秒对 CPU 占有率进行一次采样,作为数轴的 y 坐标。
2. 我们一共保存 60 秒,即 1 分钟的样本点,时间作为 x 坐标。
3. 用一个数组保存坐标 (x,y),每一次采样,需要把之前采样的坐标点的 x 坐标减 1,这样绘制的时候 就会产生移动的效果。
核心代码:

private static final int DATA_LENGH = 60; 
private static XYPair[] cpuDatas = new XYPair[DATA_LENGH]; 
private static int firstIndex = DATA_LENGH;

private static void moveCPUData(double cpuPercetage){        
	int movIdx = -1;        
	if (firstIndex == 0){            
		movIdx = firstIndex + 1;        
	}else {            
		movIdx = firstIndex;            
		firstIndex--;        
	}
	for (; movIdx < cpuDatas.length; ++movIdx){            
		cpuDatas[movIdx-1].setX(cpuDatas[movIdx].getX()-1);            		
		cpuDatas[movIdx-1].setY(cpuDatas[movIdx].getY());        
	}
    movIdx--;
    cpuDatas[movIdx] = new XYPair(movIdx, cpuPercetage); }

文件目录扫描模块

文件目录扫描比较简单,核心思想是:用递归的方式遍历文件目录结构,统计某个目录下面所有子目录 占用总的磁盘空间大小,然后再做一个汇总。
代码片段:

File[] files = node.getFile().listFiles(); 
if (files == null) {    
	return; 
}

for (File file : files) {   
	FileTreeNode child = new FileTreeNode();   child.setFile(file);   
	child.setFileName(file.getName());
  	if (file.isDirectory()) {        
  		scannerDirectory(child);   
  	} else {        t	T
  		child.setTotalLength(file.length());   
  	}   
  	node.setTotalLength(node.getTotalLength() + child.getTotalLength());  
  	node.addChildNode(child); 
}

项目总结

  • 项目优点:引入了 javafx 技术,通过图形化 界面展示 CPU 占有率和磁盘空间统计,显得更直观。
  • 项目缺点:项目的所实现的功能相对简单,UI 不够美观。
  • 项目扩展:我们还能将该项目写的更完善,可以往以下几个发展方向走:
    1. 增加关于内存使用情况的统计
    2. 增加关于网络上下行带宽的统计
    3. 可以美化一下 UI

常见项目面试题

  • 你为什么要做这个项目?
  • 你的项目有什么缺点?
  • 你的项目参考了什么项目?
  • 如何控制 CPU 占有率曲线为正弦波?
Runnable r = () -> {      
	double radix = 2.0;      
	int i = 0;      
	for (; ; ) {           
		double runtime = 100 + Math.sin((Math.PI * i++) / radix) * 100;           
		long startTime = System.currentTimeMillis();
		while (System.currentTimeMillis() - startTime < runtime) ;
        try {                   
        	Thread.sleep(200 - (long) runtime);           
        } catch (InterruptedException e) {                    
        	e.printStackTrace();           
        }       
     } 
}; 
// CPU core 个数,可以通过 OperatingSystemMXBean 获取 
for (int k = 0; k < 4; ++k){    
	Thread t = new Thread(r);    
	t.start(); 
}
try {     
	Thread.sleep(3600*1000); 
} catch (InterruptedException e) {     
	e.printStackTrace(); 
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值