首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux中进行CPU分配?线程级别还是进程级别?

如何在Linux中进行CPU分配?线程级别还是进程级别?
EN

Stack Overflow用户
提问于 2016-02-24 23:41:54
回答 1查看 1.2K关注 0票数 7

我试图了解CPU是如何分布在不同进程之间的,具有不同的线程号。我有两个程序Program1和Program2。

Program1有5个线程,而Program2只有主线程。

设想-1:

代码语言:javascript
复制
terminal-1 :  ./Program1 
terminal-2 :  ./Program2 

当我在一个终端运行Program1,在另一个终端运行Program2时,Program1和Program2分别完成50%和50%的CPU分配。Program1的每个线程得到10% (Program1累计为50% )

这表明,无论进程有多少线程,每个进程都将获得相同的CPU份额。--这表明CPU分配是在进程级完成的。

晚会表演

代码语言:javascript
复制
├─bash───P1───5*[{P1}]
├─bash───P2───{P2}

设想-2:

代码语言:javascript
复制
terminal-1 : ./Program1 &  ./Program2

当我在同一个终端中同时运行Program1和Program2时,Program1和Program2的所有线程的CPU分配是相等的。这意味着Program1的每个线程都得到了近17% (累计Program1为83%),Program2也获得了17%。--这表明CPU分配是在线程级别完成的。

晚会表演

代码语言:javascript
复制
 ├─bash─┬─P1───5*[{P1}]
 │      └─P2

我正在使用Ubuntu12.04.4LTS,内核-config-3.11.0-15-泛型。我还使用了Ubuntu14.04.4内核-3.16.x,并得到了类似的结果。

谁能解释一下LINUX内核的CPU调度程序如何区分场景1和场景2?

我认为CPU调度程序在分配CPU之前将这两种情况区分开来。为了了解CPU调度程序如何区分场景-1和场景-2,我下载了Linux内核源代码。

然而,我还没有在源代码中找到区分场景-1和场景-2的源代码。如果有人向我指出CPU调度程序区分场景-1和场景-2的源代码或函数,那么将是很棒的。

提前谢谢。

注意:尽管Ubuntu是基于Debian的,但令人惊讶的是,在Debian 8(内核-3.16.0-4-686-Pae)中,这两种场景的CPU分配都是在线程级别完成的,意味着Program1的每个线程得到了将近17% (累计Program1是83%),Program2也得到了17%。

下面是代码:Program1(有5个线程)

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

// Let us create a global variable to change it in threads
int g = 0;

// The function to be executed by all threads
void *myThreadFun(void *vargp)
{

    // Store the value argument passed to this thread
    int myid = (int)vargp;

    // Let us create a static variable to observe its changes
    static int s = 0;

    // Change static and global variables
    ++s; ++g;

    // Print the argument, static and global variables
    printf("Thread ID: %d, Static: %d, Global: %d\n", myid, ++s, ++g);

while(1); // Representing CPU Bound Work

}

int main()
{
    int i;
    pthread_t tid[5];

    // Let us create three threads
    for (i = 0; i < 5; i++)
        pthread_create(&tid[i], NULL, myThreadFun, (void *)i);

    for (i = 0; i < 5; i++)
     pthread_join(tid[i],NULL);

    return 0;
}

Program2 (只有主线程)

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main()
{
 while(1);// Representing CPU Bound Work
}

为了禁用gcc的所有优化,我在编译这两个程序时使用了O0选项。

代码语言:javascript
复制
gcc -O0 program1.c -o p1 -lpthread
gcc -O0 program2.c -o p2 

更新:根据忍者的解释,在场景-1中,CPU分配是在控制组级别进行的,因为我使用的是两个不同的终端(意味着两个不同的会话),因此两个不同的控制组和每个控制组获得了50%的CPU分配。由于原因,默认启用自动组。

由于Program2只有一个线程,而Program1有更多的线程,所以我希望在单独的终端(不同的会话)中运行这两个程序,并为Program1获得更多的CPU分配(如场景2所示,Program1获得83%的CPU分配,而不是Program2的17% )。Scenario1的CPU分配是否可能与Ubuntu中的场景2相同?

虽然Ubuntu是基于Debian的,但Debian和Ubuntu的行为方式不同,这也让我感到惊讶。在Debian的情况下,Program1在这两种情况下都得到了更多的CPU。

EN

回答 1

Stack Overflow用户

发布于 2016-02-24 23:52:05

linux内核在调度中不区分进程和线程。

线程是刚好共享大部分内存的进程。除此之外,调度程序对它们的处理也是平等的。

您可以有50个进程和30个线程。这是80件“事情”,内核会调度它们,而不管它们是进程还是线程

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35615479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档