Each core may have multiple hardware threads, each forming a logical processor, which from the OS' point of view is a separate processor.
The CPU may then switch between hardware threads when one thread is busy waiting for memory, or some other event.