《操作系统》基本课程实验指导书-2014 联系客服

发布时间 : 星期三 文章《操作系统》基本课程实验指导书-2014更新完毕开始阅读bec6706ea76e58fafab003ab

}

wait(&state);

3. Linux内核实验

3.1 实验2.1 观察Linux行为

1、实验目的

学习linux内核、进程、存储和其他资源的一些重要特性。通过使用/proc文件系统接口, 编写一个程序检查反映机器平衡负载、进程资源利用率方面的各种内核值, 学会使用/proc文件系统这种内核状态检查机制。

2、实验内容

编写一个默认版本的程序通过检查内核状态报告Linux内核行为。程序应该在stdout上打印以下值:

1,CPU类型和型号;

2,所使用的Linux内核版本;

3,从系统最后一次启动以来已经经历了多长时间(天,小时和分钟); 4,总共有多少CPU时间执行在用户态,系统态,空闲态; 5,配置内存数量;当前可用内存数,磁盘读写请求数; 6,内核上下文转换数;

7,系统启动到目前创建了多少进程。

设计思路:

首先得到命令行,再解释命令行,然后到/proc查找文件,最后执行命令。

3、程序源代码清单(参考)

#include #include

int main( int argc, char *argv[]) {

char repTypeName[16]; char c1, c2, ch; int interval, duration; char *lineBuf; int LB_SIZE; FILE *thisProcFile; char *now;

int iteration;

//决定报告类型

strcpy(repTypeName, \ if (argc < 1) {

sscanf(argv[1],\ if (c1 != '-') {

fprintf(stderr, \ exit(1); }

if (c2 == 's') {

strcpy(repTypeName, \ }

if (c2 == \ {

strcpy(repTypeName, \ interval = atoi(argv[2]); duration = atoi(argv[3]); } }

//得到当前时间

/* gettimeofday(&now, NULL); */

printf(\ thisProcFile = fopen(\ //打开文件 fgets(lineBuf, LB_SIZE + 1, thisProcFile); //读取文件 printf(\ //打印文件 fclose(thisProcFile);

//关闭文件

//内核版本

thisProcFile = fopen(\ fgets(lineBuf,LB_SIZE + 1,thisProcFile); printf(\ersion: %s\\n\ fclose(thisProcFile);

//CPU类型和型号

thisProcFile = fopen(\ fgets(lineBuf,LB_SIZE + 1,thisProcFile); printf(\ fclose(thisProcFile);

//当前时间

thisProcFile = fopen(\fgets(lineBuf,LB_SIZE + 1,thisProcFile); printf(\fclose(thisProcFile);

//内存情况

printf(\

thisProcFile = fopen(\ while (! feof(thisProcFile)) { putchar(fgetc(thisProcFile)); }

fclose(thisProcFile);

// 当前状态

printf(\

thisProcFile = fopen(\ while (! feof(thisProcFile)) { putchar(fgetc(thisProcFile)); }

fclose(thisProcFile);

iteration = 0; interval = 2; duration = 60;

while(iteration < duration) {

sleep(interval);

thisProcFile = fopen(\ while (! feof(thisProcFile)) { putchar(fgetc(thisProcFile)); }

fclose(thisProcFile); iteration += interval; } return(0); }

3.2 实验2.2 内核定时器

1、实验目的

学习掌握内核定时器的实现原理和方法,建立一种用户空间机制来测量多线程程序的执

行时间。

2、实验内容

A、 用定时器ITIMER_REAL实现gettimeofday的功能。使其一秒钟产生一个信号,

计算已经过的秒数。 设计思路:

设置定时器ITIMER_REAL间隔为一秒钟。并为计时到时设定信号处理程序,即singal(SIGALRM,?),使其输出当前所记时间。

3、程序源代码清单(参考)

A.3、shell程序源代码清单

/****part1.c*****/ //part 1

#include #include #include

static void sighandle(int); static int second = 0; int main(){ }

struct itimerval v;

signal(SIGALRM,sighandle); v.it_interval.tv_sec = 1; v.it_interval.tv_usec = 0; v.it_value.tv_sec = 1;

v.it_value.tv_usec = 0;

setitimer(ITIMER_REAL,&v,NULL); for(;;);

static void sighandle(int s) {second++; }

printf(\fflush(stdout);

B、记录一个进程运行时所占用的real time, cpu time,user time ,kernel time。

设计思路:

任务开始前设置好定时器ITIMER_REAL,ITIMER_VIRTUAL,ITIMER_PROF,即

其相应的信号处理程序。在任务执行过程中内核定时器通过产生等间隔的信号来记录进程所需的各种时间参量,并在任务结束后打印出来。

B.3、shell程序源代码清单

/************part2.c**********/