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

问题描述 投票:5回答:1

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

在Linux中,进程和线程由任务结构和scheduling is based on tasks描述。我也找到了this

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

current->counter >>= 1;
p->counter = current->counter;

换句话说,留给父母的壁虱数被分成两半,一个为父母,一个为孩子。这样做是为了防止用户使用以下方法获得无限数量的CPU时间:父进程创建运行相同代码的子进程,然后杀死自己;通过适当地调整创建速率,子进程将始终在其父级的量子过期之前获得一个新的量子。由于内核不奖励分叉,因此此编程技巧不起作用。同样,用户不能通过在外壳中启动许多后台进程或通过在图形桌面上打开许多窗口来浪费处理器的不公平份额。一般而言,进程无法通过派生多个后代来占用资源(除非它具有向其提供实时策略的特权)。

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

但是以后会发生什么,每个线程都会像单独的进程一样参与调度吗?具有十个线程的进程的滴答声是否会比具有一个线程的进程多十倍?从这个意义上讲,IO呢?

multithreading linux-kernel scheduler
1个回答
8
投票

是的,具有更多线程的进程将比其竞争者获得更多的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.338之前的版本更改为2.6.338之前的版本+ Lennart的cgroup绑定(我在Eclipse上放置了/etc/bashrc and启动脚本)非常完美。 Maven不再占用系统(如果不是用于CPU负载监视器,您将不知道是否正在进行maven编译),而Eclipse现在只占用自身,而不是系统的其余部分(我会解决的) Eclipse)。现在,我只需要将内核更新为具有更好的脏页写回功能的内核,该系统将很容易工作。

© www.soinside.com 2019 - 2024. All rights reserved.