⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 observer.txt

📁 该程序使用/proc机制检查反映机器平均负载
💻 TXT
字号:
linux内核实验练习一

练习一目的是想让我们通过编写与proc虚拟文件系统的接口程序快速的熟悉内核的一些重要特征。
在此首先说明一下proc文件系统和他在系统调试中所起的作用.

使用proc文件系统主要的优点在于:
1.应用程序获取系统内核数据无需切换到系统态,从而增加了系统的安全性。例如ps命令就是通过proc获取进程信息的。
2.当内核版本升级时,须读取内核信息的应用程序无需改动,从而改进了应用程序的兼容性。
3.应用程序还可以通过proc跟踪和调试内核。
4.应用程序可以通过proc直接改变内核参数,无需重新编译内核就可以改变或优化内核行为。


/proc是一个虚拟文件系统,他以文件系统的形式向用户提供系统当前的运行状态。这就为用户应用程序获取系统内部信息
提供了一个的安全、方便的界面。
proc只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以
通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取
proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。它的目录结构如下: 
目录名称 目录内容 
apm     高级电源管理信息 
cmdline    内核命令行 
Cpuinfo  关于Cpu信息 
Devices  可以用到的设备(块设备/字符设备) 
Dma    Used DMS channels 
Filesystems 支持的文件系统 
Interrupts 中断的使用 
Ioports    I/O端口的使用 
Kcore    内核核心印象 
Kmsg      内核消息 
Ksyms    内核符号表 
Loadavg      负载均衡 
Locks     内核锁 
Meminfo      内存信息 
Misc    Miscellaneous 
Modules    加载模块列表 
Mounts    加载的文件系统 
Partitions 系统识别的分区表 
Rtc    Real time clock 
Slabinfo Slab pool info 
Stat    全面统计状态表s 
Swaps    对换空间的利用情况 
Version      内核版本 
Uptime     系统正常运行时间 
 并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:
net,scsi和sys。Sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi目录不存在。 
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录
在/proc下,以进程的PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。
Proc文件系统的名字就是由之而起。进程目录的结构如下: 
目录名称 目录内容 
Cmdline    命令行参数 
Environ    环境变量值 
Fd  一个包含所有文件描述符的目录 
Mem    进程的内存被利用情况 
Stat    进程状态 
Status   Process status in human readable form 
Cwd   当前工作目录的链接 
Exe   Link to the executable of this process 
Maps    内存印象 
Statm     进程内存状态信息 
Root     链接此进程的root目录 
用户如果要查看系统信息,可以用cat命令。例如: 
> cat /proc/interrupts 
      CPU0     
 0:   8728810      XT-PIC timer 
 1:     895      XT-PIC keyboard 
 2:      0      XT-PIC cascade 
 3:   531695      XT-PIC aha152x 
 4:   2014133      XT-PIC serial 
 5:    44401      XT-PIC pcnet_cs 
 8:      2      XT-PIC rtc 
 11:      8      XT-PIC i82365 
 12:   182918      XT-PIC Mouse 
 13:      1      XT-PIC fpu PS/2  
 14:   1232265      XT-PIC ide0 
 15:      7      XT-PIC ide1 
NMI:     0 

有关proc文件系统详细的结构和其中各个目录的意义,可以通过man proc命令查阅。

实验指导书提出的
问题A:
1、cpu类型
2、内核版本
问题B:
1、启动以来经历的时间,以dd:hh:mm:ss报告
问题C:
1、cpu执行用户态、系统态、空闲态所用时间
2、多少次磁盘请求
3、多少次上下文切换
4、启动了多少次进程
问题D:
1、内存总量
2、可用内存
3、系统平均负荷

以下是根据实验指导书提出的问题所编写的程序样例:

#include <stdio.h>
#include <sys/time.h>
#define LB_SIZE 64
enum TYPE{STANDARD,SHORT,LONG
int main(int argc,char *argv[])
{
  FILE *thisProcFile;
  struct timeval now;
  enum TYPE reportType;
  char repTypeName[16];
  char *lineBuf;
  int interval; 
  int duration;
  int uptime;
  char c1,c2;
  //决定报告类型
      reportType = STANDARD;
      strcpy(repTypeName,"Standard");
      if(argc >1){
	sscanf(argv[1],"%c%c",&c1,&c2);
	if(c1!='-'){
	   fprintf(stderr,"usage:ksamp[-s][-l int dur]\n");
	   exit(1);
	}
	if(c2 == 's'){
	   reportType = SHORT;
	   strcpy(repTypeName,"Short");
	}
	if(c2 == 'l'){
	  reportType = LONG;
	  strcpy(repTypeName,"Long");
	  interval = atoi(argv[2]);
	  duration = atoi(argv[3]);
	}
      }
      //取得当前时间
      gettimeofday(&now,NULL);
      printf("Status report type %s at %s\n",
			repTypeName,ctime(&(now.tv_sec)));

      //读取问题中要得到的信息,输出信息报告
      lineBuf = (char *)malloc(LB_SIZE+1);
      thisProcFile = fopen("/proc/sys/kernel/hostname","r");
      fgets(lineBuf,LB_SIZE+1,thisProcFile);
      printf("Machine hostname:%s\n",lineBuf);
      fclose(thisProcFile);
      
      thisProcFile = fopen("/proc/cpuinfo","r");
      while(!feof(thisProcFile)){
        fgets(lineBuf,LB_SIZE+1,thisProcFile);
        printf("%s",lineBuf);
      }
      printf("\n");
      fclose(thisProcFile);
      
      thisProcFile = fopen("/proc/version","r");
      while(!feof(thisProcFile)){
        fgets(lineBuf,LB_SIZE+1,thisProcFile);
        printf("%s",lineBuf);
      }
      printf("\n");
      fclose(thisProcFile);

      ........

      //为检测系统平均负荷而设置的循环延迟,
      //该程序运行时不断打开和关闭一些程序或窗体。
      //
	while(iteration<duration){
		sleep(interval);
		sampleLoadAvg();
		iteration += interval;
	}
       exit(0);
   }
}

可完善以上程序完成问题A-D提出的问题。
给出一个分析报告。


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -