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

正文內(nèi)容

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

2025-07-16 14:13 本頁面
 

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