In the previous discussion of the scheduler code, we have often come across the situation that the scheduler
does not deal directly with processes, but with schedulable entities. This allows for implementing
group scheduling: Processes are placed into different groups, and the scheduler is first fair among these
groups and then fair among all processes in the group. This allows, for instance, granting identical shares
of the available CPU time to each user. Once the scheduler has decided how much time each user gets,
the determined interval is then distributed between the users’ processes in a fair manner. This naturally
implies that the more processes a user runs, the less CPU share each process will get. The amount of time
for the user in total is not influenced by the number of processes, though.
Grouping tasks between users is not the only possibility. The kernel also offers control groups, which
allow — via the special filesystem cgroups — creating arbitrary collections of tasks, which may even be
sorted into multiple hierarchies