内容发布更新时间 : 2024/12/23 14:44:41星期一 下面是文章的全部内容请认真阅读。
CPU、MM使用率:
create_CPU:当在主界面单击CPU Ratio按钮后弹出窗口的函数,并且调用函数Repaint进行画图 void create_CPU(GtkWidget* button, gpointer i) { GtkWidget *window; GtkWidget *drawing_area; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW(window), \ drawing_area = gtk_drawing_area_new (); gtk_container_add (GTK_CONTAINER(window), drawing_area); gtk_signal_connect(GTK_OBJECT (window), \ g_signal_connect( drawing_area, \ G_CALLBACK(Repaint), NULL ); gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), 200, 100); gtk_widget_show (drawing_area); gtk_widget_show_all(window); timer = gtk_timeout_add (1000, Repaint, (gpointer) drawing_area); } Repaint通过调用函数cal_load获得CPU的使用率,每隔一定时间进行重绘,并将CPU的使用率输出到窗口 gint Repaint (gpointer da) { GtkWidget * drawing_area = (GtkWidget *)da; GdkDrawable * drawable = drawing_area->window; GdkGC *gc_chart, *gc_text; GdkColor color; static unsigned coory[201]; int da_width, da_height; int x; float load; char buf[30]; // set chart green gc_chart = gdk_gc_new (drawing_area->window); color.red = 0; color.green = 0xffff; color.blue = 0; gdk_gc_set_rgb_fg_color(gc_chart, &color ); // set text red gc_text = gdk_gc_new (drawing_area->window); color.red = 0xffff; color.green = 0; color.blue = 0; gdk_gc_set_rgb_fg_color(gc_text, &color ); // getting size of drawing area da_width = drawing_area->allocation.width; da_height = drawing_area->allocation.height; gdk_draw_rectangle (drawable, drawing_area->style->white_gc,TRUE,0,0,da_width,da_height); // chart cpu load 21
for (x=0; x<200; x++) coory[x] = coory[x+1]; load = cal_load(); coory[x] = (int)(load * da_height); for(x=0;x total = d_user + d_nice + d_system + d_idle; if (total < 1) total = 1; scale = 1.0 / total; pre_user = user; pre_nice = nice; pre_system = system; pre_idle = idle; return (d_user + d_nice + d_system) * scale; } 同样的,有计算内存使用率的函数,内存使用率的实现除了使用率的计算函数与CPU的不一样之外,其他部分基本相同,不再赘述。 cal_load1通过分别从/proc/meminfo中获取MemTotal和Memfree两数相除,进行计算 float cal_load1 (void) { long total1; long free1; float scale; char buf1[50]; char buf2[50]; DevInfo(8,buf1);//Total DevInfo(9,buf2);//Free sscanf(buf1, \ %ld kB\ sscanf(buf2, \ %ld kB\ scale=(float)free1/(float)total1; return scale; } 3.5.3 功能演示 查找进程信息并杀死进程: 图3. 29 功能演示--查找杀死进程 23 图3. 30 功能演示--查找杀死进程2 运行一个新的程序: 图3. 31 功能演示--运行一个新的程序 图3. 32 功能演示--运行一个新的程序2 24 其他的功能在前面的模块设计部分已经基本讲清,不再赘述。 4 课程设计体会 在本次的课程设计中,我有很多收获。 首先,通过做题目,我对Linux系统即内核编译有了更深入的了解,并熟悉了GTK的程序设计。 在做实验的过程中,我浪费了大量时间编译Linux的内核,在使用虚拟机的情况下,编译内核的时间平均在三小时以上,但是由于对内核并不是很熟悉,在一些地方出了错误,因此不得不重新编译很多次。 原本我是在安装Ubuntu12.10的虚拟机下编译Linux-2.6.34.14的内核,但是每次载入新的内核后系统的速度都会变得很慢,每次按下鼠标的响应时间甚至大于10秒,这是令人绝对无法忍受的。 鉴于上述情况,我直接将Ubuntu10.04系统安装到了本机,在本机上使用Ubuntu速度很快,在编译内核时也可以使用make –j4 命令,使编译速度大大加快。 对于原本并不熟悉的GTK,一开始确实觉得束手无策。虽然可以从网上下载到符合题目要求的源程序,但是很难读懂,所以并没有对我起到多大的帮助。因为对GTK的库函数不熟悉,我在作第四题时主要采用的方法是先做需求分析,将需要实现的功能和与之对应的程序界面的控件列出,并将所需控件的数量尽量减少,经过分析把最基本的界面的程序写出来,以后再根据它进行扩展。 界面的问题解决后,主要的问题就是对/proc的文件内容的读取和筛选,并不是十分复杂。 但是在后来做杀死进程和创建新的进程时我遇到了困难,这个问题直至老师检查时还没有解决,后来检查时询问了老师,才将这两个功能顺利实现。 总之,这次的课程设计我有很多收获。 5 参考文献 [1]庞丽萍.操作系统原理.第四版.武汉:华中科技大学出版社. 25