spooling
Imagine an office with one printer shared by twenty people. If everyone walked up and fed pages whenever they liked, the output would interleave into nonsense. Instead, each person drops their job in an in-tray, and the printer works through the tray one complete job at a time. Spooling is that in-tray: the OS collects whole I/O jobs in a queue (usually on disk) and feeds them to a device that can only serve one at a time, in order, so concurrent users do not collide.
Concretely, spooling is buffering plus queueing for a non-shareable device. When you print, your data is not sent straight to the printer; it is written to a spool file on disk and an entry is placed in the print queue. A background process — the spooler or print daemon — takes jobs from the queue one by one and sends each, complete and uninterrupted, to the printer. Because the data sits on disk, your program can finish and return immediately even though the printer is slow and busy; the slow device and the fast program are fully decoupled. The same pattern serves any device that must process one request at a time without mixing: print queues are the textbook case, and batch-job and email out-queues work the same way.
Why it matters: spooling was historically a giant leap in efficiency — it let many users share one printer and let programs stop waiting on slow peripherals. It differs from plain buffering in two ways: it queues entire independent jobs (not just bytes of one transfer), and it exists specifically to multiplex a device that cannot be shared moment-to-moment. The caveat is the obvious one: a spooled job is queued, not done — your document might print minutes later, and if it sits behind a stuck job or the spooler crashes, it may never print at all.
Three people print at once. The OS writes three spool files to disk and queues them. The printer prints job 1 to completion, then job 2, then job 3 — never interleaved — while all three programs returned instantly, long before printing finished.
Whole jobs are queued on disk and fed one at a time to a one-at-a-time device.
Spooling queues whole independent jobs for a device that cannot be shared moment-to-moment; ordinary buffering just smooths the bytes of a single transfer. A spooled job has been accepted, not yet performed.