资源描述:
《操作系统实验二.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验报告课程名称操作系统实验项目内存管理实验仪器台式电脑系别计算机科学与技术系专业计算机科学与技术班级/学号*学生姓名*实验日期2018年12月26日成绩指导教师*实验二内存管理实验时数:4学时实验类别:设计型实验批次:1批,1人/组实验地点:健翔校区计算中心一、实验目的内存管理是操作系统的主要功能之一,本实验需要完成两个并发进程通过共享存储器机制对文件的修改。通过本次实验,能够使学生进一步熟练使用Linux内存管理相关函数和系统调用进行编程,进而掌握内存管理的基本功能和通过共享存储器方式实现进程间通信的基本原理。二、实验环境操作系统:任何Unix/Lin
2、ux编译器:gcc三、实验要求1.学生应完成如下章节的学习:进程和线程、调度、进程通信、存储管理。2.在Linux操作系统下,使用C语言编程,使用相关函数和系统调用进行设计实现四、实验内容1.打开当前目录下的文件f1,使用系统调用mmap()创建共享存储区,大小为一个页面,将文件f1映射进内存,地址返回到src。2.使用malloc()函数申请一个内存块,地址返回到dst。申请成功后,使用memmove()函数将共享存储区的内容复制到dst。3.使用fork()调用创建一个新进程,之后父进程阻塞自己。4.子进程使用memccpy(()将dst中”W”之后内
3、容的地址复制到temp,将temp中前2个字符用@替换。之后将修改后的dst的内容使用memmove()复制回src,关闭文件f1,释放dst。5.父进程使用memset()将共享存储区src中前2个字符用“Q”替换。最后显示经2次修改后的f1的内容。五、实验代码#include#include#include#include#include#include#include#include#inc
4、ludeintmain(){intfd,page_size;pid_tpid;//⑴显示当前系统的页面大小;page_size=getpagesize();printf("页面大小=%d",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");exit(1);}//⑵显示src的内容;printf("src的内容=
5、%s",src);//⑶使用malloc()函数申请一个页面大小的内存空间,地址返回到dst;char*dst=(char*)malloc(page_size);//⑷使用memmove()函数将共享存储区的内容复制到dst;memmove(dst,src,page_size);//⑸显示dst的内容;printf("dst的内容=%s",dst);pid=fork();if(pid==0){/*子进程空间*///⑹使用memccpy()将dst中”W”之后内容的地址返回到temp;char*temp=(char*)memccpy(dst,src,
6、'W',page_size);//⑺显示temp的内容及其内存起始地址;printf("temp的内容=%s",temp);printf("temp的地址=%p",temp);//⑻将temp中前2个字符用@替换,显示替换后的dst内容;memset(temp,'@',2);printf("temp的内容=%s",temp);printf("dst的内容=%s",dst);//⑼使用memmove()将修改后的dst的内容复制回src;memmove(src,dst,strlen(dst));//⑽显示src的内容(包含PID及PPID);
7、printf("src的内容=%s",src);printf("PIDis:%d,PPIDis:%d,Thesrcvalueofendis:%s",getpid(),getppid(),src);/*显示src指向的共享存储区内容*///⑾关闭之前打开的文件f1,释放dst;close(fd);free(dst);}elseif(pid>0){/*父进程空间*/wait(NULL);//⑿使用memset()将共享存储区src中前2个字符用”Q”替换,并显示替换后的内容(包含PID及PPID);memset(src,'Q',2);printf(
8、"src的内容=%s",src);//printf("PIDi