和Steve之间的通信--RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24

简介: 统计范围是个公式:功能描述:统计地址位于(pc-buflen*16K/scale, pc+buflen*16K/scale )内的指令执行时间,存放到buf中。其中,buf[0]是位于(pc-16K/scale, pc+16K/scale)内的指令执行时间,把buflen-=1,pc=6.5K和scale=32带入公式,可以得出buf[0]是统计地址[6,7k)的指令。
统计范围是个公式:

功能描述:统计地址位于(pc-buflen*16K/scale, pc+buflen*16K/scale )内的指令执行时间,存放到buf中。其中,buf[0]是位于(pc-16K/scale, pc+16K/scale)内的指令执行时间,

把buflen-=1,pc=6.5K和scale=32带入公式,可以得出buf[0]是统计地址[6,7k)的指令。


当然,如果你期望在一次调用中就能够得到所有函数的执行时间,也可以:

int buf[9];

profil(buf, 9, 4.5K, 32);

这就把9K的指令空间等分成18等分,每份0.5K统计。

buf[0]=[4~5k), buf[1]=[3.5K,4K)和[5K, 5.5K), ...

这样最后你需要自己合并映射buf中的数据到各个函数。当然这会有些误差,因为没有1个或两个buf[]的数据刚好能够对应到一个函数。

所以最好还是用一个buf一次统计一个函数。





From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 10:27:14 +0800

郝先生,

我还是不太明白,具体如下:

统计A函数:
int buf[1];
profil(buf, 1, 6.5K, 32);


根 据上面的代码,bufLen = 1, pc = 6.5kb。那套用582页上面的例子,因为“pc是带统计指令范围的中间值”,因此统计范围是:[0, 13kb-1];同时因为 bufLen 为1,表明只分成1段,因此最后的统计范围是 [0, 13kb-1]。是这样理解吗?是不是我搞错了?



From: qf.hao@hotmail.com
To: quntmec@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 10:18:43 +0800




From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 10:07:35 +0800

郝先生,

还是有点模糊,如下:

统计A函数:
int buf[1];
profil(buf, 1, 6.5K, 32);


对于以上设置,那统计的范围是[0,13kb-1]还是[6kb,7kb-1]?此外,scale为32,是否指的是32位机(书上说scale是除数因子,但我始终不太明白它到底是如何给定的)?
只统计A函数([6k,7k-1],scale只是一个运算参数 ,用来设定统计指令地址范围,具体请参照profil函数说明。


From: qf.hao@hotmail.com
To: quntmec@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 08:34:32 +0800




From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Fri, 3 Feb 2012 23:48:56 +0800

郝先生,

有关 profil 的实际应用,我有些疑惑,如下:

假设以下代码:
-----------------------------------------------
void A(int i)
{
    while(i--)
        {printf("This is func A");}
}

void B(int i)
{
    while(i--)
        {printf("This is func B");}
}

void C(int i)
{
    while(i--)
        {printf("This is func C");}
}

void main()
{
    int i = 1;
   
    while(i)
    {
        if (i % 3 == 0)
        {
            A(i);
        }

        if (i % 5 == 0)
        {
            B(i);
        }

        if (i % 7 == 0)
        {
            C(i);
        }
        i++;
    }
}
-----------------------------------------------

且假设编译链接后,文件名为 test.out。整个文件大小为11kb,其中代码段为9kb,数据段为1kb,栈段为1kb。对于代码段,假设如下:
0   ~ 6kb-1 :main函数
6kb ~ 7kb-1 :A函数
7kb ~ 8kb-1 :B函数
8kb ~ 9kb-1 :C函数

再假设,程序的首指令为地址0处的指令,且程序运行在一般的UNIX机器即可(不一定是在PDP11上,可以是现代的32位UNIX机器)


=====
问题:
=====
如何使用 profil函数 分别统计 A函数、B函数和C函数 的用时?套用582页的例子简单说明即可。
[郝]:没法在一次调用中统计3个函数的运行时间, 需要调用3次,每次只能统计1个函数。而第二次调用会停止第一次的统计,也就是说,在同一时刻,系统只能统计一个函数的执行时间。这是由于profil本身的限制决定。
统计A函数:
int buf[1];
profil(buf, 1, 6.5K, 32);
统计B:
int buf[1];
profil(buf, 1, 7.5K, 32);

统计C:
int buf[1];
profil(buf, 1, 8.5K, 32);

注:
感觉profil函数相当强大,但还不太清楚它如何实际应用....


此外,勘误:无


Steve

《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
京东
亚马逊                          China pub
上学吧                          1号店





目录
相关文章
|
网络协议 Unix Go
Go unix domain socket通信
Go unix domain socket通信
|
Unix
和Steve之间的通信--RE: 关于《UNIX技术内幕》的勘误及遇到的问题_4
Steve,应该是第2中情况,u变量就是一个user结构体,并且该变量地址固定在0o140000处,其所占空间长度就是结构体的长度。至于为什么要固定地址是0o140000,因为它是第6号虚拟寄存器映射的。
778 0
|
Unix
和Steve之间的通信--关于《UNIX技术内幕》的勘误及遇到的问题_3
From: quntmec@hotmail.comTo: qf.hao@hotmail.comSubject: 关于《UNIX技术内幕》的勘误及遇到的问题_3Date: Thu, 6 Oct 2011 19:24:10 +0800 郝先生,对于启动模块这一章...
778 0
|
Unix
《返璞归真--UNIX技术内幕》--第14章 多线程的实现
14.1  概述 现代操作系统引入了线程的概念。线程是CPU执行的最小单元,相对于进程而言,它具有轻捷、高效、开销小等优点。 14.2  线程和经典进程的比较 线程和经典进程的主要区别如下。
883 0
|
存储 缓存 Unix
《返璞归真--UNIX技术内幕》--第9章 字符设备驱动
本系统中的输入输出设备都是字符设备,它们包括:KL-11/DL-11A——电传串行接口、PC-11——纸带打孔机和LP-11——行打印机。其中KL-11用于连接终端(terminal),作为用户键盘输入和显示输出的交互接口。
961 0
|
Unix
《返璞归真--UNIX技术内幕》--源代码
本源代码经宁希波帮助整理,去除了''和'&'符号,在此表示诚挚的谢意!源码中除/usr/personal目录外,均由Bell Labs(贝尔实验室)开发。
698 0
|
Unix
《返璞归真--UNIX技术内幕》-- 第11章 UNIX可执行文件
11.1  .out文件 本版UNIX的可执行文件是.out格式,如果你在UNIX下用gcc编译程序,它默认会生成一个名为“a.out”的可执行文件。
902 0
|
Unix
《UNIX技术内幕》--第3章 虚拟内存
Normal 0 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.
618 0
|
Unix C语言
《返璞归真--UNIX技术内幕》--第6章 中断处理过程
6.4  PDP 11/40的中断类型 系统中的中断主要有下面几种。 6.4.1  电传终端接口输入中断 电传终端接口用于链接PDP 11/40的总线和主要的输入、输出终端,当时该终端是电传打字机,这也是UNIX中用tty(teletypewriter)表示进程所使用的终端类型的原因,事实上电传接口还可以连接彩色显示器(CRT)等。
918 0
|
Unix Linux 调度
《UNIX技术内幕》勘误及问题解答_26
From: quntmec@hotmail.com To: qf.hao@hotmail.com Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_26 Date: Sun, 26 Feb 2012 16:34:18 +0800 郝先生, 线程方面碰到的问题如下: 1、689页,倒数第2、3行,里面提到第14章所实现的线程在退出时只会将线程栈释放、而不会释放该线程所分配的堆空间,这是否会造成内存泄漏?[郝]:如果用户线程在每次调用malloc后,都会调用free来释放它,那么就不会有内存泄漏。
946 0