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

van*_*van 5 multithreading scheduler linux-kernel

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

在Linux中,进程和线程由任务结构描述,并且调度基于任务.我发现了这个:

创建新do_fork()进程时,按以下方式设置当前(父级)和p(子级)进程的计数器字段:

current->counter >>= 1;
p->counter = current->counter;
Run Code Online (Sandbox Code Playgroud)

换句话说,留给父母的蜱数分为两半,一个用于父母,一个用于孩子.这样做是为了防止用户通过使用以下方法获得无限量的CPU时间:父进程创建一个子进程,该进程运行相同的代码然后自行终止; 通过适当地调整创建速率,子进程将在其父进程的量程到期之前获得新的量子.这种编程技巧不起作用,因为内核不会奖励分叉.类似地,用户不能通过在shell中启动大量后台进程或在图形桌面上打开大量窗口来占用处理器的不公平份额.更一般地说,一个进程不能通过分支多个后代来占用资源(除非它有权给自己一个实时策略).

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

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

nin*_*alj 8

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

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

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

在2.6.38命中大多数系统之前,Lennart Poettering展示了如何在此LKML消息的shell脚本上手动执行此操作.

其实,我在那里我运行Eclipse和Maven编译系统,并从预2.6.38到预2.6.38 +梅里的cgroup的结合(我穿上了变化/etc/bashrc 和对我的Eclipse启动脚本)也非常完美.Maven不再占用系统(如果不是CPU负载监视器,你就不会知道maven编译正在进行),Eclipse现在只是自己而不是系统的其余部分(我会满足于用Eclipse).现在我只需要将内核更新为具有更好的脏页回写的内核,并且该系统将是轻而易举的.