Operating Systems


Chapter 5: Input/Output

5.1: Principles of I/O Hardware

5.1.1: I/O Devices

5.1.2: Device Controllers

These are the ``real devices'' as far as the OS is concerned. That is the OS code is written with the controller spec in hand not with the device spec.

The figure in the book is so oversimplified as to be borderline false. The following picture is closer to the truth (but really there are several I/O buses of different speeds).

Using a controller

Think of a disk controller and a read request. The goal is to copy data from the disk to some portion of the central memory. How do we do this?

Homework: 2

5.1.3: Direct Memory Access (DMA)

Homework: 5


================ Start Lecture #12 ================

Note: I improved the presentation of disk controllers given last time (unfortunately, this was very easy to do). In particular, I suggest you read the new small section entitled ``Using a controller''. Both the giant page and the page for lecture-11 now include this new section.

5.2: Principles of I/O Software

As with any large software system, good design and layering is important.

5.2.1: Goals of the I/O Software

Device independence

We want to have most of the OS, unaware of the characteristics of the specific devices attached to the system. Indeed we also want the OS to be largely unaware of the CPU type itself.

Due to this device independence, programs are written to read and write generic devices and then at run time specific devices are assigned. Writing to a disk has differences from writing to a terminal, but Unix cp and DOS copy do not see these differences. Indeed, most of the OS, including the file system code, is unaware of whether the device is a floppy or hard disk.

Uniform naming

Recall that we discussed the value of the name space implemented by file systems. There is no dependence between the name of the file and the device on which it is stored. So a file called IAmStoredOnAHardDisk might well be stored on a floppy disk.

Error handling

There are several aspects to error handling including: detection, correction (if possible) and reporting.
  1. Detection should be done as close to where the error occurred as possible before more damage is done (fault containment). This is not trivial.

  2. Correction is sometimes easy, for example ECC memory does this automatically (but the OS wants to know about the error so that it can schedule replacement of the faulty chips before unrecoverable double errors occur).

    Other easy cases include successful retries for failed ethernet transmissions. In this example, while logging is appropriate, it is quite reasonable for no action to be taken.

  3. Error reporting tends to be awful. The trouble is that the error occurs at a low level but by the time it is reported the context is lost. Unix/Linux in particular is horrible in this area.

Creating the illusion of synchronous I/O

Sharable vs dedicated devices

For devices like printers and tape drives, only one user at a time is permitted. These are called serially reusable devices, and are studied next chapter. Devices like disks and Ethernet ports can be shared by processes running concurrently.

Layering

Layers of abstraction as usual prove to be effective. Most systems are believed to use the following layers (but for many systems, the OS code is not available for inspection).

  1. User level I/O routines.
  2. Device independent I/O software.
  3. Device drivers.
  4. Interrupt handlers.

We give a bottom up explanation.

5.2.2: Interrupt Handlers

We discussed an interrupt handler before when studying page faults. Then it was called ``assembly language code''.

In the present case, we have a process blocked on I/O and the I/O event has just completed. So the goal is to make the process ready. Possible methods are.

Once the process is ready, it is up to the scheduler to decide when it should run.

5.2.3: Device Drivers

The portion of the OS that ``knows'' the characteristics of the controller.

The driver has two ``parts'' corresponding to its two access points. Recall the following figure from the beginning of the course.

  1. Accessed by the main line OS via the envelope in response to an I/O system call. The portion of the driver accessed in this way is sometimes call the ``top'' part.
  2. Accessed by the interrupt handler when the I/O completes (this completion is signaled by an interrupt). The portion of the driver accessed in this way is sometimes call the ``bottom'' part.

Tanenbaum describes the actions of the driver assuming it is implemented as a process (which he recommends). I give both that view point and the self-service paradigm in which the driver is invoked by the OS acting in behalf of a user process (more precisely the process shifts into kernel mode).

Driver in a self-service paradigm

  1. The user (A) issues an I/O system call.

  2. The main line, machine independent, OS prepares a generic request for the driver and calls (the top part of) the driver.
    1. If the driver was idle (i.e., the controller was idle), the driver writes device registers on the controller ending with a command for the controller to begin the actual I/O.
    2. If the controller was busy (doing work the driver gave it previously), the driver simply queues the current request (the driver dequeues this request below).

  3. The driver jumps to the scheduler indicating that the current process should be blocked.

  4. The scheduler blocks A and runs (say) B.

  5. B starts running.

  6. An interrupt arrives (i.e., an I/O has been completed).

  7. The interrupt handler invokes (the bottom part of) the driver.
    1. The driver informs the main line perhaps passing data and surely passing status (error, OK).
    2. The top part is called to start another I/O if the queue is nonempty. We know the controller is free. Why?
      Answer: We just received an interrupt saying so.

  8. The driver jumps to the scheduler indicating that process A should be made ready.

  9. The scheduler picks a ready process to run. Assume it picks A.

  10. A resumes in the driver, which returns to the main line, which returns to the user code.

    Driver as a process (Tanenbaum) (less detailed than above)

    5.2.4: Device-Independent I/O Software

    The device-independent code does most of the functionality, but not necessarily most of the code since there can be many drivers all doing essentially the same thing in slightly different ways due to slightly different controllers.

    5.2.5: User-Space Software

    A good deal of I/O code is actually executed in user space. Some is in library routines linked into user programs and some is in daemon processes.

    Homework: 6, 7, 8.

    5.3: Disks

    The ideal storage device is

    1. Fast
    2. Big (in capacity)
    3. Cheap
    4. Impossible

    Disks are big and cheap, but slow.

    5.3.1: Disk Hardware

    Show a real disk opened up and illustrate the components

    Overlapping I/O operations is important. Many controllers can do overlapped seeks, i.e. issue a seek to one disk while another is already seeking.

    Despite what Tanenbaum says, modern disks cheat and do not have the same number of sectors on outer cylinders as on inner one. Often the controller ``cover for them'' and protect the lie.

    Again contrary to Tanenbaum, it is not true that when one head is reading from cylinder C, all the heads can read from cylinder C with no penalty.

    Choice of block size

    5.3.2: Disk Arm Scheduling Algorithms

    These algorithms are relevant only if there are several I/O requests pending. For many PCs this is not the case. For most commercial applications, I/O is crucial.

    1. FCFS (First Come First Served): Simple but has long delays.

    2. Pick: Same as FCFS but pick up requests for cylinders that are passed on the way to the next FCFS request.

    3. SSTF (Shortest Seek Time First): Greedy algorithm. Can starve requests for outer cylinders and almost always favors middle requests.

    4. Scan (Look, Elevator): The method used by an old fashioned jukebox (remember ``Happy Days'') and by elevators. The disk arm proceeds in one direction picking up all requests until there are no more requests in this direction at which point it goes back the other direction. This favors requests in the middle, but can't starve any requests.

    5. C-Scan (C-look, Circular Scan/Look): Similar to Scan but only service requests when moving in one direction. When going in the other direction, go directly to the furthest away request. This doesn't favor any spot on the disk. Indeed, it treats the cylinders as though they were a clock, i.e. after the highest numbered cylinder comes cylinder 0.

    6. N-step Scan: This is what the natural implementation of Scan gives.
      • While the disk is servicing a Scan direction, the controller gathers up new requests and sorts them.
      • At the end of the current sweep, the new list becomes the next sweep.

    Minimizing Rotational Latency

    Use Scan, which is the same as C-Scan. Why?
    Because the disk only rotates in one direction.

    Homework: 9, 10.


    ================ Start Lecture #13 ================

    RAID (Redundant Array of Inexpensive Disks)

    5.3.3: Error Handling

    Disks error rates have dropped in recent years. Moreover, bad block forwarding is done by the controller (or disk electronic) so this topic is no longer as important for OS.

    5.3.4: Track Caching

    Often the disk/controller caches a track, since the seek penalty has already been paid. In fact modern disks have megabyte caches that hold recently read blocks. Since modern disks cheat and don't have the same number of blocks on each track, it is better for the disk electronics (and not the OS or controller) to do the caching since it is the only part of the system to know the true geometry.

    5.3.5: Ram Disks

    5.4: Clocks

    Also called timers.

    5.4.1: Clock Hardware


    5.4.2: Clock Software

    1. TOD: Bump a counter each tick (clock interupt). If counter is only 32 bits must worry about overflow so keep two counters: low order and high order.

    2. Time quantum for RR: Decrement a counter at each tick. The quantum expires when counter is zero. Load this counter when the scheduler runs a process.

    3. Accounting: At each tick, bump a counter in the process table entry for the currently running process.

    4. Alarm system call and system alarms:
      • Users can request an alarm at some future time and the system also needs to do things specific future times (e.g. turn off floppy motor).
      • The conceptually simplest solution is to have one timer for each event. Instead, we simulate many timers with just one.
      • The data structure on the right works well.
      • The time in each list entry is the time after the preceding entry that this entry's alarm is to ring. For example, if the time is zero, this event occurs at the same time as the previous event. The other entry is a pointer to the action to perform.
      • At each tick, decrement next-signal.
      • When next-signal goes to zero, process the first entry on the list and any others following immediately after with a time of zero (which means they are to be simultaneous with this alarm). Then set next-signal to the value in the next alarm.

    5. Profiling
      • Want a histogram giving how much time was spent in each 1KB (say) block of code.
      • At each tick check the PC and bump the appropriate counter.
      • At the end of the run can assign the 1K blocks to software modules.
      • If use fine granularity (say 10B instead of 1KB) get higher accuracy but more memory overhead.

    Homework: 12

    5.5: Terminals

    5.5.1: Terminal Hardware

    Quite dated. It is true that modern systems can communicate to a hardwired ascii terminal, but most don't. Serial ports are used, but they are normally connected to modems and then some protocol (SLIP, PPP) is used not just a stream of ascii characters.

    5.5.2: Memory-Mapped Terminals

    Keyboards

    Tanenbaum description of keyboards is correct.

    5.5.3: Input Software

    5.5.4: Output Software

    Again too dated and the truth is too complicated to deal with in a few minutes.

    Homework: 16.

    Allan Gottlieb