Here is how a P() operation can be implemented.
Now, here's how a V() operation can be implemented.
As you can see, only in the implementation of the P() operation, a process can get blocked.
V() doesn't block processes, but rather generates a wakeup signal that unblocks the processes blocked by the P() operation. (Whether or not these newly unblocked processes immediately start running is dependent on scheduling)
PS: Please note that P() and V() are atomic operations, and we use techniques like compare.and.swap() or spinlock to enforce atomicity (We don't take hardware support, as semaphores are purely a software solution)
Switching the order of V() operations can never result in deadlock (because processes won't be blocked). It might prioritize one process over another or cause timing errors if used in the "wrong" order, though.
Hence, Statement II can't be correct. (In fact, it won't be correct in any context)
Switching carefully selected order of P() operations might result in a deadlock.
Statement I can cause a deadlock. I'll prove how.
Put N = 1.
Now, let the producer run once.
Now let the producer and consumer run in an interleaved manner. They both will get blocked. So, deadlock.
Option A