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

正文內(nèi)容

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

2025-07-16 14:13 本頁面
 

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