操作系统实验二

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验报告课程名称操作系统实验项目内存管理实验仪器台式电脑系别计算机科学与技术系专业计算机科学与技术班级/学号*学生姓名*实验日期2018年12月26日成绩指导教师*实验二内存管理实验时数:4学时实验类别:设计型实验批次:1批,1人/组实验地点:健翔校区计算中心一、实验目的内存管理是操作系统的主要功能之一,本实验需要完成两个并发进程通过共享存储器机制对文件的修改。通过本次实验,能够使学生进一步熟练使用Linux内存管理相关函数和系统调用进行编程,进而掌握内存管理的基本功能和通过共享存储器方式实现进程间通信的基本原理。二、实验环境操作系统:任何Unix/Linux编译器:gcc三、实验要求1.学生应完成如下章节的学习:进程和线程、调度、进程通信、存储管理。2.在Linux操作系统下,使用C语言编程,使用相关函数和系统调用进行设计实现四、实验内容1.打开当前目录下的文件f1,使用系统调用mmap()创建共享存储区,大小为一个页面,将文件f1映射进内存,地址返回到src。2.使用malloc()函数申请一个内存块,地址返回到dst。申请成功后,使用memmove()函数将共享存储区的内容复制到dst。3.使用fork()调用创建一个新进程,之后父进程阻塞自己。4.子进程使用memccpy(()将dst中”W”之后内容的地址复制到temp,将temp中前2个字符用@替换。之后将修改后的dst的内容使用memmove()复制回src,关闭文件f1,释放dst。5.父进程使用memset()将共享存储区src中前2个字符用“Q”替换。最后显示经2次修改后的f1的内容。五、实验代码#includeunistd.h#includestdio.h#includefcntl.h#includemalloc.h#includestdlib.h#includestring.h#includesys/types.h#includememory.h#includesys/mman.hintmain(){intfd,page_size;pid_tpid;//⑴显示当前系统的页面大小;page_size=getpagesize();printf(页面大小=%d\n,page_size);fd=open(./f1,O_RDWR);char*src=(char*)mmap(NULL,page_size,PROT_WRITE,MAP_SHARED,fd,0);if(src==MAP_FAILED){printf(error\n);exit(1);}//⑵显示src的内容;printf(src的内容=%s\n,src);//⑶使用malloc()函数申请一个页面大小的内存空间,地址返回到dst;char*dst=(char*)malloc(page_size);//⑷使用memmove()函数将共享存储区的内容复制到dst;memmove(dst,src,page_size);//⑸显示dst的内容;printf(dst的内容=%s\n,dst);pid=fork();if(pid==0){/*子进程空间*///⑹使用memccpy()将dst中”W”之后内容的地址返回到temp;char*temp=(char*)memccpy(dst,src,'W',page_size);//⑺显示temp的内容及其内存起始地址;printf(temp的内容=%s\n,temp);printf(temp的地址=%p\n,temp);//⑻将temp中前2个字符用@替换,显示替换后的dst内容;memset(temp,'@',2);printf(temp的内容=%s\n,temp);printf(dst的内容=%s\n,dst);//⑼使用memmove()将修改后的dst的内容复制回src;memmove(src,dst,strlen(dst));//⑽显示src的内容(包含PID及PPID);printf(src的内容=%s\n,src);printf(PIDis:%d,PPIDis:%d,Thesrcvalueofendis:%s\n\n,getpid(),getppid(),src);/*显示src指向的共享存储区内容*///⑾关闭之前打开的文件f1,释放dst;close(fd);free(dst);}elseif(pid0){/*父进程空间*/wait(NULL);//⑿使用memset()将共享存储区src中前2个字符用”Q”替换,并显示替换后的内容(包含PID及PPID);memset(src,'Q',2);printf(src的内容=%s\n,src);//printf(PIDis:%d,PPIDis:%d,Thesrcvalueofendis:%s\n\n,//getpid(),getppid(),memset(src,'Q',2));/*显示src指向的共享存储区内容*/printf(PIDis:%d,PPIDis:%d,Thesrcvalueofendis:%s\n\n,getpid(),getppid(),src);/*显示src指向的共享存储区内容*///⒀显示经2次修改后的文件f1的最终内容;printf(Thef1resultofendis:\n\n);system(od-cf1);}if(munmap(src,page_size)==0)/*释放共享存储区*/{printf(PIDis:%d,PPIDis:%d,munmapsuccess\n\n,getpid(),getppid());}else{printf(PIDis:%d,PPIDis:%d,munmapfailed\n\n,getpid(),getppid());}return0;}六、实验截图七、实验总结通过本次实验,使我进一步熟练使用Linux内存管理相关函数和系统调用进行编程,进而掌握了内存管理的基本功能和通过共享存储器方式实现进程间通信的基本原理。在老师和同学的帮助下,我成功解决了我的一些问题和困惑,使我对操作系统更加感兴趣,也为今后的学习生活奠定了基础。八、思考题1:了解函数memchr()的用法,试用其替代子进程中的memccpy()以简化代码。答:memchr()头文件string.h函数原型void*memchr(constvoid*src,charch,size_tn)功能:从头开始搜寻src所指的内存内容前n个字节,直到发现第一个值为ch的字节。返回值:如果找到指定的字节,返回一个指针,指向ch在字符串中首次出现的位置,如果ch没有在字符串中找到,返回NULL。2:说明程序最后printf(PIDis:%d,PPIDis:%d,Thesrcvalueofendis:%s\n\n,getpid(),getppid(),src)的输出结果答:

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功