文档库 最新最全的文档下载
当前位置:文档库 › C语言中的__attribute__机制

C语言中的__attribute__机制

C语言中的__attribute__机制
C语言中的__attribute__机制

C语言中的__attribute__机制

分类:C/C++2011-10-24 19:53100人阅读评论(0)收藏举报c语言attributesprofiling编译器struct

GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。

__attribute__语法格式为:

__attribute__ ((attribute-list))

其位置约束为:

放于声明的尾部“;”之前。

函数属性(Function Attribute)

函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。

GNU CC需要使用–Wall编译器来击活该功能,这是控制警告信息的一个很好的方式。下面介绍几个常见的属性参数。

__attribute__ format

该__attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。

format的语法格式为:

format (archetype, string-index, first-to-check)

format属性告诉编译器,按照printf, scanf,

strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。

具体使用格式如下:

__attribute__((format(printf,m,n)))

__attribute__((format(scanf,m,n)))

其中参数m与n的含义为:

m:第几个参数为格式化字符串(format string);

n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几,注意,有时函数参数里还有“隐身”的呢,后面会提到;

在使用上,__attribute__((format(printf,m,n)))是常用的,而另一种却很少见到。下面举例说明,其中myprint为自己定义的一个带有可变参数的函数,其功能类似于printf:

//m=1;n=2

extern void myprint(const char *format,...) __attribute__((format(printf,1,2)));

//m=2;n=3

extern void myprint(int l,const char *format,...)

__attribute__((format(printf,2,3)));

需要特别注意的是,如果myprint是一个函数的成员函数,那么m和n的值可有点“悬乎”了,例如:

//m=3;n=4

extern void myprint(int l,const char *format,...)

__attribute__((format(printf,3,4)));

其原因是,类成员函数的第一个参数实际上一个“隐身”的“this”指针。(有点C++基础的都知道点this指针,不知道你在这里还知道吗?)

这里给出测试用例:attribute.c,代码如下:

1:

2:extern void myprint(const char *format,...)

__attribute__((format(printf,1,2)));

3:

4:void test()

5:{

6:myprint("i=%d\n",6);

7:myprint("i=%s\n",6);

8:myprint("i=%s\n","abc");

9:myprint("%s,%d,%d\n",1,2);

10:}

运行$gcc –Wall –c attribute.c attribute后,输出结果为:

attribute.c: In function `test':

attribute.c:7: warning: format argument is not a pointer (arg 2)

attribute.c:9: warning: format argument is not a pointer (arg 2)

attribute.c:9: warning: too few arguments for format

如果在attribute.c中的函数声明去掉__attribute__((format(printf,1,2))),再重新编译,既运行$gcc –Wall –c attribute.c attribute后,则并不会输出任何警告信息。

注意,默认情况下,编译器是能识别类似printf的“标准”库函数。

__attribute__ noreturn

该属性通知编译器函数从不返回值,当遇到类似函数需要返回值而却不可能运行到返回值处就已经退出来的情况,该属性可以避免出现错误信息。C库函数中的abort()和exit()的声明格式就采用了这种格式,如下所示:

extern void exit(int) __attribute__((noreturn));extern void abort(void)

__attribute__((noreturn)); 为了方便理解,大家可以参考如下的例子:

//name: noreturn.c ;测试__attribute__((noreturn))

extern void myexit();

int test(int n)

{

if ( n > 0 )

{

myexit();

/* 程序不可能到达这里*/

}

else

return 0;

}

编译显示的输出信息为:

$gcc –Wall –c noreturn.c

noreturn.c: In function `test':

noreturn.c:12: warning: control reaches end of non-void function

警告信息也很好理解,因为你定义了一个有返回值的函数test却有可能没有返回值,程序当然不知道怎么办了!

加上__attribute__((noreturn))则可以很好的处理类似这种问题。把

extern void myexit();修改为:

extern void myexit() __attribute__((noreturn));之后,编译不会再出现警告信息。

__attribute__ const

该属性只能用于带有数值类型参数的函数上。当重复调用带有数值参数的函数时,由于返回值是相同的,所以此时编译器可以进行优化处理,除第一次需要运算外,其它只需要返回第一次的结果就可以了,进而可以提高效率。该属性主要适用于没有静态状态(static state)和副作用的一些函数,并且返回值仅仅依赖输入的参数。

为了说明问题,下面举个非常“糟糕”的例子,该例子将重复调用一个带有相同参数值的函数,具体如下:

extern int square(int n) __attribute__ ((const));...

for (i = 0; i

{ total += square (5) + i;} }

通过添加__attribute__((const))声明,编译器只调用了函数一次,以后只是直接得到了相同的一个返回值。

事实上,const参数不能用在带有指针类型参数的函数中,因为该属性不但影响函数的参数值,同样也影响到了参数指向的数据,它可能会对代码本身产生严重甚至是不可恢复的严重后果。

并且,带有该属性的函数不能有任何副作用或者是静态的状态,所以,类似getchar()或time()的函数是不适合使用该属性的。

-finstrument-functions

该参数可以使程序在编译时,在函数的入口和出口处生成instrumentation调用。恰好在函数入口之后并恰好在函数出口之前,将使用当前函数的地址和调用地址来调用下面的profiling

函数。(在一些平台上,__builtin_return_address不能在超过当前函数范围之外正常工作,所以调用地址信息可能对profiling函数是无效的。)

void __cyg_profile_func_enter(void *this_fn, void *call_site);

void __cyg_profile_func_exit(void *this_fn, void *call_site);

其中,第一个参数this_fn是当前函数的起始地址,可在符号表中找到;第二个参数call_site 是指调用处地址。

instrumentation

也可用于在其它函数中展开的内联函数。从概念上来说,profiling调用将指出在哪里进入和退出内联函数。这就意味着这种函数必须具有可寻址形式。如果函数包含内联,而所有使用到该函数的程序都要把该内联展开,这会额外地增加代码长度。如果要在C 代码中使用extern inline声明,必须提供这种函数的可寻址形式。

可对函数指定no_instrument_function属性,在这种情况下不会进行Instrumentation操作。例如,可以在以下情况下使用no_instrument_function属性:上面列出的profiling函数、高优先级的中断例程以及任何不能保证profiling正常调用的函数。

no_instrument_function

如果使用了-finstrument-functions

,将在绝大多数用户编译的函数的入口和出口点调用profiling函数。使用该属性,将不进行instrument操作。

constructor/destructor

若函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行。类似的,若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动的执行。拥有此类属性的函数经常隐式的用在程序的初始化数据方面。

这两个属性还没有在面向对象C中实现。

同时使用多个属性

可以在同一个函数声明里使用多个__attribute__,并且实际应用中这种情况是十分常见的。使用方式上,你可以选择两个单独的__attribute__,或者把它们写在一起,可以参考下面的例子:

/* 把类似printf的消息传递给stderr 并退出*/

extern void die(const char *format, ...) __attribute__((noreturn))

__attribute__((format(printf, 1, 2)));

或者写成

extern void die(const char *format, ...) __attribute__((noreturn, format(printf, 1, 2)));

如果带有该属性的自定义函数追加到库的头文件里,那么所以调用该函数的程序都要做相应的检查。

和非GNU编译器的兼容性

庆幸的是,__attribute__设计的非常巧妙,很容易作到和其它编译器保持兼容,也就是说,如果工作在其它的非GNU编译器上,可以很容易的忽略该属性。即使__attribute__使用了多个参数,也可以很容易的使用一对圆括弧进行处理,例如:

/* 如果使用的是非GNU C, 那么就忽略__attribute__ */

#ifndef __GNUC__

#define __attribute__(x) /*NOTHING*/

#endif

需要说明的是,__attribute__适用于函数的声明而不是函数的定义。所以,当需要使用该属性的函数时,必须在同一个文件里进行声明,例如:

/* 函数声明*/

void die(const char *format, ...) __attribute__((noreturn)) __attribute__((format(printf,1,2))); void die(const char *format, ...){

/* 函数定义*/

}

更多的属性含义参考:

https://www.wendangku.net/doc/601575927.html,/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html

变量属性(Variable Attributes)

关键字__attribute__也可以对变量(variable)或结构体成员(structure field)进行属性设置。这里给出几个常用的参数的解释,更多的参数可参考本文给出的连接。在使用

__attribute__参数时,你也可以在参数的前后都加上“__”(两个下划线),例如,使用

__aligned__而不是aligned,这样,你就可以在相应的头文件里使用它而不用关心头文件里是否有重名的宏定义。

aligned (alignment)

该属性规定变量或结构体成员的最小的对齐格式,以字节为单位。例如:

int x __attribute__ ((aligned (16))) = 0; 编译器将以16字节(注意是字节byte不是位bit)对齐的方式分配一个变量。也可以对结构体成员变量设置该属性,例如,创建一个双字对齐的int对,可以这么写:

struct foo { int x[2] __attribute__ ((aligned (8))); }; 如上所述,你可以手动指定对齐的格式,同样,你也可以使用默认的对齐方式。如果aligned后面不紧跟一个指定的数字值,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。例如:

short array[3] __attribute__ ((aligned)); 选择针对目标机器最大的对齐方式,可以提高拷贝操作的效率。

aligned属性使被设置的对象占用更多的空间,相反的,使用packed可以减小对象占用的空间。

需要注意的是,attribute属性的效力与你的连接器也有关,如果你的连接器最大只支持16字节对齐,那么你此时定义32字节对齐也是无济于事的。

packed

使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。

下面的例子中,x成员变量使用了该属性,则其值将紧放置在a的后面:

struct test

{ char a;

int x[2] __attribute__ ((packed));

};

其它可选的属性值还可以是:cleanup,common,nocommon,deprecated,mode,section,shared,tls_model,transparent_union,unused,vector_size,weak,dllimport,dlexport 等,

详细信息可参考:

https://www.wendangku.net/doc/601575927.html,/onlinedocs/gcc-4.0.0/gcc/Variable-Attributes.html#Variable-Attributes

类型属性(Type Attribute)

关键字__attribute__也可以对结构体(struct)或共用体(union)进行属性设置。大致有六个参数值可以被设定,即:aligned,

packed, transparent_union, unused, deprecated 和may_alias。

在使用__attribute__参数时,你也可以在参数的前后都加上“__”(两个下划线),例如,使用__aligned__而不是aligned,这样,你就可以在相应的头文件里使用它而不用关心头文件里是否有重名的宏定义。

aligned (alignment)

该属性设定一个指定大小的对齐格式(以字节为单位),例如:

struct S

{ short f[3]; } __attribute__ ((aligned (8)));

typedef int more_aligned_int __attribute__ ((aligned (8)));

该声明将强制编译器确保(尽它所能)变量类型为struct S或者more-aligned-int的变量在分配空间时采用8字节对齐方式。

如上所述,你可以手动指定对齐的格式,同样,你也可以使用默认的对齐方式。如果aligned 后面不紧跟一个指定的数字值,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。例如:

struct S { short f[3]; } __attribute__ ((aligned));

这里,如果sizeof(short)的大小为2(byte),那么,S的大小就为6。取一个2的次方值,使得该值大于等于6,则该值为8,所以编译器将设置S类型的对齐方式为8字节。aligned属性使被设置的对象占用更多的空间,相反的,使用packed可以减小对象占用的空间。

需要注意的是,attribute属性的效力与你的连接器也有关,如果你的连接器最大只支持16字节对齐,那么你此时定义32字节对齐也是无济于事的。

packed

使用该属性对struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在enum类型定义时,暗示了应该使用最小完整的类型(it indicates that the smallest integral type should be used)。

下面的例子中,my-packed-struct类型的变量数组中的值将会紧紧的靠在一起,但内部的成员变量s不会被“pack”,如果希望内部的成员变量也被packed的话,my-unpacked-struct 也需要使用packed进行相应的约束。

struct my_unpacked_struct

{

char c;

int i;

};

struct my_packed_struct

{

char c;

int i;

struct my_unpacked_struct s;

}__attribute__ ((__packed__));

其它属性的含义见:

https://www.wendangku.net/doc/601575927.html,/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html#Type-Attributes

变量属性与类型属性举例

下面的例子中使用__attribute__属性定义了一些结构体及其变量,并给出了输出结果和对结果的分析。

程序代码为:

struct p

{

int a;

char b;

char c;

}__attribute__((aligned(4))) pp;

struct q

{

int a;

char b;

struct n qn;

char c;

}__attribute__((aligned(8))) qq;

int main()

{

printf("sizeof(int)=%d,sizeof(short)=%d.sizeof(char)=%d\n",sizeof(int),sizeof(short),sizeof( char));

printf("pp=%d,qq=%d \n", sizeof(pp),sizeof(qq));

return 0;

}

输出结果:

sizeof(int)=4,sizeof(short)=2.sizeof(char)=1

pp=8,qq=24

分析:

sizeof(pp):

sizeof(a)+ sizeof(b)+ sizeof(c)=4+1+1=6

https://www.wendangku.net/doc/601575927.html,/

下面是一些便捷的连接:GCC 4.0 Function Attributes;GCC 4.0 Variable Attributes ;GCC 4.0 Type

Attributes ;GCC 3.2 Function Attributes ;GCC 3.2 Variable Attributes ;GCC 3.2 Type Attributes ;GCC 3.1 Function Attributes ;GCC 3.1 Variable Attributes Reference:

1.有关__attribute__的相对简单的介绍:

https://www.wendangku.net/doc/601575927.html,/techtips/gnu-c-attributes.html

2.__attribute__详细介绍:

https://www.wendangku.net/doc/601575927.html,/

本文来自ChinaUnix博客,如果查看原文请点:

https://www.wendangku.net/doc/601575927.html,/u2/78225/showart_1223477.html

操作系统内存管理复习过程

操作系统内存管理

操作系统内存管理 1. 内存管理方法 内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。 2. 连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间。连续分配有单一连续存储管理和分区式储管理两种方式。 2.1 单一连续存储管理 在这种管理方式中,内存被分为两个区域:系统区和用户区。应用程序装入到用户区,可使用用户区全部空间。其特点是,最简单,适用于单用户、单任务的操作系统。CP/M和 DOS 2.0以下就是采用此种方式。这种方式的最大优点就是易于管理。但也存在着一些问题和不足之处,例如对要求内

存空间少的程序,造成内存浪费;程序全部装入,使得很少使用的程序部分也占用—定数量的内存。 2.2 分区式存储管理 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。 分区式存储管理引人了两个新的问题:内碎片和外碎片。 内碎片是占用分区内未被利用的空间,外碎片是占用分区之间难以利用的空闲分区(通常是小空闲分区)。 为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)。

分区式存储管理常采用的一项技术就是内存紧缩(compaction)。 2.2.1 固定分区(nxedpartitioning)。 固定式分区的特点是把内存划分为若干个固定大小的连续分区。分区大小可以相等:这种作法只适合于多个相同程序的并发执行(处理多个类型相同的对象)。分区大小也可以不等:有多个小分区、适量的中等分区以及少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。 优点:易于实现,开销小。 缺点主要有两个:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。 2.2.2动态分区(dynamic partitioning)。 动态分区的特点是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有内碎

重难点分析及解决措施

第一节前期报批重难点分析及解决措施 (一)报批内容繁多编制 根据招标文件的内容,涉及到的相关部门有20几个,应提前编制报批进度控制计划,罗列出本项目所涉及到的所有报批内容,并与设计文件的进度有效的衔接,另外我单位一直从事全过程项目管理(代建)的工作,对办事流程熟悉,能为前期报批管理工作带来一定得便捷。鉴于项目的建设已十分迫切,建议为加快项目建设过程,应利用项目本身的优势,争取有关方面给予支持,争取绿色通道,缩短报批的中间环节审批时间。如我方中标,为了能出色完成该项任务,安排前期报批部专项人员来协助业主方完成前期报批的各项手续。我单位以围绕申领建筑工程规划许可证与施工许可证位置中心开展相应的前期工作,通过全面衔接业主方已进行的工作,熟悉项目功能要求与各项限制条件,用以指导后续前期工作,既保证项目工作连续性,也发挥出我单位的技术先进性,确保前期工作的准备质量。 (二)前期沟通协调设计部门多 1、必须加强与政府各职能部门(涉及的部门包括发改委、市政、公安交通等)的联系,了解政府的有关政策,及时办理相关手续,决不违章作业,确保工程严格按国家规定的基本建设程序顺利进行。在工程建设过程中,建设管理单位应主动要求有关管理部门到现场检查与指导工作,对管理部门提出的有关整改问题应积极、及时进行改正与处理,不断完善与提高现场建设管理水平。 2、建设管理单位严格按基本建设程序办理相关前期手续,包括规

划许可证,国土使用证,开工许可证,初步设计与施工图设计的消防审查意见书、卫生防疫审查意见书、图纸审查书、人防审查意见,质监备案通知,安监备案通知以及文物勘察通知,水、电、气、通讯、道路开口、市政排水等的申请批准书等。在办理手续时保证按政府及有关职能部门的规定要求提供项目完整的报批所需要有关资料与文件,项目的建设要求与内容在报建前应符合规划与相关法律、法规的规定,如项目的总平面布置、建筑高度、层数与建筑体型应符合规划要求,建筑内部的功能分区与结构应符合消防有关法规,地下室设计满足人防、消防的规定,在正式开工前必须办理文物勘探手续、建筑渣土手续并完成现场的文物勘探工作,设计图必须通过消防、人防卫生防疫、规划、建委等部门的审查批准。在项目前期,及时与水、电、气、市政部门取得联系,根据项目建设要求提前向上述部门提出项目供水、供电、供气、通讯与市政雨、污水排放、道路开口的申请要求,以便相关部门及时进行配套建设的准备工作。 3、依据政府的有关批文与依靠政府的有关政策规定,各方均对政府负责的职责与对项目认真负责的态度,严格科学办事程序,将就是与政府与有关职能部门搞好工作协调的关键。 4、项目的室外配套专业组织协调要求也较高,如何与政府职能部门进行充分、有效的组织协调,将直接影响到项目建设各项目标的实现,为此,我公司介入后将会把配套专业的实施与协调内容作为重点工作内容之一,并结合以往类似项目的沟通、协调管理经验,通过合理的计划与安排、组织与协调,加强与当地职能部门的联系与沟通,为使

linux内存管理子系统 笔记

4-4 linux内存管理子系统 4-4-1 linux内存管理(参考课件) 物理地址:cpu地址总线上寻址物理内存的地址信号,是地址变换的最终结果 逻辑地址:程序代码经过编译后,出现在汇编程序中的地址(程序设计时使用的地址) 线性地址:又名虚拟地址,32位cpu架构下4G地址空间 CPU要将一个逻辑地址转换为物理地址,需要两步: 1、首先CPU利用段式内存管理单元,将逻辑地址转换成线性地址; 2、再利用页式内存管理单元,把线性地址最终转换为物理地址 相关公式: 逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)(通用的) 16位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 线性地址=段寄存器的值×16+逻辑地址的偏移部分 物理地址=线性地址(没有页式管理) 32位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 线性地址=段寄存器的值+逻辑地址的偏移部分 物理地址<——>线性地址(mapping转换) ARM32位:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 逻辑地址=段内偏移量(段基地址为0) 线性地址=逻辑地址=段内偏移量(32位不用乘以32) 物理地址<——>线性地址(mapping转换) ************************!!以下都是x86模式下!!********************************* 一、段式管理 1.1、16位CPU:(没有页式管理) 1.1.1、段式管理的由来: 16位CPU内部有20位地址总线,可寻址2的20次方即1M的内存空间,但16位CPU 只有16位的寄存器,因此只能访问2的16次方即64K。因此就采用了内存分段的管理模式,在CPU内部加入了段寄存器,这样1M被分成若干个逻辑段,每个逻辑段的要求如下: 1、逻辑段的起始地址(段地址)必须是16的整数倍,即最后4个二进制位须全是0 (因此不必保存)。 2、逻辑段的最大容量为64K。 1.1.2、物理地址的形成方式: 段地址:将段寄存器中的数值左移4位补4个0(乘以16),得到实际的段地址。 段偏移:在段偏移寄存器中。 1)逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 2)由逻辑地址得到物理地址的公式为:(因为没有页式管理,所以这一步就得到了物理地址)物理地址PA=段寄存器的值×16+逻辑地址的偏移部分(注意!!)(段与段可能会重叠)

重点难点分析及保证措施

重点难点分析及保证措施 本项目设计新颖、工期紧、工程质量要求高,与其它专业间交叉作业频繁,给工程的管理带来较大的难度。本工程的重点、难点如下: 1、管理工作方面的重点、难点的施工控制措施 2、施工技术方面重点、难点的施工控制措施 2.1管理工作方面的重点、难点的施工控制措施 2.1.1工期难度分析 施工房间较多、施工项目复杂,工艺以及施工质量要求高,如何确保在最合理的时间内实现本工程的施工目标,保证工期将是本工程的施工难点,增加人力,分层分区施工是确何工期的最佳途径。每一分项目分成若干个班组流水作业,按工序作业是实现本工程工期的另一途径,整个施工路径通畅,有充足的人力资源人力(包括足够的班组人力及材料采购人员),可实现本工程工期目标。 2.1.2工程协调重点的分析与对策 装修阶段是各工种、各分包单位、各配合单位交叉、配合最密切和频繁的时期。装修作业与机电安装、空调安装、给排水安装及业主的设备安装均存在大量的交叉作业。 1.2.1坚决服从总包的协调管理,严格按总包单位的管理要求及时报送形象施工进度等资料,对工程进行中可能发生的设计、质量、安全等问题及时与业主、监理、总包单位联系协调节器,力争主动、提前解决问题。 1.2.2落实与各其他施工单位在协调的时间、方位、大致问题,并提前提出谅解备忘录,制订配合、协调计划等。 1.2.3装修阶段,是整个项目的主要矛盾阶段,本阶段的施工应以装

饰工程施工为主导,机电安装、空调安装、弱电安装、土建收尾等施工配合,不管原属哪个单位、部门、都应在甲方、监理、总包单位的总体协调的支持下,服从装饰施工的总体安排,并应以装饰工程总体施工计划为主要依据,重新调整各自的施工计划。 1.2.4各分项工程隐蔽前,由总包单位牵头,各专业安装单位配合,对需隐蔽的分项工程部位联合复检,确保无误才进行封完闭,减少或杜绝因隐蔽工程问题引起的返工。 1.2.5必须严格认真进行图纸会审,对存在交叉作业的位置绘综合图纸,及时解决交叉作业问题,避免施工冲突。 1.2.6各层、各功能区公共区域是各系统管道密集区域,与各专业施工单位密切配合,科学合理安排管道走向,为保证装饰工程的质量和装饰效果,要求各工种、各分项单位协调配合,尤其在天花的标高,空调风口、灯孔定位问题上必须逐个层段、逐个部位进行协商。 2.1.3、材料品质的控制措施 1.对木材的控制 (1)饰面板严格按照最后确认的样板购买,达到面饰效果为准则,建议采用厂家定制的优质产品。 (2)各类夹板、大芯板以优质品为佳。 (3)木龙骨采用干燥、无变形、变曲的优质杉木。 (4)对于各类木线条、收口线、角线、腰饰线等我们将采取直接到厂家加工的措施。 (5)尽量加工尺寸较长的木线,装饰时减少拼接,如门框、窗框等部位,木线不能拼装,需按尺寸定长加工。 (6)对加工好后的木线、饰面板,立即进行打磨油漆、防尘等处理、然后用软性包装物打好包装运往工地,注意保护。

Solaris 8内存管理机制研究

Solaris 8内存管理机制研究 吴海燕 戚丽 冯珂 摘 要:寻找性能瓶颈是性能分析中的一项重要任务,内存瓶颈的表现并不像CPU或磁盘那样直接,本文通过对Solaris 8内存管理机制的研究,给出了寻找Solaris 8系统内存瓶颈的方法。 关键词:Solaris 8,内存管理,性能优化 一、问题的提出 清华大学计算机与信息管理中心数据中心现有服务器近百台,其中包括了SUN Fire 15000、SUN Enterprise 5500、SUN Enterprise 5000等大型SUN服务器,Solaris 8是主流操作系统。为了对服务器的资源(如CPU、内存、磁盘、网络)的使用情况进行长期监控,建立性能优化(performance tuning)的基准值,我们开发了一套脚本程序定时采集系统运行参数。在长期的监控中,我们发现Solaris 8系统的空闲内存(freemem)呈现一个有趣的变化规律,如图1所示: 图1 空闲内存(freemem)变化图 图1是某Solaris 8系统(在下文中我们称之为15k-a)自2003年2月份以来的freemem 变化情况,横坐标是时间,纵坐标是freemem的数量,以8K字节为单位。15k-a配置是10路Super SPARCIII CPU,10GB物理内存。从上图可以看到在正常运行时,freemem应该是比较稳定的,15k-a主要是运行数据库,数据库在运行时会占用2G内存作为SGA区使用,因此在通常的负载下,freemem保持在6~7G之间是比较正常的。稳定一段时间后,

15k-a的freemem会持续走低,直到最低值,约为18893×8KMB,然后系统开始回收内存,我们就会看到freemem数量急剧上升。freemem的陡降都发生在凌晨1:00之后,检查系统作业发现每天1:00都会有一个数据库备份脚本开始运行:首先是用“exp”命令给数据库做逻辑备份,然后用“cp”命令把备份出来的文件拷贝到后备存储上。这两个命令都是正常退出,没有任何报错。开始时我们曾怀疑是有内存泄漏,当某一天freemem大幅攀升时,此怀疑被解除了,因为如果有内存泄漏,系统是无法将内存回收回来的。 对于一个物理内存为10GB的系统来说,如果空闲内存(freemem)真的减少到不到二百兆,那将存在着严重的问题。但奇怪的是系统的CPU使用率一直很低,所有进程的反应也很快,系统没有任何资源匮乏的迹象。如何解释这些问题呢,为此我们对Solaris 2.x 的内存管理机制进行了研究。 二、Solaris的内存管理机制 Solaris 8的内存管理为虚拟内存管理。[1]简单地说,虚拟内存就是进程看到比它实际使用的物理内存多得多的内存空间,对于64位的Solaris 8操作系统,进程可以通过8K 大小的段寻址访问2的64次方字节的内存空间,这种8K的段被称为页(page)。传统的UNIX通过进程(pagedaemon)完成虚拟地址和物理地址间的转换,在Solaris中这些是通过一个硬件-MMU(Memory Management Unit)-来实现的。在多处理器系统中,每个CPU 都有自己的MMU。Solaris 8的虚拟存储体系由系统寄存器、CPU CACHE、主存(RAM,物理内存)、外存(磁盘、磁带等)构成。 有两个基本的虚拟内存系统管理模型[2]:交换(swapping)和按需换页(demand paged)模型。交换模型的内存管理粒度是用户进程,当内存不足时,最不活跃的进程被交换出内存(swapping out)。按需换页模型的内存管理粒度是页(page),当内存匮乏时,只有最不经常使用的页被换出。Solaris 8结合使用了这两种内存管理模型,在通常情况下使用按需换页模型,当内存严重不足时,使用交换模型来进行内存释放。 与传统UNIX系统相比,Solaris虚拟内存系统的功能要丰富得多,它负责管理所有与I/O和内存相关的对象,包括内核、用户应用程序、共享库和文件系统。传统的UNIX系统V(System V)使用一个单独的缓冲区来加速文件系统的I/O, Solaris 8则使用虚拟内存系统来管理文件系统的缓存,系统的所有空闲内存都可以被用来做为文件I/O缓存,因为RAM的访问速度比磁盘快得多,所以这样做带来的性能提高是可观的。这也意味着在存在大量文件系统I/O的系统上,空闲内存的数量几乎是0。 了解系统内存被分配到了什么地方,系统在什么情况下进行内存整理是系统管理的重

施工重点、难点分析及解决方案

第二章施工特点、重点、难点分析及解决方案第一节 第二节 第三节本工程施工的特点 本工程施工的重点、难点分析工程重点和难点的施工保障措施 第二章工程特点、难点及项目管理重点 第一节本工程施工的特点 本工程属于中心区集办公、酒店及公寓为一体的超高层建筑群,地下室面积大,塔楼高度高,裙楼层高大,结构设计复杂,大量使用钢结构,业主对施工总承包商工期、质量、安全、文明施工、环境保护等有很高的要求和制约条件。概括看来,本工程的施工特点可以归纳出以下几点: 1、本工程集办公、商业、酒店、公寓于一体,工程规模大,总建筑面积232045 m2。 地下3层,地上裙楼4层,A座塔楼61层,B座塔楼36层,最高建筑高度达到300.8m。 2、本工程工期较紧,质量目标要求高,确保市优、争创鲁班奖。 3、本工程A栋结构形式为:型钢混凝土柱、钢梁-核心筒结构;梁板结构为钢梁+混凝土楼板,结构形式复杂,是本工程的特点之一。 4、对电气、给排水、空调专业要求高,并有较强的深化设计能力要求。 5、防水工程施工面积大,防水施工质量要求高。本工程靠海较近,地下水异常丰富,在桩基础施工完毕后,防水施工即会成为难点。 第二节本工程施工的重点、难点分析 1、高强度混凝土施工

本工程结构混凝土设计等级高,A栋竖向构件至顶层砼强度全部为C70、C60,属于高强度混凝土施工。混凝土原材料的质量控制、配合比设计、运输、浇筑、养护都会影响到主体质量、结构的安全性,是本工程的难点和重点。 2、大体量的钢结构工程施工 本工程大量采用了型钢结构,A栋周圈框架柱、核心筒剪力墙、楼层钢梁、屋面钢桁架;B栋避难层钢斜撑;裙楼屋面钢桁架结构等,均采用了大量钢结构施工。钢结构重量大,体积大,不仅制作、安装精度要求高,而且机械设备的选择和布局直接关系到施工质量和进度,因此,在施工中需要进行重点组织。 3、裙楼泳池的钢桁架施工 裙楼屋面设50×12.5m标准游泳池及戏水池,仅计算泳池内水体积将达到约1000吨,此荷载对屋面承载能力要求极高,因此结构采取了钢桁架的形式,在施工中属于重点控制部分。4、A栋塔楼高空酒店大堂屋盖施工 A栋塔楼43层以上为酒店部分,为满足使用要求,建筑设计将此部分酒店大堂设计为中空式,中空高度达到了70.82m,顶部为钢梁混凝土板结构,此部分施工高度极高,属罕见高支模施工,因此,此部分施工是本工程的难点。 5、建筑节能暨玻璃幕墙施工 本工程采用了许多节能设计,比如采用挤塑板等材料进行节能保温,采用进口夹胶玻璃幕墙等,对节点施工和成品保护要求高。幕墙采用单元式幕墙,安装面积大,从幕墙的预埋到安装贯穿了整个结构施工的全过程,且对日后使用中抗渗漏的要求较高。 6、总包全面协调与管理难度大 本工程专业分包单位多,包括主体结构工程,钢结构工程,装饰、装修工程,建筑给排水工程,建筑电气工程,通风空调工程,屋面及防水工程,智能建筑工程,金属门窗工程,幕墙工程,消防工程,高低压配电工程,室外环境工程等,需要总包全面协调与管理的要求高,难度大。

JVM原理以及JVM内存管理机制

一、 JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成, 首先来说一下JVM工作原理中的jdk这个东西, .JVM 在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机. 操作系统装入JVM是通过jdk中Java.exe来完成。 通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例 4.调用JNIEnv实例装载并处理class类。 对于JVM自身的物理结构,我们可以从下图了解:

JVM的一个重要的特征就是它的自动内存管理机制,在执行一段Java代码的时候,会把它所管理的内存划分 成几个不同的数据区域,其中包括: 1. 程序计数器,众所周知,JVM的多线程是通过线程轮流切换并 分配CPU执行时间的方式来实现的,那么每一个线程在切换 后都必须记住它所执行的字节码的行号,以便线程在得到CPU 时间时进行恢复,这个计数器用于记录正在执行的字节码指令的地址,这里要强调的是“字节码”,如果执行的是Native方法,那么这个计数器应该为null; 2.

3. Java计算栈,可以说整个Java程序的执行就是一个出栈入栈 的过程,JVM会为每一个线程创建一个计算栈,用于记录线程中方法的调用和变量的创建,由于在计算栈里分配的内存出栈后立即被抛弃,因此在计算栈里不存在垃圾回收,如果线程请求的栈深度大于JVM允许的深度,会抛出StackOverflowError 异常,在内存耗尽时会抛出OutOfMemoryError异常; 4. Native方法栈,JVM在调用操作系统本地方法的时候会使用到 这个栈; 5. Java堆,由于每个线程分配到的计算栈容量有限,对于可能会 占据大量内存的对象,则会被分配到Java堆中,在栈中包含了指向该对象内存的地址;对于一个Java程序来说,只有一个Java堆,也就是说,所有线程共享一个堆中的对象;由于Java堆不受线程的控制,如果在一个方法结束之后立即回收这个方法使用到的对象,并不能保证其他线程是否正在使用该对象;因此堆中对象的回收由JVM的垃圾收集器统一管理,和某一个线程无关;在HotSpot虚拟机中Java堆被划分为三代:o新生代,正常情况下新创建的对象会被分配到新生代,但如果对象占据的内存足够大以致超过了新生代的容量限 制,也可能被分配到老年代;新生代对象的一个特点是最 新、且生命周期不长,被回收的可能性高;

重难点分析及解决措施

第一节前期报批重难点分析及解决措施 (一)报批内容繁多编制 根据招标文件的内容,涉及到的相关部门有20几个,应提前编制报批进度控制计划,罗列出本项目所涉及到的所有报批内容,并和设计文件的进度有效的衔接,另外我单位一直从事全过程项目管理(代建)的工作,对办事流程熟悉,能为前期报批管理工作带来一定得便捷。鉴于项目的建设已十分迫切,建议为加快项目建设过程,应利用项目本身的优势,争取有关方面给予支持,争取绿色通道,缩短报批的中间环节审批时间。如我方中标,为了能出色完成该项任务,安排前期报批部专项人员来协助业主方完成前期报批的各项手续。我单位以围绕申领建筑工程规划许可证和施工许可证位置中心开展相应的前期工作,通过全面衔接业主方已进行的工作,熟悉项目功能要求和各项限制条件,用以指导后续前期工作,既保证项目工作连续性,也发挥出我单位的技术先进性,确保前期工作的准备质量。 (二)前期沟通协调设计部门多 1、必须加强与政府各职能部门(涉及的部门包括发改委、市政、公安交通等)的联系,了解政府的有关政策,及时办理相关手续,决不违章作业,确保工程严格按国家规定的基本建设程序顺利进行。在工程建设过程中,建设管理单位应主动要求有关管理部门到现场检查和指导工作,对管理部门提出的有关整改问题应积极、及时进行改正和处理,不断完善和提高现场建设管理水平。 2、建设管理单位严格按基本建设程序办理相关前期手续,包括规划许可证,国土使用证,开工许可证,初步设计和施工图设计的消防审查意见书、卫生防疫审查意见书、图纸审查书、人防审查意见,质监备案通知,安监备案通知以及文物勘察通知,水、电、气、通讯、道路开口、市政排水等的申请批准书等。在办理手续时保证按政府及有关职能部门的规定要求提供项目完整的报批所需要有关资料和文件,项目的建设要求和内容在报建前应符合规划和相关法律、法规的规定,如项目

全面介绍Windows内存管理机制

全面介绍Windows内存管理机制及C++内存分配实例 文章整理: https://www.wendangku.net/doc/601575927.html, 文章来源: 网络- - 本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。 本文目的: 对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。本文内容: 本文一共有六节,由于篇幅较多,故按节发表。 1.进程地址空间 1.1地址空间 ?32|64位的系统|CPU 操作系统运行在硬件CPU上,32位操作系统运行于32位CPU 上,64位操作系统运行于64位CPU上;目前没有真正的64位CPU。 32位CPU一次只能操作32位二进制数;位数多CPU设计越复杂,软件设计越简单。 软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x0000 0000~0xFFFF FFFF。 ?NULL指针分区 范围:0x0000 0000~0x0000 FFFF 作用:保护内存非法访问 例子:分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000;当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。 那么,为什么需要那么大的区域呢,一个地址值不就行了吗?我在想,是不是因为不让8或16位的程序运行于32位的系统上呢?!因为NULL分区刚好范围是16的进程空间。 ?独享用户分区 范围:0x0001 0000~0x7FFE FFFF 作用:进程只能读取或访问这个范围的虚拟地址;超越这个范围的行为都 会产生违规退出。 例子: 程序的二进制代码中所用的地址大部分将在这个范围,所有exe 和dll文件都加载到这个。每个进程将近2G的空间是独享的。 注意:如果在boot.ini上设置了/3G,这个区域的范围从2G扩大为3G: 0x0001 0000~0xBFFE FFFF。 ?共享内核分区 范围:0x8000 0000~0xFFFF FFFF 作用:这个空间是供操作系统内核代码、设备驱动程序、设备I/O高速缓存、非页面内存池的分配、进程目表和页表等。 例子: 这段地址各进程是可以共享的。

项目重点难点分析、应对措施及相关的合理化建议备课讲稿

三、项目重点、难点分析及应对措施 3.1 项目重点分析 3.1.1 技术重点 1.高速视频截图信息采集 在确保不影响原系统正常运行的前提下,部署一台快拍服务器安装相应的捕捉软件,通过设备的专用SDK把图像截取出来。提供相应的图片信息和预警信息用于信息发布,自动提示管理工作人员查看并采取相应措施缓解通行压力,提高通行效率;同时通过易行网、交通在手等公共信息平台进行信息发布,指导公众出行。 2.龙岗局指挥分中心设备兼容性开发 原系统因搬迁老旧等多种原因导致系统瘫痪,无法正常工作,本次任务的重点是采用更换,维修,调试的手段完全恢复之前的系统,使之正常工作。 3. 道路货物运输从业资格培训考场视频监控数据采集 在深圳市交通运输培训中心和集运祥集装箱拖车驾驶员培训有限公司考场安装一批监控摄像机,并且将视频监控画面接入到港航和货运交通管理局新洲机房。通过iPad电脑上实现无线的一键集中控制,一键操作:整个系统的信号切换路由,液晶升降系统的升和降,投影的开关,投影幕的升降操作以及所有设备的电源开关,则系统必须和苹果iPad系统做对接。 4.地铁视频整合和采集 整合接入深圳市5条地铁线路所有模拟、数字视频信号资源。 (1)视频采集 在地铁1号线、2号线、3号线三条地铁线路监控中心机房安装交委的流媒体服务器,视频信号通过流媒体服务器接入交委监控视频管理平台,5号线视频信号直接以客户端形式接入,4号线优化视频接入方式,以增强网络安全性。 (2)接口开发 不同品牌设备之间的兼容对接需要进行二次接口开发,交委监控管理平台不

兼容的品牌设备接入需要进行二次开发。 5.盐田区交通监控视频采集 (1)盐田公安分局可通过新建视频综合管理平台对梅沙派出所辖区内的所有监控图像进行调用; (2)盐田公安分局新建一套视频综合平台系统,配置视频输出卡,通过光端机将视频信号接入到东部交通局。为保证公安网的安全,须在盐田公安分局加装一台矩阵网关; (3)东部交通运输局调试英飞拓模拟矩阵,解决共享盐区公安分局视频监控接入及视频上传到交委主中心的问题; (4)东部交通局搭建一台DVR和视频抓拍服务器,对接前端矩阵协议并抓拍获取到的相应视频图片; (5)在东部局安装开发用于识别矩阵编码的协议对接软件,通过协议对接获取切换视频的通道,以便建立对应的图片库; (6)传输网络:为解安全问题,拟将采用电信租用裸光纤,盐田公安分局与东部交通运输局对点对互联。 6.客运码头视频采集 提取机场客运码头公开区域的视频监控信号,在不影响机场客运码头视频监控系统的前提下,计划把解码器解码的视频通过视频分配器一分二,一路进入现有机场客运码头视频监控系统,另一路连接硬盘录像机,通过硬盘录像机接入交委视频网络。由华三的解码卡解码后的视频信号每路进行一分二,分别分配给交委和机场客运码头监控系统,分配给交委的视频信号通过接入交委增加的硬盘录像机进入交委的视频网络。 3.1.2 施工重点 1.本着“安全第一,文明施工”的原则,综合分析,本项目的施工场地绝大部分都是在室内。因此防火,触电问题一定要引起高度重视。 2.涉及的软件在能满足招标方要求的前提下,软件界面要人性化易使用人员操作,便于升级添加更多的功能板块。 3.本项目与原有系统有关联的,确保新建的系统不影响原系统的稳定运行,

操作系统内存管理原理

内存分段和请求式分页 在深入i386架构的技术细节之前,让我们先返回1978年,那一年Intel 发布了PC处理器之母:8086。我想将讨论限制到这个有重大意义的里程碑上。如果你打算知道更多,阅读Robert L.的80486程序员参考(Hummel 1992)将是一个很棒的开始。现在看来这有些过时了,因为它没有涵盖Pentium处理器家族的新特性;不过,该参考手册中仍保留了大量i386架构的基本信息。尽管8086能够访问1MB RAM的地址空间,但应用程序还是无法“看到”整个的物理地址空间,这是因为CPU寄存器的地址仅有16位。这就意味着应用程序可访问的连续线性地址空间仅有64KB,但是通过16位段寄存器的帮助,这个64KB大小的内存窗口就可以在整个物理空间中上下移动,64KB逻辑空间中的线性地址作为偏移量和基地址(由16位的段寄存器给处)相加,从而构成有效的20位地址。这种古老的内存模型仍然被最新的Pentium CPU支持,它被称为:实地址模式,通常叫做:实模式。 80286 CPU引入了另一种模式,称为:受保护的虚拟地址模式,或者简单的称之为:保护模式。该模式提供的内存模型中使用的物理地址不再是简单的将线性地址和段基址相加。为了保持与8086和80186的向后兼容,80286仍然使用段寄存器,但是在切换到保护模式后,它们将不再包含物理段的地址。替代的是,它们提供了一个选择器(selector),该选择器由一个描述符表的索引构成。描述符表中的每一项都定义了一个24位的物理基址,允许访问16MB RAM,在当时这是一个很不可思议的数量。不过,80286仍然是16位CPU,因此线性地址空间仍然被限制在64KB。 1985年的80386 CPU突破了这一限制。该芯片最终砍断了16位寻址的锁链,将线性地址空间推到了4GB,并在引入32位线性地址的同时保留了基本的选择器/描述符架构。幸运的是,80286的描述符结构中还有一些剩余的位可以拿来使用。从16位迁移到32位地址后,CPU的数据寄存器的大小也相应的增加了两倍,并同时增加了一个新的强大的寻址模型。真正的32位的数据和地址为程序员带了实际的便利。事实上,在微软的Windows平台真正完全支持32位模型是在好几年之后。Windows NT的第一个版本在1993年7月26日发布,实现了真正意义上的Win32 API。但是Windows 3.x程序员仍然要处理由独立的代码和数据段构成的64KB内存片,Windows NT提供了平坦的4GB地址空间,在那儿可以使用简单的32位指针来寻址所有的代码和数据,而不需要分段。在内部,当然,分段仍然在起作用,就像我在前面提及的那样。不过管理段的所有责任都被移给了操作系统。

三、项目重点难点分析、应对措施及相关的合理化建议

三、项目重点难点分析、应对措施及相关的合理化建议 第一节项目重点难点分析 一、工程的特点 本次设计涉及到建筑设计,室内设计,园林绿化设计。设计工种复杂,且互相之间交错渗透。在室内设计中,既要满足室内各个功能的要求,又要与建筑及园林等设计相协调。且在现有的条件下,要遵循相应的规范。 二、设计工作难点 1、根据业主招标书的要求和工程现场的情况,充分理解现有场地空间,合理布置,满足工程的功能需求。 2、善于将利用现有地形,进行整体设计,满足功能、满足工作的需求去组织空间;运用材质、色彩、光线、声音等去创造空间美,达到人与空间沟通美的享受。 3、善于运用科技手段去满足各种环境的特殊要求,如空气净化、水净化、气体净化、静电控制、微震控制、噪声控制、工程防腐等,并具有相当丰富的设计经验。 4、尊重地域文化、社会、经济背景,刻意现有空间,以不断创新的手法去迎接各种挑战。以严谨的学风,精益求精,追求最新、最美、最好。 第二节项目重点难点应对措施 一、总体方案深化设计阶段 (一)图纸资料(由甲方提供) 1、地形图。根据面积大校提供1:2000、1:1000、1:500园址范围内总平面地形图。图纸应明确一下内容:设计范围(红线范围、坐标数字);元址范围内的地形、标高及现状物(现有建筑物、构筑物、山体、水溪、植物、道路、水井,还有水系的进出口位置、电源等的位置。现转物种要求保留利用、改造和拆迁等情况要分别说明。四周环境与市政交通联系的主要道路名称、宽度、标高点数字以及走向和道路、排水方向;周围机关、单位、居住区的名称、范围以及今后发展状况。 2、局部放大图。1:200图纸主要为提供局部详细设计用。该图纸要满足建筑单位设计,及其周围山体、水溪、植被、园林小品及园路的详细布局。 3、要保留使用的主要建筑的平、立面图。(平面图位置注明室内、外标高;里面图要标明建筑物的尺寸、颜色等内容) 4、现状树木分布位置图(1:200,1:500)。主要标明要保留树木的位置,并注明品种、胸径、生长状况和观赏价值等。有较好观赏价值的树木最好附以彩色照片。 5、地下管线图(1:500,1:200),一般要求与施工图比例相同。图内应标明要表明的上水、于水、污水、化粪池、电信、电力、暖气沟、煤气、热力等管线的位置及井位等。除了平面图外,还要有剖面图,并需要注明管径的大小、管底或管顶标高、压力、坡度

Windows内存管理机制及C++内存分配实例(三):虚拟内存

本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。 本文目的: 对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。 本文内容: 3. 内存管理机制--虚拟内存 (VM) · 虚拟内存使用场合 虚拟内存最适合用来管理大型对象或数据结构。比如说,电子表格程序,有很多单元格,但是也许大多数的单元格是没有数据的,用不着分配空间。也许,你会想到用动态链表,但是访问又没有数组快。定义二维数组,就会浪费很多空间。 它的优点是同时具有数组的快速和链表的小空间的优点。 · 分配虚拟内存 如果你程序需要大块内存,你可以先保留内存,需要的时候再提交物理存储器。在需要的时候再提交才能有效的利用内存。一般来说,如果需要内存大于1M,用虚拟内存比较好。 · 保留 用以下Windows 函数保留内存块

VirtualAlloc (PVOID 开始地址,SIZE_T 大小,DWORD 类型,DWORD 保护 属性) 一般情况下,你不需要指定“开始地址”,因为你不知道进程的那段空间 是不是已经被占用了;所以你可以用NULL。“大小”是你需要的内存字 节;“类型”有MEM_RESERVE(保留)、MEM_RELEASE(释放)和 MEM_COMMIT(提交)。“保护属性”在前面章节有详细介绍,只能用前 六种属性。 如果你要保留的是长久不会释放的内存区,就保留在较高的空间区域, 这样不会产生碎片。用这个类型标志可以达到: MEM_RESERVE|MEM_TOP_DOWN。 C++程序:保留1G的空间 LPVOID pV=VirtualAlloc(NULL,1000*1024*1024,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READW if(pV==NULL) cout<<"没有那么多虚拟空间!"<

相关文档 最新文档