Linux 内核编程实验报告3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核分析实验报告
实验题目:内核定时器
实验目的:练习怎样编写调用内核的时间测量功能为应用程序测量和精确定时,通过这个实验:可以进一步了解Linux内的的定时机制以及数据结果以及怎样从用户空间去访问内核控件的时间数据
硬件环境:内存1G以上
软件环境:Linux(Ubuntu) 2-6
实验步骤:
一:实验原理简介:
在每一个用户进程的主要执行动作前设定时间,主要动作完成以后,获取时间,如此得到了主要动作的执行时间,系统总共有三种类型的时间ITIMER_REAL,ITIMER_VIRTUAL,ITIMER_PROF,三种类型的数据分别记录了程序执行的实际时间,程序执行的虚拟时间,程序执行的CPU时间。其中:程序的用户态时间=ITIMRT_PROF得到的时间
程序的系统态时间=ITIMRT_PROF得到的时间(CPU时间)- ITIMER_VIRTUAL得到的时间(用户态时间)
在这里使用了fibonacci函数测验。因为fibonacci函数运行的时间相对较长,实验结果明显。测验相关函数时,可以运用一个for循环达到相同的效果。
二:主要数据结构:
1.时间结构:
struct timeval{
long tv_sec; //1970-1-1 开始经历的秒数
long tv_usec;//从上一秒到现在经历的微秒数
} theTime;
要想得到现在的具体时间,需要经过相应的转换
2.时间设置结构:
struct itimerval{
struct timeval it_interval;
struct timeval it_value
} ;
it_interval 当时钟到时后时钟设的初始值;
it_value 调用getitimer函数后,时间值存储在这个结构中三:主要函数介绍
1:系统调用函数
(1)getitimer( int timerType ,const struct itimerval *value)函数说明:得到指定类型的的时间值,得到的给过放在value
结构中
:(2)s etitimer(int timerType , const struct itimerval *value, struct itimerval *oldValue )
函数说明:设置指定类型的时间的时间值,设置的标准时
value结构中指定的值。
(3)sighandler_t signal(int signum,sighandler_t handler);
函数说明:将指定的信号类型与指定的函数相关联。
2:自定义函数:
static void psig_real(void);
函数说明:每当父进程实际执行时间达到1秒,就把
p_real_secs(记录父进程实际执行的秒数)变量加1。两
个子进程同理。
static void psig_virtual(void);
函数说明:每当父进程虚拟执行时间达到1秒,就把
p_virt_secs(记录父进程实际执行的秒数)变量加1。两
个子进程同理。
static void psig_prof(void);
函数说明:每当父进程prof执行时间达到1秒,就把
p_real_secs(记录父进程实际执行的秒数)变量加1。两
个子进程同理。
四:程序流程:
父子程序的执行流程基本相同,满足:设置-→计算--→获取。具体代码如下:(见图3--1)
(图3--1)
五:结果检测:
输入数据:32 31 33
结果见图3--2
(图3—2 )
(正确)
输入数据:29 30 34
结果见图3--3
、
(图3--3)
(正确)
结论分析与体会:
时间定时器的设定,方便我们获得一个应用程序的执行时间。将来从事Linux环境下的算法研究,可以辅助我们观察被实验算法的时间复杂度。因此是一个非常有帮助
附:程序源代码
/******************************************************************** *****
**
mytimer.c - description
-------------------
copyright : (C) 2010 by houpengyang
Function :
2010-4-4
/******************************************************************** *****
**/
#include
#include
#include
#include
#include
static void psig_real(void);//父进程的3个定时中断处理函数模型
static void psig_virtual(void);
static void psig_prof(void);
static void c1sig_real(void);//子进程1的3个定时中断处理函数模型static void c1sig_virtual(void);
static void c1sig_prof(void);
static void c2sig_real(void);//子进程2的3个定时中断处理函数模型static void c2sig_virtual(void);
static void c2sig_prof(void);
long unsigned int fibonacci(unsigned int n);
//记录三种定时的秒数的变量
static long p_real_secs=0,c1_real_secs=0,c2_real_secs=0;
static long p_virtual_secs=0,c1_virtual_secs=0,c2_virtual_secs=0; static long p_prof_secs=0,c1_prof_secs=0,c2_prof_secs=0;
static long sum_all=0,sum_cpu=0,sum_kernel=0,sum_user=0,sum_all_u=0,sum_user_u=0, sum_kernel_u=0,sum_cpu_u=0;
//记录三种定时器的毫秒数的结构变量
static struct itimerval p_realt,c1_realt,c2_realt;
static struct itimerval p_virtt,c1_virtt,c2_virtt;
static struct itimerval p_proft,c1_proft,c2_proft;
int main(int argc,char **argv)
{
long unsigned fib=0;
int pid1,pid2;
unsigned int fibarg;
int status;
int i;
if(argc < 3) {
printf("Usage: testsig arg1 arg2 arg3\n");
return 1;