you can't abstract all of this out, for several of these things there are performance implications to how you distribute the work across the cores that you have, and only the scheduler should be involved in that discussion. this is mostly factors around shared resources (cores for hyperthreading, FPU for bulldozer, memory I/O for NUMA, etc)
but the governor can know that if it shuts down some cores it can increase the clock on the remaining cores, and as a result it may choose to shut down some cores even if the remaining cores couldn't _quite_ handle the expected load at the current clock speed.