Problem set 3: Stdio

In this problem set, you’ll gain experience with caching by writing your own buffered I/O library.

Get the code

Our code is released in the cs61-psets repository. To update it, run

git remote show handout

If this reports an error, run

git remote add handout git://github.com/cs61/cs61-f18-psets.git

Then run

git pull handout master

This will merge our handout code with your previous work. If you have any “conflicts” from problem set 1 or 2, resolve them before continuing further. Run git push to save this merge back to your private repository.

Use an explicit merge. If you copy code by hand, our automated scripts will have trouble analyzing your code, and it’ll be harder for you to incorporate our updates.

You may also create a new cs61-psets repository for this problem set. However, you may need our help to do so. Write cs61-staff@g.harvard.edu and tell us (1) your GitHub username and (2) the name of the repo you want to create. Once the repo is ready, make sure you update the grading server.

Goal

Our simple IO61 library performs I/O on files. You will find the code in the pest directory in the file io61.cc. Our version of IO61 is pretty stupid—it uses character-at-a-time system call I/O and is thus quite slow. Your goal is simple: speed it up using caching.

We also distribute several programs that use IO61. (The grading server has some secret extra programs too!)

You will introduce caching to the io61_file abstraction and use your cache to speed up IO61 operations. We’re giving you tons of freedom to implement the cache as you like. You may even use memory-mapped I/O, prefetching system calls like madvise or posix_fadvise, or multiple threads or processes (although none of these are required). But you may not use another buffered I/O library or caching I/O library.

Your library should:

All your code should fit in io61.cc.

Evaluation

We will evaluate you based on your code’s performance relative to a version of IO61 that uses stdio. That version is provided for you for testing in stdio-io61.cc (and the makefile builds stdio-cat61, stdio-blockcat61, and so forth).

Run make check to see how your current implementation is doing on a battery of tests. This will also print summary statistics at the end. Run make check-TESTNUMBERS (e.g., make check-9 or make check-5-10 or make check-1,2,3) to run selected tests.

We may update the tests during the pset release period. We may also run additional tests during grading. In all instances, correctness counts—that is, a program that runs quickly but incorrectly is worse than a program that runs slowly!

Roadmap

It’s easy in this problem set to design something too complex and get yourself stuck. Avoid that problem by tackling the simple cases first. Here’s a possible roadmap.

Hints

You are allowed to make a couple assumptions.

Building

If you want to compile without optimization (which might help you debug), run make O=0 or edit the GNUmakefile to set O = 0 by default. Your code should work safely with sanitizers turned on; try make SAN=1 check.

Extra credit: Deadlock

We also release a program, pipeexchange61, that demonstrates a problem with conventional blocking I/O. The pipeexchange61 program forks two copies of itself. One copy, the requester, sends requests to the other copy, the responder. The requester can send many requests back-to-back and only then wait for responses (a form of batching). When you run pipeexchange61, the program appears to get stuck! Why? Can you construct an I/O library that unsticks pipeexchange61, without modifying pipeexchange61.cc?

Turnin

You will turn in your code by pushing your git repository to github.com and updating the grading server with your repository.

Don’t forget to fill out README.md and AUTHORS.md.


This pset was originally created for CS61.