Summary
We looked at various ways of realizing synchronization among concurrent processes.
Synchronization at the kernel level is usually solved using hardware mechanisms such as interrupt priority levels, basic hardware lock, using non-preemptive kernel (older BSDs), using special signals.