Skip to content

ACMClassCourses/os-practice2-mmap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

编程小作业 2:mmap初尝试

任务1:通过mmap修改文件

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存。

在这个任务中,你需要使用mmap来实现通过共享映射方式的文件修改。任务的期望目标是实践如何使用mmap,对mmap的API有所了解。你只能够按照注释的要求添加代码,而不可以对代码有任何的删减或修改。

当你完成必要的填空之后,你可以通过在task1目录下执行make以编译程序,并且在同一个目录下执行make run以测试你的结果。

本任务不计入分数。

任务2:通过共享映射实现两个进程之间的通信

进程间通信(Inter-process communication)有许多种方法,其中一种是共享内存,即两个进程读写同一段内存来实现信息交换。

在这个任务中,给出的程序实现了两个进程将同一个文件映射到自己的地址空间,进程A先运行,每隔1秒读取映射区域,5秒后运行进程B,修改映射区域,从进程A中观察映射区域内容变化。

你需要通过在task2目录下执行make以编译程序,并且在同一个目录下执行make run以观察程序的运行结果。

本任务不计入分数。

任务3:通过匿名映射实现父子进程通信

进程间通信不一定需要写入文件。我们可以使用匿名映射(anonymous mapping)使得多进程运行时访问同一段内存,而不进行任何文件操作。

在这个任务中,你需要实现在当前进程中创建一个子进程,用匿名映射的方法从父进程向子进程传输一条消息,再从子进程向父进程传输一条消息。

下发的程序中给出了一种可行的实现方法,是通过先创建映射再fork的方式实现的。你需要通过先fork再创建映射的方式实现该任务。

当你重新实现了main.c后,你可以通过在task3目录下执行make以编译程序,并且在同一个目录下执行make run以测试你的结果。

本任务的评分方式是通过 Code Review 方法进行评分。

任务4:共享映射读写与传统系统调用读写 (read, write) 读写速度比较

当进行一般的文件读操作时,磁盘空间的文件需要先拷贝到内核态,再从内核态拷贝到用户态,一共是两次拷贝操作;mmap将文件从用磁盘直接映射到用户态内存,只需要一次拷贝。写操作同理。

在这个任务中,4个函数分别测量了使用共享映射读写/系统调用读写64MB文件所需的时间。而对于这个64MB的读写,我们采用了多个不同的<step>,每次读/写<step> bytes,来观察不同读写粒度两种读写方式的性能差异。

你可以通过在task4目录下执行make以编译程序,并且在同一个目录下执行make run-write以测试文件写入部分,执行make run-read以测试文件读取部分。

本任务不计入分数。

注:wsl的文件系统和linux可能有所差异,有条件建议在linux环境下测量。

任务5:内存创建速度比较

mmap和malloc都可以分配内存,他们两个在分配的时候区别是什么?请自行撰写程序,并进行性能对比。

注:wsl的文件系统和linux可能有所差异,有条件建议在linux环境下测量。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published