Multithreading 在linux上有更多线程的进程会比有一个线程的进程有更多的cpu时间吗?
在Linux上有更多线程的进程会比有一个线程的进程有更多的cpu时间吗 在Linux中,进程和线程由任务结构和描述。我还发现: 创建新进程时,Multithreading 在linux上有更多线程的进程会比有一个线程的进程有更多的cpu时间吗?,multithreading,linux-kernel,scheduler,Multithreading,Linux Kernel,Scheduler,在Linux上有更多线程的进程会比有一个线程的进程有更多的cpu时间吗 在Linux中,进程和线程由任务结构和描述。我还发现: 创建新进程时,do_fork()按以下方式设置当前(父)进程和p(子)进程的计数器字段: current->counter >>= 1; p->counter = current->counter; 换句话说,留给父对象的记号数被分成两半,一个用于父对象,一个用于子对象。这样做是为了防止用户通过使用以下方法获得无限的CPU时间:父进程创建
do_fork()
按以下方式设置当前(父)进程和p(子)进程的计数器字段:
current->counter >>= 1;
p->counter = current->counter;
换句话说,留给父对象的记号数被分成两半,一个用于父对象,一个用于子对象。这样做是为了防止用户通过使用以下方法获得无限的CPU时间:父进程创建一个子进程,该子进程运行相同的代码,然后自杀;通过适当调整创建速率,子进程将始终在其父进程的量过期之前获得新的量。这种编程技巧不起作用,因为内核不奖励fork。类似地,用户不能通过在shell中启动大量后台进程或在图形桌面上打开大量窗口来占有处理器的不公平份额。更一般地说,进程不能通过分叉多个子代来占用资源(除非它有特权为自己提供实时策略)
实际上,我在内核源代码中没有发现这一点,但可能是我的错,可能是我看到了错误的内核版本
但是接下来会发生什么呢,每个线程会像单独的进程一样参与调度吗?一个有十个线程的进程会比一个有一个线程的进程得到十倍多的滴答声吗?
从这个意义上讲IO呢?是的,一个线程数更多的进程比它的竞争对手获得更多的CPU时间。一个众所周知的例子是maven编译,maven使用大量CPU密集型线程,占用了系统 但是,当前的linux调度程序不仅考虑任务,还考虑cpu cgroup层次结构中的控制组。所以,CPU时间在控制组之间分配,然后在每个控制组中,CPU时间在任务之间分配 从2.6.38开始,Linux会根据TAK的会话ID自动将TAK放入不同的cpu CGroup中。这意味着,例如:konsole/gnome终端中的各个选项卡都有自己的控制组。因此,现在您的maven编译已经很好地隔离,不再占用系统。请参阅和中的说明 在2.6.38应用于大多数系统之前,Lennart Poettering演示了如何在一个shell脚本上手动执行此操作
实际上,我有一个运行Eclipse和maven编译的系统,从2.6.38之前的版本到2.6.38之前的版本+Lennart的cgroup绑定(我在Eclipse启动程序脚本中加入了
/etc/bashrc
和)非常完美。Maven不再霸占系统(如果没有CPU负载监视器,你不会知道有一个Maven编译正在进行),Eclipse现在只霸占它自己,而不是系统的其余部分(我将用Eclipse来解决这个问题)。现在我只需要将内核更新为一个具有更好脏页写回功能的内核,该系统将是一个轻松的工作环境。感谢您提供如此详细的答案!它是否纠正了cgroups也以这种方式限制组的IO?是的,尽管我不确定I/O调度器支持复杂层次结构的当前状态,请参阅:我尝试验证您关于每个会话id的cpu cgroups的声明。我可以看到,对于我的Ubuntu 12.04笔记本电脑,这不是真的。RedHat 6.3上的情况甚至最糟糕,所有进程都在一个cgroup“/”中。它是特定于发行版的吗?或者我做错了什么?$cat/proc/sys/kernel/sched_autogroup_enabled在正常的cgroup层次结构中不可见,可见于:cat/proc//autogroup
。看见