See <a href="http://en.wikipedia.org/wiki/Instruction_level_parallelism" rel="nofollow">http://en.wikipedia.org/wiki/Instruction_level_parallelism</a><p>A CPU scheduler (instruction unit) does not schedule threads or processes - instead it schedules instructions (assembly instructions).<p>A thread might block while waiting for IO (disk, net, user input, etc).<p>An instruction might block because it's waiting for the cache to load its data, or it might block because it does not have an available execution unit.<p>A modern CPU has, for example, 4 units that can add, 2 that can multiply, 1 for floating point, another for memory IO, another that does XOR, etc, etc.<p>If one of those is busy you try to find an instruction that can make use of an idle unit.<p>It's often hard to find an instruction because they often depend on each other, so you have to do them in order. With hyperthreading you have double the number of available instructions to choose from (and those two instruction streams are independent of each other).<p>The biggest problem with hyperthreading is the cache. Memory is very slow, so you cache memory locally, with hyperthreeading you have twice as much data to cache, so some data is evicted - this is bad.<p>Some tasks will be slower because of this, but most won't.