All of the course projects for this class will involve measurement of some kind.
This project will help you to get thinking about how to measure and evaluate
a computer system. In addition, it should help you to better understand
the relative costs of different activities in an operating system, ranging
from a simple function call up to executing a complete program.
Below is a list of actions that you will time using the system clock.
Most of these actions are much faster than the
resolution of the system clock, so you will need to perform anywhere from
a few hundred to a few billion events in a loop so that the test
will take a measurable amount of time.
Call gettimeofday before and after the loop and subtract to get the elpased time.
For each test, experiment with the number of actions per loop until the test takes a
a few seconds, then divide by the number of loops to yield the average time.
Of course, it is never enough to measure a value once:
the measurement may be inherently variable, or the measuring equipment may
have its own internal variation. For this work, you should repeat each
test about ten times, and report the average and standard deviation.
To ensure consistency of results, everyone should conduct their experiments on the
machines with author's names on the first floor of Fitzpatrick.
You can either walk down to the lab, or SSH into the machines. (list of names here).
Write each of these simple programs in C. If you are a little rusty on the details of Unix system
calls, you should make good use of the online Unix manuals by invoking, for
example, man 2 open to see all of the options for open().
Carefully write up your results in a few pages.
This assignment is to be completed individually, and is
due at the beginning of class on Thursday, September 2.
- Measure the time to invoke an empty function that does nothing and returns.
- Measure the time to invoke the simple system call SYS_getpid.
Hint: Invoke the getpid system call directly like this:
int pid = syscall(SYS_getpid);
- Measure the time to invoke the library function getpid().
Can you propose a reasonable hypothesis as to why this result is different from SYS_getpid?
- Measure the time to call gethostbyname("www.google.com").
- Measure the time to execute a program like system("/bin/date");.
- Measure the time to creat(), close(), and unlink() a file in /tmp.
- Measure the time to open() a file for writing, write ten megabytes to the
file ONE BYTE at a time with many write()s, and then close() it.
- Repeat the previous experiment, keeping the total amount of data the same,
but writing two bytes, four bytes, and so on. Produce a line graph with "Write Size (bytes)"
on the X axis and "I/O Throughput (MB/s)" on the Y axis. Explain the shape of the graph.
- Learn how to use the program strace, which displays all of the system
calls performed by a program. Apply it to a large program such as a web browser
or a word processor, to obtain a very large sampling of system calls. Create a histogram
of system calls by frequency, from most common to least common.
- List each type of system call used (open, close, mmap, etc) and give a one sentence
description of what the call does.
- What is the most common system call? Is it what you expected? Why does it appear so frequently?