《操作系统实验二(共5页).docx》由会员分享,可在线阅读,更多相关《操作系统实验二(共5页).docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实 验 报 告课程名称 操作系统 实验项目 内存管理 实验仪器 台式电脑 系 别 计算机科学与技术系 专 业 计算机科学与技术 班级/学号 * 学生姓名 * 实验日期 2018年12月26日 成 绩 指导教师 * 实验二 内存管理实验时数:4 学时 实验类别:设计型实验批次:1 批,1 人/组 实验地点:健翔校区计算中心一、实验目的内存管理是操作系统的主要功能之一,本实验需要完成两个并发进程通过共享存储器机制对文件的修改。通过本次实验,能够使学生进一步熟练使用 Linux 内存管理相关函数和系统调用进行编程,进而掌握内存管理的基本功能和通过共享存储器方式实现进程间通信
2、的基本原理。二、实验环境操作系统:任何 Unix/Linux 编译器:gcc三、实验要求1学生应完成如下章节的学习:进程和线程、调度、进程通信、存储管理。2在 Linux 操作系统下,使用 C 语言编程,使用相关函数和系统调用进行设计实现四、实验内容1打开当前目录下的文件 f1,使用系统调用 mmap()创建共享存储区,大小为一个页面,将文件 f1 映射进内存,地址返回到 src。2使用 malloc()函数申请一个内存块,地址返回到 dst。申请成功后,使用 memmove()函数将共享存储区的内容复制到 dst。3使用 fork()调用创建一个新进程,之后父进程阻塞自己。4子进程使用 me
3、mccpy()将 dst 中”W”之后内容的地址复制到 temp,将 temp 中前2 个字符用替换。之后将修改后的 dst 的内容使用 memmove()复制回 src,关闭文件 f1,释放 dst。5父进程使用 memset()将共享存储区 src 中前 2 个字符用“Q”替换。最后显示经 2 次修改后的 f1 的内容。五、 实验代码#include #include #include #include #include #include #include #include #include int main() int fd, page_size; pid_t pid; / 显示当前系统
4、的页面大小; page_size = getpagesize(); printf(页面大小=%dn, 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(errorn); exit(1); /显示 src 的内容; printf(src 的内容=%sn, src); /使用 malloc()函数申请一个页面大小的内存空间,地址返回到 dst; char *dst = (
5、char *)malloc(page_size); /使用 memmove()函数将共享存储区的内容复制到 dst; memmove(dst, src, page_size); /显示 dst 的内容; printf(dst 的内容=%sn, dst); pid = fork(); if (pid = 0) /* 子进程空间*/ /使用 memccpy()将 dst 中”W”之后内容的地址返回到 temp; char *temp = (char *)memccpy(dst, src, W, page_size); /显示 temp 的内容及其内存起始地址; printf(temp 的内容=%s
6、n, temp); printf(temp 的地址=%pn, temp); /将 temp 中前 2 个字符用替换,显示替换后的 dst 内容; memset(temp, , 2); printf(temp 的内容=%sn, temp); printf(dst 的内容=%sn, dst); /使用 memmove()将修改后的 dst 的内容复制回 src; memmove(src, dst, strlen(dst); /显示 src 的内容(包含 PID 及 PPID); printf(src 的内容=%sn, src); printf(PID is: %d, PPID is: %d, Th
7、e src value of end is: %snn, getpid(), getppid(), src); /*显示src 指向的共享存储区内容*/ /关闭之前打开的文件 f1,释放 dst; close(fd); free(dst); else if (pid 0) /* 父进程空间*/ wait(NULL); /使用memset()将共享存储区src 中前2 个字符用”Q”替换,并显示替换后的内容(包含PID 及PPID); memset(src, Q, 2); printf(src 的内容=%sn, src); /printf(PID is: %d, PPID is: %d, The
8、 src value of end is: %snn, /getpid(),getppid(),memset(src,Q,2); /*显示src 指向的共享存储区内容*/ printf(PID is: %d, PPID is: %d, The src value of end is: %snn, getpid(), getppid(), src); /*显示src 指向的共享存储区内容*/ /显示经2 次修改后的文件f1 的最终内容; printf(The f1 result of end is:nn); system(od -c f1); if (munmap(src, page_size)
9、 = 0) /*释放共享存储区*/ printf(PID is: %d, PPID is: %d, munmap successnn, getpid(), getppid(); else printf(PID is: %d, PPID is: %d, munmap failednn, getpid(), getppid(); return 0;六、 实验截图七、 实验总结通过本次实验,使我进一步熟练使用 Linux 内存管理相关函数和系统调用进行编程,进而掌握了内存管理的基本功能和通过共享存储器方式实现进程间通信的基本原理。在老师和同学的帮助下,我成功解决了我的一些问题和困惑,使我对操作系统更
10、加感兴趣,也为今后的学习生活奠定了基础。八、 思考题1:了解函数 memchr()的用法,试用其替代子进程中的 memccpy()以简化代码。答:memchr()头文件 函数原型void * memchr(const void *src, char ch, size_t n)功能:从头开始搜寻 src 所指的内存内容前 n 个字节,直到发现第一个值为 ch 的字节。返回值:如果找到指定的字节,返回一个指针,指向 ch 在字符串中首次出现的位置, 如果ch 没有在字符串中找到,返回 NULL。2:说明程序最后 printf(PID is: %d, PPID is: %d, The src value of end is:%snn,getpid(),getppid(),src)的输出结果答:专心-专注-专业