张 龙 ,殷亚玲
(1西安欧亚学院 陕西 西安 710065;2西安财经学院 陕西 西安 710100)
Linux内存管理图形化的研究与实现
张 龙1,殷亚玲2
(1西安欧亚学院 陕西 西安 710065;2西安财经学院 陕西 西安 710100)
针对Linux操作系统的内核属性以及文件系统特性进行研究,利用Qt平台的图形化界面库,开发设计了一个Linux下图形界面的内存管理系统。可视化的图形界面使用户可以更加方便的对系统内存使用情况进行跟踪分析和管理。最后对系统进行了测试,达到了系统设计目标。
Linux;内存;进程;Qt
传统的Linux管理工作都是通过命令在终端实现的,没有图形界面的工具,不利于非专业用户的普及,Linux内存管理系统的图形化可以帮助非专业用户了解操作系统运行时的具体性能,可视化的界面操作也可以使他们对操作系统的内存管理更加容易,对于专业用户也提供了较为直观方便的监控方式,免除了命令行操作下的繁琐与抽象。
1 )内存的分配
在Linux中内存是以进程为单位进行分配的,Linux系统上所有运行的单位都可以称之为一个进程。因此所有运行的进程都要占用内存。
进程正式的定义是在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的,进程不是程序,虽然它由程序产生。程序不占用内存空间,是一段静态的代码,而进程是在Linux操作系统中占用内存空间的独立单位。
因此对内存的管理和监控就是以进程为单位进行的。
2 )Linux虚拟文件系统proc
Linux操作系统的文件系统中有一个叫做proc的文件系统十分特别,它包含了一些目录和虚拟文件。但是这些目录和文件并不是真正的文件,它不占用磁盘空间,只是内存信息的一个映射。这些虚拟文件可以向用户呈现内核的一些信息,也可以用作一种向内核发送信息的手段[1],这个虚拟文件系统在内核空间和用户空间之间建立了一个通信窗口,本文正是通过访问proc文件系统,对内存信息进行读取和管理。
3 )内存利用率
即已使用的物理内存占总物理内存的比例,是表示计算机系统内存使用情况的重要特征。
4 )平均负载率
平均负载率,是指在特定时间间隔内运行队列中的平均进程数。这个数据用以评估目前系统性能的高低。一般来说只要每个CPU所运行的当前活动进程数不大于3就表示系统性能良好;如果CPU的任务数大于5时,就表示该机器性能遇到严重问题。
1 )QT编译环境及编程环境
QT是一款跨平台的C++图形用户界面库,由挪威TrollTech公司出品,后被NOKIA公司收购。QT可支持多种操作系统,如Linux、Windows、MAC OS X等。
QT主要应用于嵌入式开发平台[2],可方便实现跨平台产品,这里使用的是较新的QT4.7版本。
2 )系统结构
软件分为两层架构:底层和界面显示部分。
将程序分为两层开发,可以有效地降低程序的复杂度,提高程序的可维护性。关于底层部分,需要解决的问题主要是Linux系统各项内存指标数据的获得和将得到的数据结构合理的封装,以备上层调用。
底层部分:由于软件设计要对Linux底层部分进行操作,因此这部分对Linux底层内存、进程及相关信息的读取与计算均使用C语言编写,该部分为程序的内核部分代码。主要负责进程、内存信息的读取、数据格式的转换、数据结构的封装并为上层应用程序提供接口。
界面显示部分:此处用Qt creator工具进行内存管理界面的图形化,负责将从下层得到的数据结构解封装后,有序的显示在图形界面中,并对进程的管理进行图形化操作。
3 )具体实现
要以进程为单位对内存进行管理,在Linux操作系统中,通常是以进程的id号来确认进程的,这里就需要对Linux内存的进程号进行遍历并加以保存,实现过程分为以下5个步骤:
①内存信息流文件的访问
通过调用 open、close、read和 write对 proc文件系统进行操作读取相应的内存信息[3]。
②进程id的遍历
为了得到Linux操作系统中所有进程的内存信息,必须将所有进程的id遍历出来。
实现进程id遍历有很多种方法,比如遍历task_struct链表,或者建立进程的hash表来解决这一问题,这样可以快速通过进程id获取当前进程描述符,但是考虑到此时程序必须运行在内核态,才可以访问进程的内核内存空间的指针,在Qt下实现比较困难,而且由于内核版本的更新,hash表的命名可能会发生改变,对于不同版本的移植也造成极大困难,使程序的可移植性变差[4]。因此本文为了使程序具备可良好的移植性,结合Linux系统文件系统的一般特性,采用遍历/proc目录下的文件的方法以达到遍历进程的目的。
主要算法如下:
③数据的选取
通过遍历proc文件系统,将系统的内存信息以及每个进程的信息读取出来并加以处理。Linux将内存信息映射在/proc目录下的meminfo文件中[5],系统需要使用其中有用的Totalmemory、Freememory、Buffers、Cached 、SwapTotal 以 及SwapFree这几个项目的数据,选取其中一部分读取出来,包括pid,进程名,动态优先级,使用内存大小,运行时间,运行状态等。
④整体数据结构设计
保存内存等数据,使用结构体类型封装。考虑到包含的数据类型和种类。对于Linux系统的整体内存情况,平均负载等,将其封装如下:这样展示层就可以直接通过调用结构体指针来获取其中的数据。
⑤软件界面的设计
界面设计使用QT Creator作为工具,需要展示的数据主要包括内存使用信息及内存利用率,系统平均负载率,以及进程的状况和内存使用信息,将这些数据分开放置于QTabWidgt中的三个界面上,将从底层获取到的结构体中的数据转换格式后放置于QLabel控件[6]上。
内存信息显示界面如图1所示。
图1 内存管理信息Fig.1 Memory information
系统平均负载如图2所示。
进程信息如图3所示。
图2 平均负载Fig.2 Average load
图3 进程信息Fig.3 Process information
本文基于Linux内核研究,使用QT平台开发的Linux操作系统内存管理图形化工具很好的解决了传统的Linux管理工作只能通过命令在终端实现的缺点,不直观,也不利于非专业用户的普及,可视化管理界面更加直观,也使非专业用户对Linux操作系统的内存管理更加容易。通过测试,该系统的基本功能已全部实现,满足了日常内存管理的基本需求。
[1]吴国伟.Linux内核分析与高级教程[M].北京:清华大学出版社,2012,8.
[2]Xteam(中国)软件技术有限公司.QT程序设计[M].北京:清华大学出版社,2002.
[3]毛德操.LINUX内核源代码情景分析[M].杭州:浙江大学出版社,2001.
[4]陈爽.Linux与Qt程序设计 [M].北京:清华大学出版社,2011,12.
[5]Daniel Solin.24小时学通Qt编程[M].北京:人民邮电出版社,2000.
[6]倪继利.Qt及Linux操作系统窗口设计[M].北京:电子工业出版社,2005.
Research and implementation of linux memory manager graphical interface
ZHANG Long1,YIN Ya-ling2
(1.Xi’an Eurasia University,Information Engineering School,Xi’an 710065,China;2.Xi’an University Of Finance And Economics,Information School,Xi’an 710100,China)
In this paper,based on research the kernel attribute of Linux system operation and file system properties,we design and implement a Linux graphical interface system of memory management,with the Qt platform graphical interface library.Using the graphic visualization interface,users can more convenient to track,analyze and management system memory usage.The result of test show that our system reached the aim of the design.
Linux;memory;process;Qt
TP315
A
1674-6236(2014)13-0072-03
2013-10-11 稿件编号:201310061
张 龙(1977—),男,陕西西安人,讲师。研究方向:软件工程。