Statement (A) is incorrect.
Kernel-level threads are individually known to the operating system.
If one kernel-level thread blocks, another runnable thread of the same process can still be scheduled.
Statement (B) is correct.
On a uniprocessor, a thread that is spinning prevents the thread holding the lock from running.
Blocking allows the lock holder to be scheduled and release the lock.
Statement (C) is correct.
On a multiprocessor, the lock holder may be executing on another processor.
If the lock will become available sooner than the cost of blocking and performing a context switch, spinning is preferable.
Statement (D) is incorrect.
Yielding avoids spinning for an entire time slice.
The resulting wasted time is related to the cost of context switching, not the full duration of the scheduling time slice.