【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. 參考引用