Project VI: Disk Scheduling

  • Frequently Asked Questions
  • The goals of this project are:
  • to learn the code mechanics of writing an operating system request scheduler.
  • to demonstrate mastery in solving concurrency problems.
  • to gain further experience in quantitative system evaluation.
  • to gain further experience in writing short technical reports.
  • This project may be completed in either pairs or singletons. Submit your project to only one dropbox, and clearly indicate in your lab report the members of your group. Both members of the group will receive the same grade.

    Project Overview

    In this project, you will build a scheduling system for a hard disk. We will provide you with a virtual disk object that has some inconvenient features, and a simple program that makes requests from that disk. Your scheduler will sit between the two and provide both synchronization and improved performance via scheduling.

    Once your system is working correctly, you will evaluate the performance of several disk scheduling algorithms with a varying number of programs running. 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 creates a disk_scheduler object, multiple threads that run program_run, and then one thread that runs disk_scheduler_run. The run is complete when all of the threads running program_run have completed.

    The disk object in this project has the same interface as the last project, but the implementation has two of the inconvenient features of a real disk drive:

  • The disk can only support a single read or write at a time. If multiple threads attempt to call disk_read or disk_write, the program will "crash" with a loud error message.
  • The disk takes time to respond to each request: each block is about a millisecond apart. So, reading block 0, then block 10, then block 20 will take 20 milliseconds. But, reading block 0, then 20, then 10 will take 30 milliseconds total. (This is slower than a real disk, which makes it easier to observe the effects of scheduling.)
  • If we simply allowed each program to call disk_read and disk_write directly, then chaos would result. Instead, each program will call disk_scheduler_read and disk_scheduler_write, which will work in concert with disk_scheduler_run to address the two problems of the disk.

    As provided, the scheduler doesn't do any work at all, except to pass reads and writes directly on to the disk. It works correctly with one thread:

    % ./disksched 2 10 fifo
    main: starting program threads
    main: starting disk scheduler thread
    read block 9 starting
    read block 9 done
    write block 4 starting
    write block 4 done
    ...
    
    But it crashes with more than one:
    % ./disksched 2 10 fifo
    main: starting program threads
    main: starting disk scheduler thread
    read block 9 starting
    write block 4 starting
    DISK CRASH: two threads tried to use the disk at once!
    Abort
    
    Your job is to implement the disk scheduler. The basic idea is that disk_scheduler_read and disk_scheduler_write should add a request object to an appropriate data structure. disk_scheduler_run should wait for request objects, and then pick the most appropriate one based on the desired scheduling algorithm, satisfy the request, and then wake up the waiting program.

    Essential Requirements

    Your program must be invoked as follows:
    % ./disksched <nthreads> <nblocks> fifo|sstf|scan
    
    nthreads is the number of threads that will access the disk, nblocks is the number of blocks in the virtual disk, and fifo, sstf, and scan indicate the scheduling algorithm to be used, as discussed in class.

    You may only modify the file disk_scheduler.c.

    A complete and correct program will run to completion with only the three lines of output from main. You may certainly add some printfs while testing and debugging your program, but the final version should not have any extraneous output. (Extra output will throw off the timing of your program.)

    You will also turn in a lab report that has the following elements:

  • In your own words, briefly explain the purpose of the experiments and the experimental setup. 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.
  • Measure and graph the execution time of disksched for each scheduling algorithm on disks of 10, 50, and 100 blocks for 1 to 10 threads executing at once. Spend some time to make sure that your graphs are nicely laid out, correctly labelled, and easy to read, as discussed in class. 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.
  • Grading

    Your grade on this assignment will be based on the following:
  • Correct implementation of disk scheduling including both synchronization for safety and selection of the proper request to proceed next. (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 disksched when the user types make. Turn in a lab report named report.doc or report.pdf that clearly indicates the members of your group. Please do not turn in executables or other large files. All files should be copied to your dropbox directory here:
    /afs/nd.edu/coursesp.09/cse/cse30341.01/dropbox/YOURNAME/project6
    
    This assignment is due at 5PM on Thursday, April 30th. 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 TAs 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 TAs to fiddle around with your personal computers. Leave extra time to ensure that your program works correctly when transferred to the Fitzpatrick machines.