1、实验七 实验报告实验名称:7存储管理实验目的:1. 观察系统存储器使用情况2. 观察进程使用存储器的情况3. 掌握通过内存映像文件提高性能的方法4. 掌握动态内存分配技术实验时间3学时预备知识:1. 存储相关的命令free 显示系统使用和未被使用的内存数量(可以实时执行)输出包含的标题有 3 行信息:Mem。此行包含了有关物理内存的信息。包括以下详细内容:total。该项显示可用的物理内存总量,单位为 KB。该数字小于安装的物理内存的容量,是因为内核本身也要使用一小部分的内存。used。该项显示了用于应用程序超速缓存数据的内存容量。free。该项显示了此时未使用且有效的内存容量。Shared/
2、buffers 缓冲区/cached。这些列显示了有关内存如何使用的更为详细的信息。-/+ buffers/cache。Linux 系统中的部分内存用来为应用程序或设备高速缓存数据。这部分内存在需要用于其他目的时可以释放。free 列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用内存容量。vmstat 报告进程、内存、分页、IO等多类信息(使用手册页)size 列出目标文件段大小和总大小(使用手册页)2. /proc文件系统(使用手册页man 5 proc)/proc/meminfo 内存状态信
3、息/proc/stat 包含内存页、内存对换等信息。/proc/$pid/stat 某个进程的信息(包含内存使用信息)/proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设备号和映射文件的索引节点。/proc/$pid/statm 某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、文本页面数、堆栈页面数和脏页面数。3. 内存映像文件内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这样做可以加速I/O操作,并可以共享数据。3.1 mmap(建立内存映射) 表头文件 #include #include 定义函数 void *
4、mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明 mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。参数 prot代表映射区域的保护方式有下列组合PROT_EXEC 映射区域可被执行PROT_READ 映射区域可被读取PROT_WRITE 映射区域可被写入PROT_NONE 映射区域不能存取参数
5、flags会影响映射区域的各种特性MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝
6、。MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。参数fd为open()返回的文件描述词,代表欲映射到内存的文件。参数offset为文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。返回值 若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(1),错误原因存于errno 中。错误代码 EBADF 参数fd 不是有效的文件描述词EACCES 存取权限有误。如果是MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED则要
7、有PROT_WRITE以及该文件要能写入。EINVAL 参数start、length 或offset有一个不合法。EAGAIN 文件被锁住,或是有太多内存被锁住。ENOMEM 内存不足。3.2 munmap(解除内存映射) 表头文件 #include#include定义函数 int munmap(void *start,size_t length);函数说明 munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述词时不会解除映射。返回值 如果解除映射成功则返回
8、0,否则返回1,错误原因存于errno中错误代码EINVAL参数 start或length 不合法。4. 动态内存分配4.1 malloc(配置内存空间) 表头文件 #include定义函数 void * malloc(size_t size);函数说明 malloc()用来配置内存空间,其大小由指定的size决定。返回值 若配置成功则返回一指针,失败则返回NULL。4.2 free(释放原先配置的内存) 表头文件 #include定义函数 void free(void *ptr);函数说明 参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用fr
9、ee()后ptr所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。若参数ptr为NULL,则free()不会有任何作用。4.3 calloc(配置内存空间) 表头文件 #include 定义函数 void *calloc(size_t nmemb,size_t size);函数说明 calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*size);不过,在利用calloc()配置内存时会将内存内容初始化为0。返回
10、值 若配置成功则返回一指针,失败则返回NULL。5. 其他getpagesize(取得内存分页大小) 4096个字节表头文件 #include定义函数 size_t getpagesize(void);函数说明 返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。返回值 内存分页大小。附加说明在Intel x86 上其返回值应为4096bytes。实验要求: 1. 分别使用命令和/proc文件系统列出系统当前内存的使用情况。 Free2. 启动几个耗时较长的后台进程(多个grep),分别使用free和vmstat连续实时观察内存的使用情况。寻找字符串模式匹
11、配3. 用size工具观察三个不同的可执行文件的大小以及它们段的大小。4. 启动一个耗时较长的后台进程,通过/proc文件系统查看该进程所有内存使用相关信息,并列出。5. 编写一个程序,打印系统的页面大小。6. 阅读并编译运行以下程序,总结内存映象文件的使用方法。范例 /* 利用mmap()来读取/etc/passwd 文件内容*/#include#include#include#include#includemain()int fd;void *start;struct stat sb;fd=open(“/etc/passwd”,O_RDONLY); /*打开/etc/passwd*/fst
12、at(fd,&sb); /*取得文件大小*/start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);if(start= = MAP_FAILED) /*判断是否映射成功*/return;printf(“%s”,start);munmap(start,sb.st_size); /*解除映射*/closed(fd);7. 编写一个程序,利用内存映象文件,实现less工具的功能。manp到内存中 实验要求: 8. 分别使用命令和/proc文件系统列出系统当前内存的使用情况。 9. 启动几个耗时较长的后台进程(多个grep),分别使用free和vm
13、stat连续实时观察内存的使用情况。寻找字符串模式匹配10. 用size工具观察三个不同的可执行文件的大小以及它们段的大小。Size命令的输出不包括stack和heap的部分。只包括文本段(text), 代码段(data),未初始化数据段(bss)三部分。11. 启动一个耗时较长的后台进程,通过/proc文件系统查看该进程所有内存使用相关信息,并列出。第一个启动的后台进程是上个实验最后一题的读写程序。此程序耗时较长第二个启动的是xeyes进程。12. 编写一个程序,打印系统的页面大小。代码非常简单,只用到了getpagesize()语句的应用13. 阅读并编译运行以下程序,总结内存映象文件的使
14、用方法。范例 /* 利用mmap()来读取/etc/passwd 文件内容*/#include#include#include#include#includemain()int fd;void *start;struct stat sb;fd=open(“/etc/passwd”,O_RDONLY); /*打开/etc/passwd*/fstat(fd,&sb); /*取得文件大小*/start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);if(start= = MAP_FAILED) /*判断是否映射成功*/return;printf(“
15、%s”,start);munmap(start,sb.st_size); /*解除映射*/close(fd);总结内存映象文件的使用方法: 内存映像其实就是在内存中创建一个和外存文件完全相同的映像,用户可以将整个文件映射到内存,也可以部分映射。通过内存映像实现对外存文件的操作。 首先Mmap申请虚拟内存,再次调用file指针所指映射函数对其进行映射。判断是否映射成功。进行操作。最后解除映射。14. 编写一个程序,利用内存映象文件,实现less工具的功能。manp到内存中#include#include#include#include#include#include#include#includ
16、e#includeint lastrow(char * s,int d);int nextrow(char * s,int d);int onepage(char * s,int d);int main() int fd,play=0; char lab; char *start; struct stat sb; fd=open(test.txt,O_RDONLY); /*打开*/ fstat(fd,&sb); /*获取文件大小*/ start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0); if(start=MAP_FAILED) /*判断
17、是否映射成功*/ return(1); play=onepage(start,play)+1; lab=getchar(); while(lab!=q&lab!=Q) if(playsb.st_size) lab=getchar(); break; else if(lab= ) play=play+1+onepage(start,play); else if(lab=D|lab=d) play=play+1+nextrow(start,play); else if(lab=U|lab=u) play=1+lastrow(start,play); lab=getchar(); munmap(st
18、art,sb.st_size); /*解除映射*/ close(fd); return 0;int onepage(char * s,int d) int i,count=0; char * buffer=malloc(2048);/配置内存空间,由buffer指向该空间 s+=d; /*每10行作为一页输出*/ for(i=0;i2048;i+) if(si=n) count+; if(count=10) break; memcpy(buffer,s,i); bufferi=0; printf(%sn,buffer); return i;/*输出下一行*/int nextrow(char *
19、 s,int d) int i; char * buffer=malloc(100); s+=d; for(i=0;i0;d-) if(sd=n) count+; if(count=2) break; memcpy(buffer,s+d+1,py-d-2); bufferpy-d-2=0; printf(%sn,buffer); return d;认识和体会:1.要的体会是,通过内存映像文件可以提高速度,提高性能。Mmap建立内存映射 munmap解除内存映射。动态分配内存空间用malloc free calloc 还有其他的如getpagesize()方法得到页面大小等。2. linux 内
20、核映像文件有两种:一种是非压缩版本,叫Image;另一种是它的压缩版本,叫zImage。zImage是Image经过压缩形成的,所以它的大小比Image小。为了能使用zImage这个压缩版本,必须在它的开头加上解压缩的代码,将zImage 解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般都比较小,内核要常驻内存,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的,所以一般嵌入式系统均采用压缩的内核映像文件,即zImage。党的基层组织建设有了新突破,党的作风建设有了新加强,为全镇发展经济、提高人民生活永平提供了坚实基础和强大动力c
21、arried out; 4) for spring hangers (included simple spring, hangers and constant support hangers) it should also be recognized as setting and locking of loads. 5) check the surface quality, folded layering and without cracks, rust and other defects. 5) after completion of the test and control drawing
22、 number one by one, by series baled. Color alloy steel parts, the parts marking installation location and rotation about the direction you want. 7.3.14. hangers installation 7.3.14.1 hanger layout a. a clear design of hanger should be installed strictly in accordance with the drawings and designs sh
23、all not be installed wrong, missing, etc. B. own arrangement of piping support and hanger set and selection should be based on comprehensive analysis of general layout of piping systems; cold installation of steam pipe with particular attention reserved for compensation of thermal expansion displace
24、ment and orientation. C. support systems should be rational to withstand pipe loads, static load and incidental load; reasonable piping displacement; guaranteed under various conditions, stress are within the allowed range. Strength, stiffness, and meet requirements to prevent vibration and soothing
25、 water, without affecting the adjacent equipment maintenance and other piping installation and expansion. D. equipment connected to the interface to meet pipeline thrust (torque) limit requirements; increase the stability of piping systems to prevent pipeline . C. welding elbow should be not less than 1.5 times the pipe diameter. D. Press elbow should be not smaller than the outside diameter of the pipe.