The generation and handling of signals is a complicated process, involving several transitions between user and kernel space. The kernel has to deal with signals that can be caught, ignored, or held. It also has to determine which thread should receive a signal and manage information passed from the sender to the handler.