To allow an efficient search through processes of a given type (for instance, all processes in
a runnable state) the kernel creates several lists of processes. Each list consists of pointers to
process descriptors. A list pointer (that is, the field that each process uses to point to the next
process) is embedded right in the process descriptor’s data structure. When you look at
the C-language declaration of the task_struct structure, the descriptors may seem to turn in
on themselves in a complicated recursive manner. However, the concept is no more
complicated than any list, which is a data structure containing a pointer to the next instance of itself.