>You describe a variation of what I was used to (and reasonably intimate with) on the mainframe IBM OSes. There a 'wait' had nothing "cooperative" about it - the operating system got control and preempted that task and dispatched another. In other words it was totally controlled by the OS and there was (virtually) nothing that a task could do to prevent this.
I remember the intricate dynamic priority scheme VAX VMS had - with sixteen levels of priority, where your task gained or lost priority, depending on its state (waiting for queued IO, waiting for hardware, waiting longer, being owned by a higher priority user, being spawned by OS itself or not - everything counted as a plus or minus), and you had to have vast privileges to assign your task higher priority.