在Linux上拥有更多线程的进程比具有一个线程的进程拥有更多的cpu时间吗?
在Linux中,进程和线程由任务结构和scheduling is based on tasks描述。我还找到了this:
创建新进程时,
do_fork()
以下列方式设置当前(父级)和p(子级)进程的计数器字段:current->counter >>= 1; p->counter = current->counter;
换句话说,留给父母的蜱数分成两半,一个用于父母,一个用于孩子。这样做是为了防止用户通过使用以下方法获得无限量的CPU时间:父进程创建一个子进程,该进程运行相同的代码然后自行终止;通过适当调整创建速率,子进程总是在其父进程到期之前获得新的量子。这种编程技巧不起作用,因为内核不会奖励分叉。类似地,用户不能通过在shell中启动大量后台进程或在图形桌面上打开大量窗口来占用处理器的不公平份额。更一般地说,一个进程不能通过分支多个后代来占用资源(除非它有权给自己一个实时策略)。
实际上我没有在内核源代码中找到它,但也许这是我的错,也许我看到了错误的内核版本。
但是后来会发生什么,每个线程都会像单独的进程那样参与调度吗?十个线程的进程是否比一个进程的进程多十倍? 在这个意义上IO怎么样?
答案 0 :(得分: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展示了如何在this LKML message的shell脚本上手动执行此操作。
我实际上有一个系统,我运行Eclipse和maven编译,以及从2.6.38之前到2.6.38之前的更改+ Lennart的cgroup绑定(我放在/etc/bashrc
和< / strong>在我的Eclipse启动器脚本上)非常完美。 Maven不再占用系统(如果不是CPU负载监视器,你就不会知道maven编译正在进行),Eclipse现在只是自己而不是系统的其余部分(我会满足于用Eclipse)。现在我只需要将内核更新为具有更好的脏页回写的内核,并且该系统将是轻而易举的。