觀察linux行為-實驗報告_第1頁
觀察linux行為-實驗報告_第2頁
觀察linux行為-實驗報告_第3頁
觀察linux行為-實驗報告_第4頁
觀察linux行為-實驗報告_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗二觀察Linux行為實驗時間6小時實驗?zāi)康膶W(xué)習(xí)Linux內(nèi)核、進(jìn)程、存儲和其他資源的一些重要特征。實驗?zāi)繕?biāo)編寫一個程序使用/proc機制檢查反映機器平均負(fù)載、進(jìn)程資源利用等方面的各種內(nèi)核值。在得到內(nèi)核狀態(tài)之后,將所觀察到的行為在屏幕上輸出。背景知識Linux、Solaris和其他版本的UNIX提供了一種非常有用的檢查內(nèi)核狀態(tài)機制,叫做/proc文件系統(tǒng)。這是可以用來完成本練習(xí)的關(guān)鍵機制。1. /proc文件系統(tǒng)/proc文件系統(tǒng)是一種操作系統(tǒng)機制,它的接口就像傳統(tǒng)UNIX文件系統(tǒng)的一個目錄(在根目錄中)??梢愿淖兊?proc正如改變到任何其他目錄,例如,bash$ cd /proc使/pr

2、oc作為當(dāng)前目錄。一旦把/proc作為當(dāng)前目錄,就可以用ls命令列出它的內(nèi)容。其內(nèi)容看起來像普通的文件和目錄。但是,/proc或者其子目錄中的文件實際上是讀取內(nèi)核變量并以ASCII字符串方式報告它們的程序。這些例程中的一些僅在偽文件打開時讀取內(nèi)核表,而其他例程在每次文件被訪問時讀表。因此各種讀函數(shù)的工作方式可能與預(yù)期的有所不同,因為它們并沒有在真正操作文件。Linux提供的/proc實現(xiàn)可以讀取很多不同的內(nèi)核表。/proc中包含一些目錄和文件,每個文件讀取一個或多個內(nèi)核變量。而具有數(shù)字名稱的子目錄包括更多的偽文件讀取其進(jìn)程ID和目錄名相同的進(jìn)程的有關(guān)信息。self目錄包含了正在使用/proc進(jìn)

3、程的特定進(jìn)程信息。/proc目錄樹的確切內(nèi)容隨Linux的版本而不同,所以必須對偽文件進(jìn)行實驗查看所提示的信息。/proc中的文件可以像普通的ASCII文件一樣進(jìn)行讀取。例如,向shell敲入以下命令:bash$ cat /proc/version將得到打印到stdout的類似下面的信息:Linux version 2.2.12 (gcc version egcs-2.91.66/Linux (egcs-1.1.2 release) #1 Mon Sep 27 10:40:35EDT 1999為了讀取一個偽文件的內(nèi)容,可以打開文件然后使用stdio程序庫中的例程如fgets()或者fscanf

4、()來讀取文件。所讀的確切文件(和表)依賴于所使用的特定Linux版本。想要知道到底有些什么文件接口通過/proc對你可用,請查看系統(tǒng)上的proc使用手冊頁。2使用argc和argv在程序的B部分和C部分,需要從shell向程序傳遞參數(shù)。Linux中,C主程序依然可以采用argc和argv來傳遞參數(shù)。具體用法這里不再贅述。問題陳述1. 編寫一個程序,通過檢查內(nèi)核狀態(tài)報告Linux內(nèi)核行為。程序在stdout上打印以下信息:l CPU類型和型號。l 內(nèi)核版本l 從系統(tǒng)最后一次啟動以來的時間,形式為dd:hh:mm:ss(例如,3天13小時46分32秒應(yīng)該寫出03:13:46:32)。2. 改寫A

5、部分程序,加入命令行參數(shù),在stdout上再打印以下信息:l CPU花費在用戶態(tài)、系統(tǒng)態(tài)和空閑態(tài)的時間。l 系統(tǒng)接收到的磁盤請求。l 內(nèi)核執(zhí)行的上下文轉(zhuǎn)換的次數(shù)。l 系統(tǒng)最后啟動的時間。l 從系統(tǒng)啟動開始創(chuàng)建的進(jìn)程數(shù)。3. 改寫B(tài)部分程序,根據(jù)不同的命令行參數(shù),在stdout上再打印以下信息:l 計算機配置的內(nèi)存數(shù)量。l 當(dāng)前可用的內(nèi)存數(shù)量。l 平均負(fù)載列表(至上一分鐘的平均數(shù))。該信息將使另外的程序可以查看各個時間的這些值,因此用戶可以了解平均負(fù)載如何隨時間間隔而變化。對于本程序,提供兩個命令行參數(shù):(1) 一個表明應(yīng)該以什么樣的頻率從內(nèi)核讀取平均負(fù)載。(2) 一個表明應(yīng)該以多長的時間間隔讀

6、取平均負(fù)載。A部分程序可以叫做ksamp,B部分程序ksamp s,C部分程序ksamp l 2 60,表示平均負(fù)載觀察將運行60秒,每隔2秒取樣一次。為了觀察系統(tǒng)上的負(fù)載,需要確保計算機正在做一些其他的工作而不是僅僅運行你的程序。例如,打開和關(guān)閉窗口、移動窗口,甚至在其他窗口運行一些程序。組織方案對于B部分和C部分,程序必須在命令行上有不同的參數(shù)。因此最先的動作之一應(yīng)該是解析調(diào)用程序的命令行以確定通過argv數(shù)組傳遞到它的shell參數(shù)??蓞⒖既缦麓a:int main( int argc, char *argv ) char repTypeName16;/ 決定報告類型reportType

7、 = STANDARD;strcpy( repTypeName, “Standard” );if ( argc 1) sscanf( argv1, “%c%c”, &c1, &c2 );if ( c1 != “-“ ) fprintf( stderr, “usage: observer -s -l int dur n” );exit(1);if ( c2 = s ) reportType = SHORT;strcpy( repTypeName, “Short” );if ( c2 = l ) reportType = LONG;strcpy( repTypeName, “Long” );int

8、ernal = atoi( argv2 );duration = atoi( argv3 );在得到今天的當(dāng)前時間并打印出一個包含你所檢查機器名字的問候之后,就完成了初始化工作。#include / 完成初始化gettimeofday( &now, NULL ); /得到當(dāng)天時間printf( “Status report type %s at %sn”, repTypeName, ctime( &( now.tv_sec ) ) );/ 得到主機文件名并打印它thisPorcFile = fopen( “/proc/sys/kernel/hostname”, “r” );fgets( lin

9、eBuf, LB_SIZE+1, thisPorcFile );printf( “Machine hostname: %s”, lineBuf );fclose( thisPorcFile );現(xiàn)在可以準(zhǔn)備開始工作,也就是說,通過使用各種/proc文件開始讀取內(nèi)核變量。上述代碼段包含一個如何讀取/proc/sys/kernel/hostname文件的例子??梢杂盟鳛樵屯ㄟ^讀取其他的偽文件來完成練習(xí),這需要對/proc進(jìn)行一些探索以及在研究不同的目錄時對各種偽文件進(jìn)行檢查。在C部分中將要計算平均負(fù)載。對于這個問題,代碼需要睡眠一段時間,醒來后采樣當(dāng)前平均負(fù)載,然后再返回睡眠狀態(tài)。這里是一段可

10、以完成該工作的代碼:while( iteration duration) sleep( interval );sampleLoadAvg();iteration += interval;實驗步驟1. 在proc文件系統(tǒng)中找出需要讀取的文件。2. 設(shè)計讀取proc文件系統(tǒng)中文件的方法。3. 設(shè)計讀取某文件指定標(biāo)識處內(nèi)容的方法。4. 完成問題陳述A。5. 完成問題陳述B。6. 完成問題陳述C。實驗結(jié)果1. 實驗步驟1的結(jié)果是什么?2. 請描述實驗步驟2的流程。3. 請描述實驗步驟3的流程。4. 請描述實驗步驟4的方案。5. 請描述實驗步驟5的方案。6. 請描述實驗步驟6的方案。實驗報告1. 引言L

11、inux 內(nèi)核提供了一種通過 /proc 文件系統(tǒng),在運行時訪問內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)、改變內(nèi)核設(shè)置的機制。 本次實驗所討論的就是利用該機制檢查反映機器平均負(fù)載、進(jìn)程資源利用等方面的各種內(nèi)核值。在得到內(nèi)核狀態(tài)之后,將所觀察到的行為在屏幕上輸出。工作步驟:編寫代碼查看CPU的配置信息;編寫ABC三個代碼段完成實驗要求。結(jié)果:完成了主要代碼的編寫及運行,實現(xiàn)了實驗要求,但是沒有進(jìn)行代碼的優(yōu)化。意義:了解了/proc機制,加深了gcc的使用,對LINUX的更多詳細(xì)信息有了進(jìn)一步的了解。2. 問題提出鑒于/proc機制,本實驗要解決的問題有:(1) 編寫程序在stdout上顯示/proc中文件(CPU的類型

12、和型號,所使用的Linux內(nèi)核版本,從系統(tǒng)最后一次啟動以來已經(jīng)經(jīng)歷了多長時間);(2) 改寫A程序,在stdout上顯示CPU花費在用戶態(tài)、系統(tǒng)態(tài)和空閑態(tài)的時間、系統(tǒng)接收到的磁盤請求、內(nèi)核執(zhí)行的上下文轉(zhuǎn)換的次數(shù)、系統(tǒng)最后啟動的時間、從系統(tǒng)啟動開始創(chuàng)建的進(jìn)程數(shù);(3) 改寫B(tài)程序,在stdout上顯示計算機配置的內(nèi)存數(shù)量、當(dāng)前可用的內(nèi)存數(shù)量、平均負(fù)載列表(至上一分鐘的平均數(shù));(4) 改寫C程序,計算平均負(fù)載。3. 解決方案3.1 顯示/proc中文件程序見附錄(1)。3.2 改寫ABC三部分程序詳見附錄(1)(2)(3)。4. 實驗結(jié)果1. 實驗步驟1的結(jié)果是:Cpuinfo version

13、uptime uptime stat diskstats meminfo .2. 步驟2的流程:對于直接顯示的文件信息,可以如下方式讀?。簑hile(ch!=EOF)printf(“%c”,ch);ch=fgetc(fp);/fp為文件指針,使用fgetc()函數(shù)依次讀取3. 步驟3的流程:對于需要讀取相應(yīng)參數(shù)值的可以用struct數(shù)據(jù)結(jié)構(gòu),然后顯示相應(yīng)的值:struct nameChar Int ;然后對應(yīng)結(jié)構(gòu)體的相應(yīng)參數(shù)讀取相應(yīng)的值,使用fread()函數(shù)讀取。4. 問題陳述A:首先需要知道所需的信息在哪個文件的哪個位置才可以準(zhǔn)確定位,因此打開文件cpuinfo,version,uptim

14、e,在讀出的文件里定位到需要的信息(CPU型號、內(nèi)核版本、系統(tǒng)最后一次啟動以來的時間),比如CPU型號在cpuinfo里面是第五項,先空讀4次,第五次讀出的就是CPU型號,打印出來(要注意時間格式),其它幾項同理。程序代碼見附錄(1)。5. 問題陳述B:(1)從文件/proc/stat可以得到CPU花費在用戶態(tài)、系統(tǒng)態(tài)和空閑態(tài)的時間;(2)從文件/proc/diskstats可以得到系統(tǒng)接收到的磁盤請求;(3)定位到內(nèi)核執(zhí)行的上下文轉(zhuǎn)換的次數(shù); (4)系統(tǒng)最后啟動的時間:用localtime函數(shù)把從1970-1-1零點零分到當(dāng)前時間系統(tǒng)所偏移的秒數(shù)時間轉(zhuǎn)換為日歷時間;(5)定位到從系統(tǒng)啟動開始

15、創(chuàng)建的進(jìn)程數(shù)。6. 問題陳述C:(1) 打開文件meminfo;(2) 定位到計算機配置的內(nèi)存數(shù)量;(3)定位到當(dāng)前可用的內(nèi)存數(shù)量;(4)平均負(fù)載列表(至上一分鐘的平均數(shù));(5)通過一個while求平均,每次循環(huán)先睡眠一段時間,喚醒后采樣當(dāng)前負(fù)載,然后再返回睡眠狀態(tài)。5. 結(jié)束語 在實驗過程開始時,我查閱了/proc文件系統(tǒng)的相關(guān)資料,/proc文件系統(tǒng)提供了一個基于文件的Linux內(nèi)部接口。老師已在實驗要求中給出了一部分程序范例,根據(jù)這些前期準(zhǔn)備進(jìn)行了實驗。實驗過程中。實驗?zāi)康幕就瓿?,但是代碼沒有進(jìn)行優(yōu)化,可能運行性能比較低。通過本次試驗,我了解了Linux內(nèi)核、進(jìn)程以及存儲的一些重要特

16、征,學(xué)習(xí)了一些在/proc文件系統(tǒng)中文件操作的函數(shù)。6. 附錄(1) A部分void func_A()int i,t,d,h,m,s;char c512;FILE * in1,* in2,* in3;in1=fopen(/proc/cpuinfo,r);/打開acpuinfo文件in2=fopen(/proc/version,r);/打開version文件in3=fopen(/proc/uptime,r);/打開auptime文件/獲取需要顯示的信息for(i=0;itm_year+1900, tp-tm_mon+1,tp-tm_mday,tp-tm_hour,tp-tm_min,tp-tm_

17、sec);/顯示系統(tǒng)最后啟動時間給用戶in1=fopen(/proc/stat,r);in2=fopen(/proc/diskstats,r);/打開文件fscanf(in1,%s %d %d %d %d,&c,&m,&n,&o,&p);/獲取所需信息量printf(用戶態(tài)時間:%d(0.01秒) 系統(tǒng)態(tài)時間:%d(0.01秒) 空閑態(tài)時間:%d(0.01秒)n,m,o,p);/顯示用戶態(tài)時間、系統(tǒng)態(tài)時間、空閑態(tài)時間while(fgets(c,512,in2)!=NULL)sscanf(c,%d %d %s %d %d %d %d %d,&m,&m,&d,&o,&m,&m,&m,&p);if(

18、d0=s)printf(系統(tǒng)接收到的磁盤請求 %s:讀 %d ,寫 %d ,總計%dn,d,o,p,o+p);break;while(fgets(c,512,in1)!=NULL)sscanf(c,%s %d,&d,&m);if(strcmp(d,ctxt)=0)/定位到內(nèi)核執(zhí)行的上下文轉(zhuǎn)換的次數(shù)printf(上下文轉(zhuǎn)換的次數(shù):%dn,m);if(strcmp(d,processes)=0)/定位到從系統(tǒng)啟動開始創(chuàng)建的進(jìn)程數(shù)printf(從系統(tǒng)啟動開始創(chuàng)建的進(jìn)程數(shù):%dn,m);fclose(in1);fclose(in2);fclose(in3);/關(guān)閉文件(3) C部分void func_C()FILE *in1,*in2; /定義2個文件指針char c512,d32; /存放信息的數(shù)組int t,iteration=0; float m;in1=fopen(/proc/meminfo,r);/打開meminfo文件while(fgets(c,512,in1)!=NULL)sscanf(c,%s %d,&d,&t);if(strcmp(d,MemTotal:)=0)/定位到計算機配置的內(nèi)存數(shù)量printf(計算機配置的內(nèi)存數(shù)量:%dn,t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論