多线程 – 在linux上使用更多线程的进程是否会比使用一个线程的进程有更多的CPU时间?

Linux上有更多线程的进程比具有一个线程的进程有更多的CPU时间吗?

在Linux中,进程和线程由任务结构和scheduling is based on tasks描述.我还发现了this

When a new process is created, do_fork() sets the counter field of both current (the parent) and p (the child) processes in the following way:

06000

In other words, the number of ticks left to the parent is split in two halves, one for the parent and one for the child. This is done to prevent users from getting an unlimited amount of CPU time by using the following method: the parent process creates a child process that runs the same code and then kills itself; by properly adjusting the creation rate, the child process would always get a fresh quantum before the quantum of its parent expires. This programming trick does not work since the kernel does not reward forks. Similarly, a user cannot hog an unfair share of the processor by starting lots of background processes in a shell or by opening a lot of windows on a graphical desktop. More generally speaking, a process cannot hog resources (unless it has privileges to give itself a real-time policy) by forking multiple descendants.

实际上我没有在内核中找到它,但也许这是我的错,也许我看到错误的内核版本.

但是后来会发生什么,每个线程都会像单独的进程一样参与调度吗?十个线程的进程是否会比一个进程的进程多十倍?
在这个意义上IO怎么样?

最佳答案
是的,具有更多线程的进程将比竞争对手获得更多的CPU时间.一个众所周知的案例是maven编译,maven使用大量CPU密集型线程,占用系统.

但是,当前的linux调度程序不仅考虑任务,还考虑了cpu cgroup层次结构中的控制组.因此,CPU时间在控制组之间划分,然后在每个控制组中,CPU时间在任务之间划分.

从2.6.38开始,Linux会根据会话ID自动将taks放入不同的cpu cgroup中.这意味着,例如:konsole / gnome-terminal中的单独选项卡获得自己的控制组.所以现在你的maven编译很好地隔离了,不再占用系统了.请参阅kernelnewbieslwn.net的说明.

在2.6.38打到大多数系统之前,Lennart Poettering在this LKML message上展示了如何在shell脚本上手动完成.

我实际上有一个系统,我运行Eclipse和maven编译,从2.6.38之前到2.6.38之前的Lennart的cgroup绑定(我放在/ etc / bashrc和我的Eclipse启动器脚本上)的变化是完美的. Maven不再占用系统(如果不是CPU负载监视器,你不会知道有maven编译正在进行),Eclipse现在只是自己而不是系统的其余部分(我会满足于用Eclipse).现在我只需要将内核更新为具有更好的脏页回写的内核,并且该系统将是一件轻而易举的事情.

转载注明原文:多线程 – 在linux上使用更多线程的进程是否会比使用一个线程的进程有更多的CPU时间? - 代码日志