兰州大学操作系统实验七存储管理题目和答案

上传人:suij****uang 文档编号:197203462 上传时间:2023-04-03 格式:DOCX 页数:13 大小:84.42KB
收藏 版权申诉 举报 下载
兰州大学操作系统实验七存储管理题目和答案_第1页
第1页 / 共13页
兰州大学操作系统实验七存储管理题目和答案_第2页
第2页 / 共13页
兰州大学操作系统实验七存储管理题目和答案_第3页
第3页 / 共13页
资源描述:

《兰州大学操作系统实验七存储管理题目和答案》由会员分享,可在线阅读,更多相关《兰州大学操作系统实验七存储管理题目和答案(13页珍藏版)》请在装配图网上搜索。

1、实验七 实验报告实验名称:7存储管理实验目的:1. 观察系统存储器使用情况2. 观察进程使用存储器的情况3. 掌握通过内存映像文件提高性能的方法4. 掌握动态内存分配技术实验时间3学时预备知识:1.存储相关的命令free显示系统使用和未被使用的内存数量(可以实时执行)输出包含的标题有3行信息:Mem。此行包含了有关物理内存的信息。包括以下详细内容:total。该项显示可用的物理内存总量,单位为KB。该数字小于安装的物理内存的容量,是因为内核本身也要使用一小部分的内存。used。该项显示了用于应用程序超速缓存数据的内存容量。free。该项显示了此时未使用且有效的内存容量。Shared/buffe

2、rs缓冲区/cached0这些列显示了有关内存如何使用的更为详细的信息。-/+buffers/cache。Linux系统中的部分内存用来为应用程序或设备高速缓存数据。这部 分内存在需要用于其他目的时可以释放。free列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用 内存容量。vmstat报告进程、内存、分页、IO等多类信息(使用手册页size列出目标文件段大小和总大小(使用手册页2. /proc文件系统(使用手册页man 5 proc)/proc/meminfo内存状态信息/proc/stat包

3、含内存页、内存对换等信息。/proc/$pid/stat某个进程的信息(包含内存使用信息)/proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设 备号和映射文件的索引节点。/proc/$pid/statm某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、 文本页面数、堆栈页面数和脏页面数。3.内存映像文件内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这 样做可以加速I/O操作,并可以共享数据。3.1 mmap (建立内存映射)表头文件 #include #include 定义函数 void *mmap(void *st

4、art,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映射区域不能存取参数flags会影响映射区域的各种特性M

5、AP_FIXED如果参数start所指的地址无法成功建立映射时,则放弃映射,不 对地址做修正。通常不鼓励用此旗标。MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该 文件的进程共享。MAP_PRIVATE对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件 内容。MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映 射区域无法和其他进程共享。MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作 将会被拒绝。MAP_LOCKED将映射区

6、域锁定住,这表示该区域不会被置换(swap)。在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。参数fd为open() 返回的文件描述词,代表欲映射到内存的文件。参数offset为文件映射的偏移量, 通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。返回值若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(1),错 误原因存于errno中。错误代码EBADF参数fd不是有效的文件描述词EACCES存取权限有误。如果是MAP_PRIVATE情况下文件必须可读,使 用MAP_SHARED则要有PROT_WRITE以及该文件要能写

7、入。EINVAL 参数 start、length 或 offset 有一个不合法。EAGAIN文件被锁住,或是有太多内存被锁住。ENOMEM 内存不足。3.2 munmap (解除内存映射)表头文件 #include#include定义函数 int munmap(void *start,size_t length);函数说明 munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲 取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动 解除,但关闭对应的文件描述词时不会解除映射。返回值 如果解除映射成功则返回0,否则返回一1,错误原因存于

8、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()所返回的内存指针。调用 free()后ptr所指的内存空间

9、便会被收回。假若参数ptr所指的内存空间已被收回或是未 知的内存地址,则调用free()可能会有无法预期的情况发生。若参数ptr为NULL,贝0 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连续实时观察内存的使用情况。寻找字符串模式匹配3. 用size工具观察三个不

11、同的可执行文件的大小以及它们段的大小。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*/fstat(fd,&sb); /*取得文

12、件大小*/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文件系统列出系统当前内存的使用情况。w u u ry |-f i=u1、xtngkonggubuntu:$J 1 =freetotalusedfrees

13、haredbufferscachedMem:1926104911652114452035324447612-/+ buffers/cache:425716600388Swap:104652442281042296Ktngkongubuntu:$ cat /proc/nentnfoMemlotal:1026194kBMei-iFree;113884kBBuffers:3856IcBCached!447624kBSwapCached i644kBActive;375356kBInactive:438556kBActtve(anon):15S444kBInactive(anon):234388kBA

14、ctive(file):219912kBInacttve(file):204168kBllnevictable:OkBMlocked;电kBHtghTotal:135048kBHtghFree:1768kBLowTotdl:891056kBLowFree:112116kBSwapTotal:1946524kBSwapFree:1042296kBDirty:20kBWriteback:0kBAnonPages:S27132kBMapped;86056kBuhmiprn 呼斥京T Fiad IrlR9,启动几个耗时较长的后台进程(多个grep),分别使用free和vmstat连续实时观察内存的使用

15、情况。寻找字符串模式匹配c!:uaiditnt(char *str pel*ek_t tlrwfreesharedcached -54 0532. , long tpS=syse&ftf(_SC_rLK_TCK );y p rHSs: Kt$ 一 2fsen Hstr.( floa t) t tm 芭 / tp% );buffers3S9i6Bfree 110164 S98S5* 1&422916ued 9159Xie 4200X1342233:prUrt 刊 yh-3C J 5 eriid=t-lrie$(!t_e 的gc a 3w - ss rtjj;c-s pot$(r,pareritc

16、 j :触 tuserCPU* % 上_加。,tfts_ytli*e) fc3”t $y sCPU P t_end -e:pvt*(whLld&c : ttRe_pirtnt( rtgeMPir * t_-eMtns.cutime);3:七 My 戏刖 % t_end - tflsjitlse);c-exlt(ExrT_succ ess);wmstatprocsr b1 B1J+ Ixtngkonggubuntuj-S- total.昵 Fl:.1026104-/4 buffers/cachej 5uap:1016524xtngkonguhuntu:-$-swap- to stsobt00J6

17、-colar=autci cache酗目列Bgrepmemoryswpd free buffA22S 11O164 394flDanes料apuntu:-$ vnstatjrocs feeoV- r bsupd freebuff cache2 04228 110560 39172 44816810.用size工具观察三个不同的可执行文件的大小以及它们段的大小。Size命令的输出不包括stack和heap的部分。只包括文本段(text),代码段(data),未 初始化数据段(bss)三部分。xingkongubuntu:sizeos-file/cputesttextdatabssdechexfi

18、lename2184283g24899 beos-file/cpute&txingkongubuntu:sizeos-file/forktesttextdatabssdechexftlenane167828&xtngkongubuntu:5size1966 os-ftle/pcbos-file/forktesttextdatabssdechexftlenaiHe36122761843472d96os-file/pcb11.启动一个耗时较长的后台进程,通过/proc文件系统查看该进程所有内存使用相关信息,并列出。第一个启动的后台进程是上个实验最后一题的读写程序。此程序耗时较长第二个启动的是xey

19、es进程。roatgubuntu:/home/us&r# cat /proc/2856/stat2&56 (ftforead) S 2813 2S5& 2621 3481了 299C 1194560 197 0000000 20 &1&1 &6S73 2031&1& 70 4294915729517 3 & 0 & 0 &134512(540 1345146843217824688 3217824392 30775675240000 323&372&17 & 0 root ubuntu:/hone/user# 49fi 70 57 1 & 41 a root ubuntu:/hone/user

20、# &sa4aaaa-aaa49aaa &80490&0-0904a00& &8D4aODO-O0O4bDO& t75470&0-b7548&0& t75490D0-b76e7D0& o t76e70D0-b76e?D0& o t76e90D0-b76edD0& & t75eaa&3 t7&fdo&o t75ff9&3 t770&9&0 t772&303 t772130O tfca3300cat /proc/2856/statnr- xp r- -p rw-p irw-p r- Kprw-p rat /proE/2856/niBps a&aaa&aa o&ooo&oo 0&0D1&0D 0&0

21、00&00 ODODO&OO0019f000OOlalOOO08:0108:0108:0109:0008:01297470297470297470 0394145394145394145/horne/user/f if oread /home/user/f if oread /Ihone/u5er/f if oread/lib/i386-Vimjx-9nu八ib,-芝15+s/lib/i3B6-linux-gnu/l_ibc 2,lS*s/lib/i3B6-linux-gnu/l_ibc 2,lS*sb?6ed&30 b?6ff&30 b?703&G0 b7720&GO b7721EJ0& b

22、772200&bfC4EJ0 &30093000 00093009 30003030 30993009 E01fE9 & 00020&00 000&0&0&9:3&9:9& &8:01 &8:31&8:01 &3:3&0 Q Q 394125 391125 3911250vdEO/Ltb/i386-l-inux-gnu/ld-2.15.so fltb ftJEfi-linux-gnu/ld. 15.so /lib tSEe-T-tnux-gnu/ld. is. so stackxlngkonQubuntu:-$ xeyesfl1 2791 xtngkongfubuntu;-$ cat /prc

23、c/Z791/itat 2791 Cxeyes) 5 Z&ZT 2791 Z6Z7 3AS17 2847 421338& &1? & & B SS 15 S S ZP 9 1 9 IP 5J8 8JJ9455 4丽 4Z59&7Z95 134512640 134525015 3查4牧明牧 3214441936 jeT89J4468 9999 32395257& & 17 555559 15455283& 21444J7H 3213711 3WW573 0 IxlngkonQubuntu:-$ cat I29J& 4&4 J32 4 &xlngkonQubuntu:-$ cat 98948999

24、-98MC5& 9894c999-98Md& 98Tbc999-987f3&esso. it?5ff4999-t?5ff5& esso. iesso. isorTsoTlT9+2 sorTsoTlT9+2 sorTsoTlT9+2 t?T091999-t?71& t?7J&5999-t?7J&5&130530336 14Z3Z7800 3214443795 3/iproc/Z791/5tatmrw-p rw-p rw-p r-xprw-prw-prw-p/proc/Z791/naps眼明3眼母眼眼棘眼眼眼眼眼眼眼眼眼眄眄眄眄眄眄眄眄时。1 时。1 时。1 泗朗时。1QS:01QS:01QS:0

25、1QS:01QS:01w-707&1 7S7&1 7S7&1 0 0 7990412.编写一个程序,打印系统的页面大小。/usr/bln/xeyes/usr/bln/xeyes/usr/bln/xeyesheap/usr/ltb/isse-ltnux-gnultbxflx/usr/ltb/isse-ltnux-gnultbxflx/usr/ltb/isse-ltnux-gnultbxflx/usr/1i b/t38-Itnux-gnu/ltbxcu r/usr/1i b/t38-Itnux-gnu/ltbxcu r/usr/1i b/t38-Itnux-gnu/ltbxcu r/usr/ltb

26、/locale/locale-archlve/usr/ltb/locale/locale-archlveEi-R代码非常简单,只用到了 getpagesize()语句的应用xirgkongubuntu:5 gcc page.c -o page xirgkonguburhtu:$ ./page The page of system is:409613.阅读并编译运行以下程序,总结内存映象文件的使用方法。范例/*利用mmap()来读取/etc/passwd文件内容*/#include#include#include#include#includemain()int fd;void *start;s

27、truct 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(“s”,start);munmap(start,sb.st_size); /* 解除映射*/close(fd);总结内存映象文件的使用方法:内存映像其实就是在内存中创建一个和外存文件完全相同的映像,用户可以将整

28、个文 件映射到内存,也可以部分映射。通过内存映像实现对外存文件的操作。首先Mmap申请虚拟内存,再次调用file指针所指映射函数对其进行映射。判断是否 映射成功。进行操作。最后解除映射。14.编写一个程序,利用内存映象文件,实现less工具的功能。manp到内存中xingkcngubuntu;$ gcc less,c -o less xingkongubuntu:$ ./lesssdojfouohdf;&sd;jfksd;fk&djf;dsk;ksdk; hjfpkds-jghkf jdshnGxnvk&d Lkf sd; jfkasdsdojfouohdf;&sd;jfksd;jfksdjf

29、;dsk;ksdk;hjfpkdsjghkfjdshncxnvk&dIkfsd;jfkasdisdojf&uohdf; s sd;jfksd;jfksdjf;dsk;ksdk;hjfpkdsjghkfjd&hncxnvksdIkf&d;jfkasd sdojfouohdf;& 5d;jfksd;jfksdjf;dsk ;ksdk; hjfpkds jghkf jds.hmcxnvksdIkfsd;jfkasdsdojfouohdf;s sd;jfksd;Jfksdjf;dsk:ksdk;hjfpkdsjghkfjd&hncxnvk&d Ikfsd;jfkasdq xingkongubuntu:

30、$ |#include#include#include#include#include#include#include#include#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_RDON!Y); /* 打开 */fstat(fd,&sb); /*获取文件大小*/start=mmap(NULL,sb

31、.st_size,PROT_READ,MAP_PRIVATE,fd,0);if(start=MAP_FAILED) /*判断是否映射成功 */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)pla

32、y=1+lastrow(start,play);lab=getchar();munmap(start,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);re

33、turn i;/*输出下一行*/int nextrow(char * 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内核映像文件有两种:一种是非压缩版本,叫Image;另一种是它的压缩版本,叫 zlmagezlmage是Image经过压缩形成的,所以它的大小比Image小。为了能使用zImage 这个压缩版本,必须在它的开头加上解压缩的代码,将zImage解压缩之后才能执行,因此 它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般都比较小,内核要常 驻内存,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的, 所以一般嵌入式系统均采用压缩的内核映像文件,即zImage。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!