TAOCP 1.4.4 Exercise 11

We are asked to repeat exercise 9 under the assumption that there is only _one_ buffer.

Section 1.4.4: Input and Output

Exercise 11. [21] Repeat exercise 9, except with just one buffer.

Verified: no
Solve time: 46s


Solution

We are asked to repeat exercise 9 under the assumption that there is only one buffer. Exercise 9 involves an output program whose original schedule with three buffers was as follows: assignments (A), computations (R), and output operations (OUT) with buffer-specific assignments. The output device operates at speed $7500u$ per block, and the computation times between assignments are given in units $u$. We now construct the time-action chart under the constraint of a single buffer.

With only one buffer, the sequence of actions is constrained: the program cannot assign a new buffer while the current buffer is still in use by the output unit. Consequently, the CPU must wait whenever it tries to assign the buffer while the output unit has not finished writing it. This introduces additional idle times for the CPU. Let us count step by step.

Step 1: Initialize

At time $0$, the CPU attempts to assign the buffer (BUF1) for output:

$$ 0: \text{ASSIGN(BUF1)} $$

Immediately after assignment, the output can begin:

$$ 0: \text{OUT BUF1} $$

No other buffer exists, so the next assignment cannot occur until BUF1 has been released by the output unit.

Step 2: Compute and wait

The first computation takes $1000u$:

$$ 0-1000: \text{COMPUTE 1000u} $$

At time $1000$, the CPU attempts the next assignment, but BUF1 is still in use (OUT started at 0, speed $7500u$ per block). The output unit requires $1$ block time:

$$ \text{Time to output BUF1} = \frac{\text{block size}}{\text{output rate}} = \frac{1000}{7500} \approx 133.33u $$

However, in Knuth's convention, block sizes are integer multiples of $u$; from the previous example, the first output completes at $38500u$ in the three-buffer case. Because output began immediately, the CPU cannot proceed with assignment until the buffer is free. Hence, the CPU is idle from $1000$ until the output completes.

Step 3: Assign buffer again

The CPU resumes at the time the output completes:

$$ t_1 = 1000 + \text{time until BUF1 released} = 38500u $$

At $38500u$, the CPU assigns BUF1:

$$ 38500: \text{ASSIGN(BUF1)} $$

Then output begins again:

$$ 38500: \text{OUT BUF1} $$

Next computation requires $1000u$, starting at $38500$:

$$ 38500-39500: \text{COMPUTE 1000u} $$

After this, the CPU would attempt another assignment, but the single buffer is still busy with output. Therefore, CPU idle time resumes.

Step 4: Pattern observation

With only one buffer, every assignment must wait until the previous output finishes. Consequently:

  1. Each output begins immediately after assignment.
  2. CPU is idle whenever it tries to assign a buffer already in use.
  3. The computation cannot overlap with output unless the computation completes before the output finishes; in this case, the output always takes longer than the inter-computation interval. Therefore, all computation blocks that follow an assignment are shorter than the output block and do not prevent buffer contention.

Thus, every assignment is delayed until the buffer becomes free. For the given computation-output schedule, the total time is dominated by the output times.

Step 5: Compute total time

Let $T_\text{out}$ be the total time required for all outputs. From exercise 9, the total output time for three buffers was $81500u$. With only one buffer, the outputs must be serialized. There are 11 output operations (as seen in the table of exercise 9), each requiring its block time. Using the previous table, each block requires approximately $7500u$ per block (or the total as in the previous example). Therefore, the total time will be:

$$ T_\text{total, 1 buffer} = 81500u + \text{additional CPU idle due to buffer wait} $$

Since the CPU must wait for each output to complete before assigning again, the additional idle time equals all the computation intervals that would otherwise overlap with output. In exercise 9, these intervals totaled $20500u$. With one buffer, the CPU cannot execute these computations in parallel with output, so all of them become additional idle. Hence, the total CPU idle time is:

$$ \text{CPU idle} = 20500u + \text{inter-assignment waits} $$

From step 4, the inter-assignment waits equal the output durations that exceed computation time. Since output blocks are longer than computation intervals, each computation interval becomes idle. Therefore, total CPU idle time doubles:

$$ \text{CPU idle} \approx 20500u \times 2 = 41000u $$

Hence, the total elapsed time increases roughly by $20500u$ compared to the three-buffer case:

$$ T_\text{total} \approx 81500u + 20500u = 102000u $$

Step 6: Time-action chart

Time Action Time Action
0 ASSIGN(BUF1), OUT BUF1 38500 ASSIGN(BUF1), OUT BUF1
1000 CPU idle 40000 CPU idle
2000 CPU idle 46000 CPU idle
3000 CPU idle 47000 CPU idle
4000 CPU idle 52000 CPU idle
5000 CPU idle 54500 CPU idle
6000 CPU idle 59000 CPU idle
8500 CPU idle 64000 CPU idle
9500 CPU idle 65000 CPU idle
10500 CPU idle 66000 CPU idle
16000 CPU idle 66500 CPU idle
23000 CPU idle 68000 CPU idle
23500 CPU idle 69000 CPU idle
28000 CPU idle 74000 CPU idle
31000 CPU idle 81500 CPU idle
35000 CPU idle 102000 Program ends

This chart emphasizes that nearly all CPU computation time is blocked waiting for the single buffer to become free. The output unit remains continuously active except for the negligible gaps between outputs. The total elapsed time is therefore increased substantially compared to the three-buffer schedule.

Step 7: Conclusion

With only one buffer, the CPU cannot overlap computation with output. Each attempt to assign the buffer must wait until the previous output completes. Consequently:

  1. CPU idle time increases from $20500u$ to approximately $41000u$.
  2. Output unit idle time remains minimal.
  3. Total elapsed time increases from $81500u$ to approximately $102000u$.

This completes the solution.

$$ \boxed{T_\text{total} \approx 102000u, \quad \text{CPU idle} \approx 41000u, \quad \text{Output idle minimal}} $$