Things are a lot more complex than they were in the days of one cpu instruction per one clock cycle.
There's now a pipeline for each instruction that consists of a number of steps. I've heard as many as 41, though that was a while ago and I have no idea what current cpu pipelines look like. I do know that if the pipeline is long enough, you can start a new instruction down the pipeline before the last instruction has finished, sometimes in the same clock cycle, so that your single core is effectively doing two things at once.
There's a trick here, though. You can't just use this to speed up the rate at which your processor chews through instructions from a specific program. There's a correctness issue involved: the next instruction might depend on the as-yet-undetermined result of the prior instruction. To take advantage of the long pipeline safely, the chip will present two separate processor cores to the operating system scheduler, and alternate instructions sent to each core so that two instructions to the same "core" are never in the pipeline at the same time. This way it we can be sure that any instructions executed simultaneously will not interfere with each other. This is called hyperthreading.
It's worth noting here that while hyperthreading can significantly increase the amount of work you get out of your cpu, it's nowhere near as good as having that many physical cores. Depending on your work-load, it might means as little at 15% improvement or as much as 40% improvement. In some circumstances, you may even want to disable the feature so that the remaining cores have full exclusive access to the L1/L2 cache for that core (this is sometimes done with dedicated database servers).
When your chip advertises itself as having 2 cores with 4 threads, that means it's a dual core processor that supports hyperthreading.
@Mokubai core-parking link does not work. – Biswapriyo – 2018-04-01T19:58:52.710
Thanks for the explanation. So, can we say here that a thread is to a core what a core is to a processor? – seriousdev – 2011-08-30T16:37:17.810
2In a way, yes. The OS sees the processor, knows how many cores are on that processor and in turn how many threads each core supports, from that the CPU usage you are seeing is now "per-thread" rather than "per core". It's not quite that simple (as each thread does actually appear to a non-hyperthreading aware OS as a fully fledged CPU core) but that is the general idea of it. – Mokubai – 2011-08-30T16:46:18.470