Note on interpretation
I had prepared a more formal presentation of this idea complete with provisional citations and sources, but I’ve lost it in the tangle of my computer’s file system (does anyone else have that problem?), so to share the idea and remove the stress of reconstructing what I had written, I’m converting it into a blog post. Filling in the citations is left as an exercise to the reader.
Suppose you have a universal computing machine that multiple people want to use at the same time. Now, one solution is simply to make this person wait until that one’s done and ceded their turn, so that the jobs are run through the machine in batches. This is fine for some applications, but if a bunch of people want to interact with the machine at the same time, it’s clearly unacceptable. Now, since this machine is universal, it can also be programmed to schedule tasks for itself: each person, at an arbitrary time, might issue some command to the machine; since it can only do one thing at a time (or several, but in any case not nearly as many things as it is being ordered to do), it will have to allocate its time between these tasks so that they all get done.
Now, there are two basic approaches to this: either the machine hands control over to one of the jobs, on the understanding that the job will return control when it’s done, or the machine gives and takes control at its own discretion. The word used for the latter arrangement is generally “preempting,” since the machine can always “preempt” whatever process is running; the method where the machine waits for the job to hand back control before beginning the next one is called “non-preempting.” There is one job that the machine is always running: the job that schedules the other jobs. In the non-preempting model, this job doesn’t need to have any more power than the others; in a preempting set-up, this job has to have the unique privilege of being able to force other jobs to stop.
It is typical to wish to interpret this technique as a symbol of human society. One reading is to assign the privileged job the role of the hegemonic class, and the other jobs the role of the subatern classes, whose access to the shared machine resources is entirely at the whim of the privileged class. On this reading, the non-preempting model is a style of communistic organization, where the jobs collaborate peaceably among themselves, and the privileged job “withers away” to the mere administrative task of scheduling; the preempting model is a symbol of the hegemonic class’s domination over shared resources. However, this is not the only possible interpretation: it is also possible to see the privileged job in a preempting system as a revolutionary agent who seizes and redistributes common resources from the job that is monopolizing them; its role is to ensure the equitable and resonable allocation of the machine’s limited resources among the various jobs.
In a computing machine, it is all too easy to accidentally write a routine that will “loop,” that is, which will continue executing forever without ever halting (though proving that you have in fact entered such a loop is quite tricky); even if the job will eventually halt, it may not do it for several centuries or even millenia. In these circumstances, the user of a non-preempting system is left with no option but to power off the machine and turn it back on: they have no means of issuing any sort of command to the machine, since its entire resources are consumed by the “run away” process: even the job that receives commands from the user is blocked. On the other hand, a preempting system can simply “preempt” the non-cooperative process, allowing the rest of the jobs to continue unimpeded. The word that is often used for this act is “kill” — one “kills” a process that is not cooperating. In a preemptive system, it is possible to read this as the hegemonic class’s crushing of dissent, or as a version of the “dictatorship of the proletariat” or “revolutionary terror.” In the non-preempting system, the “run away” process can be assigned the role of the hegemonic class that monopolizes resources, while the other jobs are the subaltern classes, forced to wait until the hegemonic class cedes power, or an external force (the user’s pressing of the power button, for example) topples the regime.
Note that other interpretations are possible besides these two. Indeed, this only heightens the acuteness of the situation, since rather than having a single pleasing interpretation of the technical phenomenon, one is left with several competing readings. I have selected these two because they so clearly oppose one another: each pits the hegemonic class against the subaltern, but they assign the roles to opposite members of the technique. This is probably a general challenge when interpreting techniques: they admit of varying and opposed readings, without clearly favoring one.
Tentatively, I suggest a resolution by cutting the Gordian knot: as is evident from the above discussion, preemptive systems are much more usable and forgiving of user error than non-preemptive ones, and essentially all really-existing computer systems are preempting, including the machine I write this on, the machine this web site is hosted on, and the machine you use to read this. In light of this and the above-noted ambivalence, I suggest that we are free to pick the interpretation that gives reason to the action we are already taking anyway: there is a technical reason to prefer one technique over another, even if it can be read in a way that repulses our intuition. Since, at least in this case, a favorable reading is possible, I suggest that we should prefer that one. Long live the permanent revolution, long live the kernel!