張 龍 ,殷亞玲
(1西安歐亞學(xué)院 陜西 西安 710065;2西安財(cái)經(jīng)學(xué)院 陜西 西安 710100)
Linux內(nèi)存管理圖形化的研究與實(shí)現(xiàn)
張 龍1,殷亞玲2
(1西安歐亞學(xué)院 陜西 西安 710065;2西安財(cái)經(jīng)學(xué)院 陜西 西安 710100)
針對(duì)Linux操作系統(tǒng)的內(nèi)核屬性以及文件系統(tǒng)特性進(jìn)行研究,利用Qt平臺(tái)的圖形化界面庫,開發(fā)設(shè)計(jì)了一個(gè)Linux下圖形界面的內(nèi)存管理系統(tǒng)。可視化的圖形界面使用戶可以更加方便的對(duì)系統(tǒng)內(nèi)存使用情況進(jìn)行跟蹤分析和管理。最后對(duì)系統(tǒng)進(jìn)行了測(cè)試,達(dá)到了系統(tǒng)設(shè)計(jì)目標(biāo)。
Linux;內(nèi)存;進(jìn)程;Qt
傳統(tǒng)的Linux管理工作都是通過命令在終端實(shí)現(xiàn)的,沒有圖形界面的工具,不利于非專業(yè)用戶的普及,Linux內(nèi)存管理系統(tǒng)的圖形化可以幫助非專業(yè)用戶了解操作系統(tǒng)運(yùn)行時(shí)的具體性能,可視化的界面操作也可以使他們對(duì)操作系統(tǒng)的內(nèi)存管理更加容易,對(duì)于專業(yè)用戶也提供了較為直觀方便的監(jiān)控方式,免除了命令行操作下的繁瑣與抽象。
1 )內(nèi)存的分配
在Linux中內(nèi)存是以進(jìn)程為單位進(jìn)行分配的,Linux系統(tǒng)上所有運(yùn)行的單位都可以稱之為一個(gè)進(jìn)程。因此所有運(yùn)行的進(jìn)程都要占用內(nèi)存。
進(jìn)程正式的定義是在自身的虛擬地址空間運(yùn)行的一個(gè)單獨(dú)的程序。進(jìn)程與程序是有區(qū)別的,進(jìn)程不是程序,雖然它由程序產(chǎn)生。程序不占用內(nèi)存空間,是一段靜態(tài)的代碼,而進(jìn)程是在Linux操作系統(tǒng)中占用內(nèi)存空間的獨(dú)立單位。
因此對(duì)內(nèi)存的管理和監(jiān)控就是以進(jìn)程為單位進(jìn)行的。
2 )Linux虛擬文件系統(tǒng)proc
Linux操作系統(tǒng)的文件系統(tǒng)中有一個(gè)叫做proc的文件系統(tǒng)十分特別,它包含了一些目錄和虛擬文件。但是這些目錄和文件并不是真正的文件,它不占用磁盤空間,只是內(nèi)存信息的一個(gè)映射。這些虛擬文件可以向用戶呈現(xiàn)內(nèi)核的一些信息,也可以用作一種向內(nèi)核發(fā)送信息的手段[1],這個(gè)虛擬文件系統(tǒng)在內(nèi)核空間和用戶空間之間建立了一個(gè)通信窗口,本文正是通過訪問proc文件系統(tǒng),對(duì)內(nèi)存信息進(jìn)行讀取和管理。
3 )內(nèi)存利用率
即已使用的物理內(nèi)存占總物理內(nèi)存的比例,是表示計(jì)算機(jī)系統(tǒng)內(nèi)存使用情況的重要特征。
4 )平均負(fù)載率
平均負(fù)載率,是指在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中的平均進(jìn)程數(shù)。這個(gè)數(shù)據(jù)用以評(píng)估目前系統(tǒng)性能的高低。一般來說只要每個(gè)CPU所運(yùn)行的當(dāng)前活動(dòng)進(jìn)程數(shù)不大于3就表示系統(tǒng)性能良好;如果CPU的任務(wù)數(shù)大于5時(shí),就表示該機(jī)器性能遇到嚴(yán)重問題。
1 )QT編譯環(huán)境及編程環(huán)境
QT是一款跨平臺(tái)的C++圖形用戶界面庫,由挪威TrollTech公司出品,后被NOKIA公司收購(gòu)。QT可支持多種操作系統(tǒng),如Linux、Windows、MAC OS X等。
QT主要應(yīng)用于嵌入式開發(fā)平臺(tái)[2],可方便實(shí)現(xiàn)跨平臺(tái)產(chǎn)品,這里使用的是較新的QT4.7版本。
2 )系統(tǒng)結(jié)構(gòu)
軟件分為兩層架構(gòu):底層和界面顯示部分。
將程序分為兩層開發(fā),可以有效地降低程序的復(fù)雜度,提高程序的可維護(hù)性。關(guān)于底層部分,需要解決的問題主要是Linux系統(tǒng)各項(xiàng)內(nèi)存指標(biāo)數(shù)據(jù)的獲得和將得到的數(shù)據(jù)結(jié)構(gòu)合理的封裝,以備上層調(diào)用。
底層部分:由于軟件設(shè)計(jì)要對(duì)Linux底層部分進(jìn)行操作,因此這部分對(duì)Linux底層內(nèi)存、進(jìn)程及相關(guān)信息的讀取與計(jì)算均使用C語言編寫,該部分為程序的內(nèi)核部分代碼。主要負(fù)責(zé)進(jìn)程、內(nèi)存信息的讀取、數(shù)據(jù)格式的轉(zhuǎn)換、數(shù)據(jù)結(jié)構(gòu)的封裝并為上層應(yīng)用程序提供接口。
界面顯示部分:此處用Qt creator工具進(jìn)行內(nèi)存管理界面的圖形化,負(fù)責(zé)將從下層得到的數(shù)據(jù)結(jié)構(gòu)解封裝后,有序的顯示在圖形界面中,并對(duì)進(jìn)程的管理進(jìn)行圖形化操作。
3 )具體實(shí)現(xiàn)
要以進(jìn)程為單位對(duì)內(nèi)存進(jìn)行管理,在Linux操作系統(tǒng)中,通常是以進(jìn)程的id號(hào)來確認(rèn)進(jìn)程的,這里就需要對(duì)Linux內(nèi)存的進(jìn)程號(hào)進(jìn)行遍歷并加以保存,實(shí)現(xiàn)過程分為以下5個(gè)步驟:
①內(nèi)存信息流文件的訪問
通過調(diào)用 open、close、read和 write對(duì) proc文件系統(tǒng)進(jìn)行操作讀取相應(yīng)的內(nèi)存信息[3]。
②進(jìn)程id的遍歷
為了得到Linux操作系統(tǒng)中所有進(jìn)程的內(nèi)存信息,必須將所有進(jìn)程的id遍歷出來。
實(shí)現(xiàn)進(jìn)程id遍歷有很多種方法,比如遍歷task_struct鏈表,或者建立進(jìn)程的hash表來解決這一問題,這樣可以快速通過進(jìn)程id獲取當(dāng)前進(jìn)程描述符,但是考慮到此時(shí)程序必須運(yùn)行在內(nèi)核態(tài),才可以訪問進(jìn)程的內(nèi)核內(nèi)存空間的指針,在Qt下實(shí)現(xiàn)比較困難,而且由于內(nèi)核版本的更新,hash表的命名可能會(huì)發(fā)生改變,對(duì)于不同版本的移植也造成極大困難,使程序的可移植性變差[4]。因此本文為了使程序具備可良好的移植性,結(jié)合Linux系統(tǒng)文件系統(tǒng)的一般特性,采用遍歷/proc目錄下的文件的方法以達(dá)到遍歷進(jìn)程的目的。
主要算法如下:
③數(shù)據(jù)的選取
通過遍歷proc文件系統(tǒng),將系統(tǒng)的內(nèi)存信息以及每個(gè)進(jìn)程的信息讀取出來并加以處理。Linux將內(nèi)存信息映射在/proc目錄下的meminfo文件中[5],系統(tǒng)需要使用其中有用的Totalmemory、Freememory、Buffers、Cached 、SwapTotal 以 及SwapFree這幾個(gè)項(xiàng)目的數(shù)據(jù),選取其中一部分讀取出來,包括pid,進(jìn)程名,動(dòng)態(tài)優(yōu)先級(jí),使用內(nèi)存大小,運(yùn)行時(shí)間,運(yùn)行狀態(tài)等。
④整體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
保存內(nèi)存等數(shù)據(jù),使用結(jié)構(gòu)體類型封裝??紤]到包含的數(shù)據(jù)類型和種類。對(duì)于Linux系統(tǒng)的整體內(nèi)存情況,平均負(fù)載等,將其封裝如下:這樣展示層就可以直接通過調(diào)用結(jié)構(gòu)體指針來獲取其中的數(shù)據(jù)。
⑤軟件界面的設(shè)計(jì)
界面設(shè)計(jì)使用QT Creator作為工具,需要展示的數(shù)據(jù)主要包括內(nèi)存使用信息及內(nèi)存利用率,系統(tǒng)平均負(fù)載率,以及進(jìn)程的狀況和內(nèi)存使用信息,將這些數(shù)據(jù)分開放置于QTabWidgt中的三個(gè)界面上,將從底層獲取到的結(jié)構(gòu)體中的數(shù)據(jù)轉(zhuǎn)換格式后放置于QLabel控件[6]上。
內(nèi)存信息顯示界面如圖1所示。
圖1 內(nèi)存管理信息Fig.1 Memory information
系統(tǒng)平均負(fù)載如圖2所示。
進(jìn)程信息如圖3所示。
圖2 平均負(fù)載Fig.2 Average load
圖3 進(jìn)程信息Fig.3 Process information
本文基于Linux內(nèi)核研究,使用QT平臺(tái)開發(fā)的Linux操作系統(tǒng)內(nèi)存管理圖形化工具很好的解決了傳統(tǒng)的Linux管理工作只能通過命令在終端實(shí)現(xiàn)的缺點(diǎn),不直觀,也不利于非專業(yè)用戶的普及,可視化管理界面更加直觀,也使非專業(yè)用戶對(duì)Linux操作系統(tǒng)的內(nèi)存管理更加容易。通過測(cè)試,該系統(tǒng)的基本功能已全部實(shí)現(xiàn),滿足了日常內(nèi)存管理的基本需求。
[1]吳國(guó)偉.Linux內(nèi)核分析與高級(jí)教程[M].北京:清華大學(xué)出版社,2012,8.
[2]Xteam(中國(guó))軟件技術(shù)有限公司.QT程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2002.
[3]毛德操.LINUX內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2001.
[4]陳爽.Linux與Qt程序設(shè)計(jì) [M].北京:清華大學(xué)出版社,2011,12.
[5]Daniel Solin.24小時(shí)學(xué)通Qt編程[M].北京:人民郵電出版社,2000.
[6]倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計(jì)[M].北京:電子工業(yè)出版社,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 稿件編號(hào):201310061
張 龍(1977—),男,陜西西安人,講師。研究方向:軟件工程。