If the semaphore has a value of 0, the down operation on it is blocked until someone releases the resource and increases the semaphore.
A non-blocking semaphore is not blocked during the down operation if the resource is unavailable but gives an error. This can be useful if the program needs this resource immediately or without pausing execution, and if the resource is unavailable, the program logic can rather do something else.
source share