1. 程式人生 > >【Linux核心實驗】觀察Linux行為

【Linux核心實驗】觀察Linux行為

1. 實驗目的

學習 linux 核心、程序、儲存和其他資源的一些重要特性。

通過使用/proc 檔案系統介面,編寫一個程式檢查反映機器平衡負載、程序資源利用率方面的各種核心值

學會使用/proc檔案系統這種核心狀態檢查機制。

2. 實驗內容

編寫一個預設版本的程式通過檢查核心狀態報告 Linux 核心行為。

程式應該在stdout上列印以下值:

1) CPU 型別和型號;

2) 所使用的 Linux 核心版本;

3) 從系統最後一次啟動以來已經經歷了多長時間(天,小時和分鐘);

4) 總共有多少 CPU 時間執行在使用者態,系統態,空閒態;

5) 配置記憶體數量;當前可用記憶體數,磁碟讀寫請求數;

6) 核心上下文轉換數。

3. 實驗基礎

3.1 使用w命令檢視登入使用者正在使用的程序資訊

w命令用於顯示已經登入系統的使用者的名稱,以及他們正在做的事。

輸出的資訊包括:

w
w -h 
w -u
w -s

3.2 使用who命令檢視(登入)使用者名稱稱及所啟動的程序

who命令用於列舉出當前已登入系統的使用者名稱稱。

who
users

3.3 使用whoami命令檢視你所使用的登入名稱

whoami命令用於顯示登入的使用者名稱

whoami
id -un

3.4 檢視系統的資訊

last steve
cal 
find –name document

last命令可用於顯示特定使用者登入系統的歷史記錄。

該命令的輸出結果包含以下幾列資訊:

使用者名稱稱、tty裝置號、歷史登入時間日期、登出時間日期、總工作時間

3.5 /proc

cat /proc/cpuinfo      //CPU的型別和型號
cat /proc/version      //使用的Linux核心版本、編譯器版本
cat /proc/meminfo      //配置了多少記憶體                                      
cat /proc/stat         //有多少磁碟讀寫請求;從系統啟動以來已經建立了多少程序 

截圖量過大,在此略去

注:

tty裝置包括虛擬控制檯,串列埠以及偽終端裝置

idle是一個程序,其pid號為 0。其前身是系統建立的第一個程序,也是唯一一個沒有通過fork()產生的程序。在smp系統中,每個處理器單元有獨立的一個執行佇列,而每個執行佇列上又有一個idle程序,即有多少處理器單元,就有多少idle程序。系統的空閒時間,其實就是指idle程序的"執行時間"。idle程序pid==o,也就是init_task.

PID(Process Identification)指程序識別號,也就是程序識別符號。作業系統裡每開啟一個程式都會建立一個程序ID,即PID

JCPU  the CPU time used by all processes and their children on that terminal (in minutes:seconds)

PCPU  the CPU time used by the currently active processes (in minutes:seconds)

4. 實驗過程

編寫一個預設版本的程式通過檢查核心狀態報告 Linux 核心行為

程式如下:

#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	char repTypeName[16];
  	char c1, c2, ch;
  	int interval, duration;		//the gap of time and the period of time 
  	char *lineBuf;			//the buffer of line 
  	int LB_SIZE = 255; 		//the maximum length
  	FILE *thisProcFile;		//get the profile
  	struct timeval now; 
  	int iteration;			//record the interactive influence

	lineBuf = (char *)malloc(sizeof(char) * LB_SIZE);
	interval = 2;			//init parameter
	duration = 60;
	strcpy(repTypeName,"Standard");
	if(argc>1)       		/*the value of argc in Linux at least is 1.so make it bigger than 1,which means get over it when there is no parameter */   
	{
		sscanf(argv[1],"%c%c",&c1,&c2);
		if(c1 != '-')
		{
			fprintf(stderr,"usage:ksamp [-s][-l int dur]\n");
			exit(1);
		}
		if(c2 == 's')
		{
			strcpy(repTypeName,"Short");
		}
		if(c2 == 'l')
		{
			strcpy(repTypeName,"Long");
			interval = atoi(argv[2]);
			duration = atoi(argv[3]);
		}	
	}
	//get time
	gettimeofday(&now,NULL);
	printf("Status report %s at %s\n", repTypeName, ctime(&(now.tv_sec)));
	//correct the call of function ctime()
	//get the hostname
	thisProcFile = fopen("/etc/hostname","r");
	memset(lineBuf, 0, LB_SIZE);
	fgets(lineBuf, LB_SIZE - 1, thisProcFile);
	printf("Machine host name: %s\n",lineBuf);
	fclose(thisProcFile);
	//get the information of version
	thisProcFile = fopen("/proc/version","r");
	memset(lineBuf, 0, LB_SIZE);
	fgets(lineBuf, LB_SIZE - 1, thisProcFile);
	printf("Machine host name: %s\n",lineBuf);
	fclose(thisProcFile);
	//get the information of CPU
	thisProcFile = fopen("/proc/cpuinfo","r");
	memset(lineBuf, 0, LB_SIZE);
	fgets(lineBuf, LB_SIZE - 1, thisProcFile);
	printf("The CPU: %s\n",lineBuf);
	fclose(thisProcFile);
	//get the current time
	thisProcFile = fopen("/proc/uptime","r");
	memset(lineBuf, 0, LB_SIZE);
	fgets(lineBuf, LB_SIZE - 1, thisProcFile);
	printf("The Runing Time: %s\n",lineBuf);
	fclose(thisProcFile);
	//get the information of mem
	printf("The Meminfo: ");
	thisProcFile = fopen("/proc/meminfo", "r");
	while(!feof(thisProcFile))
	{
		putchar(fgetc(thisProcFile));
	}
	fclose(thisProcFile);
	//get the current status
	printf("The Meminfo: ");
	thisProcFile = fopen("/proc/stat", "r");
	while(!feof(thisProcFile))
	{
		putchar(fgetc(thisProcFile));
	}
	fclose(thisProcFile);
	iteration = 0;
	while(iteration < duration)
	{
		sleep(interval);
		thisProcFile = fopen("/proc/loadavg" ,"r");
		while(!feof(thisProcFile))
		{
			putchar(fgetc(thisProcFile));
		}
		fclose(thisProcFile);
		iteration += interval;
	}
	return 0;
}

原始碼c檔案命名為test4

注:

argc是命令列總的引數個數
argv[]是argc個引數,其中第0個引數是程式的全名,以後的引數命令列後面跟的使用者輸入的引數,
char *argv[]是一個字元陣列,其大小是int argc,主要用於命令列引數argv[],數組裡每個元素代表一個引數;

fgetc是一種計算機語言中的函式。意為從檔案指標stream指向的檔案中讀取一個字元,讀取一個位元組後,游標位置後移一個位元組putchar函式只能用於單個字元的輸出,且一次只能輸出一個字元

unistd.h是unix std的意思,是POSIX標準定義的unix類系統定義符號常量的標頭檔案,包含了許多UNIX系統服務的函式原型,例如read函式、write函式和getpid函式

time.h是c庫函式,那麼在具體的平臺上,就就可以依靠平臺而實現,所以看上去是與平臺無關的,誰都可以呼叫,而 sys/time.h 只是在linux系統上可以呼叫。

5. 參考引用