freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

linux基于c實現(xiàn)的郵件服務器性能監(jiān)控系統(tǒng)的設計(論文)(doc畢業(yè)設計論文)(編輯修改稿)

2025-07-16 14:13 本頁面
 

【文章內容簡介】 提供了有力的支持,C++是一種高彈性、高速度的面向對象編程語言,程序主體部分的編寫使用C++,增強系統(tǒng)運行效率的同時也大大提高系統(tǒng)的可復用性;Oracle數(shù)據(jù)庫功能的強大及其諸多優(yōu)點使其成為當今最流行的C/S體系結構的數(shù)據(jù)庫,因此系統(tǒng)中對數(shù)據(jù)的存儲使用Oracle作為數(shù)據(jù)庫,程序中使用PRO*C/C++對數(shù)據(jù)庫進行操作,以增強程序的可讀性。由于各個采集對象要有自己的時間間隔,因此系統(tǒng)中使用多進程(對每個對象的監(jiān)測都建立一個子進程),互不干擾;而對于用戶,想結束對某個對象的監(jiān)視,只須結束該對象所對應的進程即可。程序運行后為了不獨占終端,將其放入后臺執(zhí)行;程序運行后使用共享內存存儲其相關信息,以便與程序終止進程之間進行通信。從以上分析可見,該系統(tǒng)的構建是完全可行的。2.2 需求分析軟件的需求分析必須要有對原業(yè)務的一個深入了解、提取、抽象、升華的過程,管理軟件需求分析尤其如此。軟件的需求分析是從用戶的業(yè)務中提取出軟件系統(tǒng)能夠幫助用戶解決的業(yè)務問題,通過對用戶業(yè)務問題的分析,規(guī)劃出我們的軟件產(chǎn)品。這個步驟是對用戶業(yè)務需求的一個升華,是一個把用戶業(yè)務管理流程優(yōu)化,轉化為軟件產(chǎn)品,從而提升管理而實現(xiàn)的質的飛躍,這一步是否成功,直接關系到開發(fā)出來的軟件產(chǎn)品能否得到用戶認可,順利交付給客戶,客戶能否真正運用我們的產(chǎn)品幫助他解決業(yè)務或管理問題。本系統(tǒng)為郵件服務器性能監(jiān)視系統(tǒng),主要負責對郵件服務器性能進行定期采集并存儲到數(shù)據(jù)庫中以便使用者進行查詢和使用,因此應具備如下功能:1. 系統(tǒng)進行數(shù)據(jù)庫連接。2. 系統(tǒng)自動定期從LINUX郵件服務器采集性能信息,包括CPU、內存、硬盤、系統(tǒng)當前進程以及網(wǎng)絡流量等的相關信息,要求對五種信息的采集有各自不同的時間間隔,其中CPU、內存和網(wǎng)絡流量信息采集時間間隔為15秒,進程信息采集時間間隔為1分鐘,硬盤信息采集時間間隔為30分鐘。3. 采集信息后,通過過濾和計算取得需要的數(shù)據(jù)信息。4. 將得到的數(shù)據(jù)信息保存到先前連接的數(shù)據(jù)庫中。經(jīng)過以上分析后,得出系統(tǒng)用況圖,如圖21。圖21(用況圖)2.3 總體設計2.3.1 功能模塊設計程序中使用shell來取得郵件服務器中各部件的相關性能信息,然而這些信息當中有很多是我們所不需要的或者必須經(jīng)過計算才可以使用的,為了得到有用的信息,我們需要先將取得的所有信息通過重定向導出到本地文件中,然后按照各自的要求從文件中取得信息,并進行相應轉換和計算,最終生成用戶需要的數(shù)據(jù)。系統(tǒng)中監(jiān)視對象的監(jiān)視時間以及使用的模塊如表21所示,具體監(jiān)視信息以及使用的相應模塊中的函數(shù)如表22所示。監(jiān)視對象測試間隔監(jiān)視時間采集模塊收集模塊CPU15秒15秒CPUInfoCPUOra內存15秒15秒MemInfoMemOra硬盤30分鐘瞬時DiskInfoDiskOra進程1分鐘瞬時PsInfoPsOra網(wǎng)絡流量15秒15秒PackInfoPackOra表21監(jiān)視對象監(jiān)視信息采集函數(shù)收集函數(shù)CPU系統(tǒng)使用率sysCPUInfocpuTrans用戶使用率usrCPUInfo內存空閑數(shù)量freeMemInfomemTrans使用數(shù)量usedMemInfo硬盤空閑數(shù)量freeDiskInfodiskTrans使用數(shù)量usedDiskInfo進程進程號psPIDpsTrans進程名字psCMD網(wǎng)絡流量發(fā)送包的總量outPackAllpackTrans成功發(fā)送的數(shù)量outPackOK接收包的總量inPackAll成功接收的數(shù)量inPackOK表22下面來設計系統(tǒng)中使用的各個功能模塊的作用,同時確定其成員函數(shù):u Monitor:郵件服務器的性能監(jiān)視系統(tǒng)的啟動由Monitor類中的startMonitor函數(shù)來完成,而程序的終止則有函數(shù)stopMonitor來完成,initDeamon為守護進程,負責將系統(tǒng)放在后臺運行,以免獨占終端,transaction為startMonitor的一部分,負責并發(fā)運行對各個對象的性能監(jiān)視。u Oracle:在我們對數(shù)據(jù)庫服務器進行數(shù)據(jù)存儲之前,必須先確保已經(jīng)連接到數(shù)據(jù)庫服務器,而在程序終止時,應該主動與數(shù)據(jù)庫斷開連接,與數(shù)據(jù)庫的連接與斷開分別由connect函數(shù)和disconnect函數(shù)來完成。u 信息收集:該模塊包含五個類:CPUOra、MemOra、DiskOra、PsOra、PackOra。具體功能已經(jīng)在表21和表22中給出。這些類被Monitor所使用,因此他們之間的關系為單向關聯(lián)關系。u 信息采集:此模塊為信息收集模塊的一部分,是“hasa”關系,因此與信息收集模塊之間的關系為聚合關系。我們之所以將信息采集部分與收集部分由不同的類來實現(xiàn),主要是考慮信息收集部分中使用PRO*C對Oracle數(shù)據(jù)庫進行操作,因此必須經(jīng)過預編譯后才能與其他模塊一起使用,我們應該盡量減小預編譯文件中代碼的長度,從而降低系統(tǒng)開銷。該模塊同樣包含五個類:CPUInfo、MemInfo、DiskInfo、PsInfo、PackInfo,分別與信息收集模塊中各類相對應。硬盤信息和網(wǎng)絡流量信息在采集數(shù)據(jù)后還需要額外的計算,這部分內容分別放到各自類中,由getTotalVal函數(shù)來完成u SingleInfo:由于CPU、內存信息均為單條確定信息,為了減少代碼量、提高代碼的復用率,我們將CPU和內存信息采集共通部分的采集由getInfo函數(shù)來完成。u MoreInfo:對于硬盤信息的采集,由于其分區(qū)的不確定性,硬盤信息采集必須取得所有分區(qū)的使用狀況,并通過計算取得最終數(shù)據(jù),系統(tǒng)當前運行進程的數(shù)量同樣具有不確定性,因此我們把不確定信息采集方法抽象出來,由getMultiLineInfo函數(shù)來實現(xiàn)。網(wǎng)絡流量信息采集需要計算發(fā)送包的總量和接收包的總量,因此無論對于包的發(fā)送還是接收都要求取得成功的數(shù)量、錯誤的數(shù)量、丟棄的數(shù)量和忽略的數(shù)量,這些信息的采集由getMultiColInfo函數(shù)來實現(xiàn)。這些信息都保存在一個向量(_value_vector)中,供外界使用。u Information:在仔細考慮SingleInfo和MultiInfo兩個類后,發(fā)現(xiàn)兩個類中有很多公共的東西,因此將其公共部分抽象為一個基類——Information,e_to_line函數(shù)使當前文件指針到達具體某一行的開頭(文件指針和要達到的行數(shù)均由參數(shù)給定),而e_to_string函數(shù)使這個文件指針達到它當前所在行的某個字符串,也可以說是具體某一列(文件指針和要達到的列數(shù)同樣由參數(shù)設定),saveVal函數(shù)通過調用e_to_line和e_to_string函數(shù)來完成將當前文件指針所指文件中的某一行上的某個字符串(由參數(shù)設定)保存在成員變量_value中,以供子類使用。u CurTime:每一個性能收集模塊都需要記錄每次監(jiān)視的開始時間,以便日后查詢,時間的取得由getTime函數(shù)來完成,因其不受具體對象的影響,故將其設計為static。u Semophore:由于系統(tǒng)在對每個對象的信息采集結束后,要將數(shù)據(jù)插入數(shù)據(jù)庫,而系統(tǒng)五種對象的操作是并發(fā)執(zhí)行的,這就難免在對數(shù)據(jù)庫操作時產(chǎn)生沖突,為了避免沖突的產(chǎn)生,系統(tǒng)引入信號量,信號量的創(chuàng)建、刪除、申請、釋放分別由的createSem、deleteSem、request、release四個函數(shù)來完成。經(jīng)過以上分析后,得出系統(tǒng)的類圖,如圖22所示。圖22(類圖)2.3.2 數(shù)據(jù)庫設計當我們取得數(shù)據(jù)后必須將值保存在數(shù)據(jù)庫中,在數(shù)據(jù)庫中各種信息保存表格的格式設計是我們這一小節(jié)所要完成的任務。對于各個對象的具體監(jiān)視信息,我們在上一小節(jié)已經(jīng)介紹過(如表22),這些信息都是我們應該保存的,除此之外,我們還應該記錄測試開始時間,而對于CPU、內存、網(wǎng)絡流量等需要采集某段時間內信息的對象,還應該記錄一次測試的持續(xù)時間。由此我們得到以下各表:表項startTime(date)testTime(s)sysCPUInfo(%)usrCPUInfo(%)類型datenumber(3)numeric(5,2)numeric(5,2)表23(CPUINFO表)表項startTime(date)testTime(s)freeMemInfo(kb)usedMemInfo(kb)類型datenumber(3)number(8)number(8)表24(MEMINFO表)表項testTime(date)freeDiskVal(kb)usedDiskVal(kb)類型datenumber(10)number(10)表25(DISKINFO表)表項testTime(date)mandProcessID類型datevarchar2(20)varchar2(8)表26(PSINFO表)表項startTime(date)testTime(s)inPackAll(num)outPackAll(num)inPackOK(num)outPackOK(num)類型datenumber(3)number(10)number(10)number(10)number(10)表27(PACKINFO表)第三章 監(jiān)視器詳細設計本章主要講解一下監(jiān)視器的啟動以及終止部分的詳細設計,為了與LINUX下其他服務相統(tǒng)一,系統(tǒng)中允許用戶發(fā)出三種信號:start、stop、restart。當用戶發(fā)出start信號時,程序開始運行,stop信號則停止程序的運行,restart重新啟動監(jiān)視器。順序圖分別如圖31和圖32所示。信息的收集工作放在下一章來詳細講解,下面將針對系統(tǒng)主體部分的一些難點進行講解。3.1 進程概念的應用3.1.1 多進程的引入系統(tǒng)中要對CPU、內存、硬盤、進程、網(wǎng)絡流量等信息進行采集和收集,如果我們指定一個進程來順序執(zhí)行對所有對象的監(jiān)視,由于各個對象均有其各自的信息采集時間間隔,這就意味著一個對象的信息采集工作必須要等待它上一個對象采集工作完成之后才可以進行,這給多個對象信息監(jiān)視帶來了很大的不方便;而且我們希望在我們的系統(tǒng)中,各自的監(jiān)視時間可以由調用者指定,以增強系統(tǒng)的靈活性;為此我們必須讓每個對象的監(jiān)視之間互不干擾,這就要求對每個對象的操作應該是并發(fā)進行的。另外對于用戶,有可能只想了解對某個對象的監(jiān)視工作,這就要求我們的系統(tǒng)必須將這些對象的監(jiān)視工作分離開來,用戶可以查看到每個對象監(jiān)視工作的運行情況,也可以選擇終止該監(jiān)視。為了滿足以上要求,系統(tǒng)中引入多進程概念,我們在第一章已經(jīng)介紹了多進程的概念,下面針對本系統(tǒng)說一下如何使用多進程。Linux下一個進程在內存里有三部份的數(shù)據(jù),就是“數(shù)據(jù)段”,“堆棧段”和“代碼段”,其實學過匯編語言的人一定知道,一般的CPU象I386,都有上述三種段寄存器,以方便操作系統(tǒng)的運行?!按a段”,顧名思義,就是存放了程序代碼的數(shù)據(jù),假如機器中有數(shù)個進程運行相同的一個程序,那么它們就可以使用同一個代碼段。堆棧段存放的就是子程序的返回地址、子程序的參數(shù)以及程序的局部變量。而數(shù)據(jù)段則存放程序的全局變量,常數(shù)以及動態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間。這其中有許多細節(jié)問題,這里限于篇幅就不多介紹了。系統(tǒng)如果同時運行數(shù)個相同的程序,它們之間就不能使用同一個堆棧段和數(shù)據(jù)段。在Linux下產(chǎn)生新的進程的系統(tǒng)調用就是fork函數(shù),這個函數(shù)名是英文中“分叉”的意思。為什么取這個名字呢?因為一個進程在運行中,如果使用了fork,就產(chǎn)生了另一個進程,于是進程就“分叉”了,所以這個名字取得很形象。一個程序一旦調用fork函數(shù),系統(tǒng)就為一個新的進程準備了前述三個段,首先,系統(tǒng)讓新的進程與舊的進程使用同一個代碼段,因為它們的程序還是相同的,對于數(shù)據(jù)段和堆棧段,系統(tǒng)則復制一份給新的進程,這樣,父進程的所有數(shù)據(jù)都可以留給子進程,但是,子進程一旦開始運行,雖然它繼承了父進程的一切數(shù)據(jù),但實際上數(shù)據(jù)卻已經(jīng)分開,相互之間不再有影響了,也就是說,它們之間不再共享任何數(shù)據(jù)了。而如果兩個進程要共享什么數(shù)據(jù)的話,可以使用共享內存(我們在下一節(jié)來介紹)來操作?,F(xiàn)在,已經(jīng)是兩個進程了,對于父進程,fork函數(shù)返回了子程序的進程號,而對于子程序,fork函數(shù)則返回零,這樣,對于程序,只要判斷fork函數(shù)的返回值,就知道自己是處于父進程還是子進程中。在我們的程序當中,需要建立五個子進程,并在每個子進程中無終止地運行相應對象的監(jiān)視,直到用戶決定停止該子進程;而父進程在創(chuàng)建完子進程后必須等待所有這些子進程的執(zhí)行,一方面防止子進程成為僵尸進程(zombie),另一方面在所有子進程都結束后才可以與數(shù)據(jù)庫斷開連接,父進程等待子進程通過使用waitpid函數(shù)來實現(xiàn)。3.1.2 守護進程的實現(xiàn)本系統(tǒng)為郵件服務器性能監(jiān)視系統(tǒng),因此當用戶運行后,系統(tǒng)會無終止的運行下去,直到用戶決定停止檢測為止,為了使本系統(tǒng)運行后不獨占終端,我們引入守護進程來完成此功能,實現(xiàn)方法如下:1. 在后臺運行:為避免掛起控制終端將Daemon放入后臺執(zhí)行。方法是在進程中調用fork使父進程終止,讓Daemon在子進程中后臺執(zhí)行。if(pid=fork()) exit(0)。//是父進程,結束父進程,子進程繼續(xù)2. 脫離控制終端,登錄會話和進程組:先介紹一下Linux中的進程與控制終端,登錄會話和進程組之間的關系:進程屬于一個進程組,進程組號(GID)就是進程組長的進程號(PID)。登錄會話可以包含多個進程組。這些進程組共享一個控制終端。這個控制終端通常是創(chuàng)建進程的登錄終端??刂平K端,登錄會話和進程組通常是從父進程繼承下來的。我們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,調用setsid()使進程成為會話組長。當進程是會話組長時setsid()調用失敗。但第一點已經(jīng)保證進程不
點擊復制文檔內容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1