The first five tasks are created using the simple create_tasks function, which emulates processor-bound tasks (busy 90% of the time, sleep 10% of the time).
The O(1) scheduler was much more scalable and incorporated interactivity metrics with numerous heuristics to determine whether tasks were I/O-bound or processor-bound.
Essentially, any process or thread can be dispatched to run on any processor, except for processors or threads that are bound to run on a specific processor.