Project IV: Virtual Memory
The goals of this project are:- To demonstrate mastery of the virtual memory concept.
- To learn the code mechanics of operating system fault handlers.
- To develop skills in quantitative system evaluation.
- To gain further experience in writing short technical reports.
Project Overview
In this project, you will build a simple but fully functional demand paged virtual memory. Although virtual memory is normally implemented in the operating system kernel, it can also be implemented at the user level. This is exactly the technique used by modern virtual machines, so you will be learning an advanced technique without having the headache of writing kernel-level code. The following figure gives an overview of the components:
Once your system is working correctly, you will evaluate the performance of several page replacement algorithms on a selection of simple programs across a range of memory sizes. You will write a short lab report that explains the experiments, describes your results, and draws conclusions about the behavior of each algorithm.
Getting Started
Begin by downloading the source code and building it. Look through main.c and notice that the program simply creates a virtual disk and page table, and then attempts to run one of three "programs" using the virtual memory. Because no mapping has been made between virtual and physical memory, a page fault happens immediately:
% ./virtmem 100 10 rand sort page fault on page #0The program exits because the page fault handler isn't written yet. That is your job!
Try this as a getting started exercise. If you run the program with an equal number of pages and frames, then we don't actually need a disk. Instead, you can simply make page N map directly to frame N, and do nothing else. So, modify the page fault handler to do exactly that:
page_table_set_entry(pt,page,page,PROT_READ|PROT_WRITE);With that page fault handler, all of the example programs will run, cause a number of page faults, but then run to completion. Congratulations, you have written your first fault handler. Of course, when there are fewer frames than pages, then this simple scheme will not do. Instead, we must keep recently used pages in the physical memory, other pages on disk, and update the page table appropriately as they move back and forth.
Example Operation
The virtual page table is very similar to what we have discussed in class, except that it does not have a reference or dirty bit for each page. The system supports a read bit (PROT_READ), a write bit (PROT_WRITE), and an execute bit (PROT_EXEC), which is enough to make it work.
Essential Requirements
Your program must be invoked as follows:
./virtmem npages nframes rand|fifo|custom scan|sort|focusnpages is the number of pages and nframes is the number of frames to create in the system. The third argument is the page replacement algorithm. You must implement rand (random replacement), fifo (first-in-first-out), and custom, an algorithm of your own invention. The final argument specifies which built-in program to run: scan, sort, or focus. Each accesses memory using a slightly different pattern.
You may only modify the file main.c. Your job is to implement three page replacement algorithms. Besides the random and FIFO techniques, you should invent a third algorithm, custom that does a better job than rand or fifo. (Better means results in fewer disk reads and writes.) I strongly encourage you to choose something simple.
A complete and correct program will run each of the sample programs to completion with only the following output:
- The single line of output from scan, sort, or focus.
- A summary of the number of page faults, disk reads, and disk writes over the course of the program.
You will also turn in a lab report that discusses the experimental comparison of the three replacement strategies for the different application scenarios and that has the following elements:
- In your own words, briefly explain the purpose of the experiments and the experimental setup, i.e., what do you expect to see from the comparison of the differnent strategies and how you perform this comparison. Be sure to clearly state on which machine you ran the experiments, and exactly what your command line arguments were, so that we can reproduce your work in case of any confusion.
- Very carefully describe the custom page replacement algorithm that you have invented. Make sure to give enough detail that someone else could reproduce your algorithm, even without your code.
- Measure and graph the number of page faults, disk reads, and disk writes for each program and each page replacement algorithm using 100 pages and a varying number of frames between 2 and 100. Spend some time to make sure that your graphs are nicely laid out, correctly labelled, and easy to read. Do not use colored backgrounds. You may connect data points with straight lines, but not with splines or curves.
- Explain the nature of the results. If one algorithm performs better than another under certain conditions, then point that out, explain the conditions, and explain why it performs better.
Hints
- To see if a given page is written on disk or in memory, you can use page_table_get_entry(page, &frame, &bits). If the given page has non-zero permission bits, then it resides in the indicated frame number. If the permission bits are zero, then it is not in memory, and the frame number is irrelevant.
- Create a frame table that keeps track of the state of each frame. That will make it easy to find a free frame or a frame for replacement.
- Use lrand48() to generate random numbers for your page fault handler (do not use srand or rand!).
Grading
Your grade on this assignment will be based on the following:
- Correct implementation of demand paging with any arbitrary access pattern and amount of virtual and physical memory. (50%)
- A lab report which is clearly written using correct English, contains an appropriate description of your experiments, contains correct results that are clearly presented, and draws appropriate conclusions. (30%)
- Thorough attention to and handling of all possible error conditions, including user error. (10%)
- Good coding style, including clear formatting, sensible variable names, and useful comments. (10%)
Turning In
Turn in all of your source code and a Makefile that builds virtmem when the user types make. Turn in a lab report named report.doc or report.pdf. Please do not turn in executables or other large files. All files should be copied to your dropbox directory here:
/afs/nd.edu/coursesp.16/cse/cse30341.01/dropbox/YOURAFSNAME/project4This assignment is due at 5PM on Thursday, April 21st. Late assignments will not be accepted. Your program will be compiled and graded on the Linux machines in the Fitzpatrick computer lab. Therefore, you should do your development work either sitting in that lab, or using ssh to connect to the machines remotely. The TA will hold office hours in the lab, and will be happy to help you with those machines.
If you insist on doing the homework on your personal computer or laptop, then you are on your own. Please do not ask the TA to fiddle around with your personal computers. Leave extra time to ensure that your program works correctly when transferred to the Fitzpatrick machines.