如何在Linux中完成CPU分配?线程级别或进程级别?

bho*_*ath 7 c linux performance multithreading linux-kernel

我试图了解CPU如何在具有不同线程的不同进程之间分配.我有两个程序Program1和Program2.

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

情景-1:

terminal-1 :  ./Program1 
terminal-2 :  ./Program2 
Run Code Online (Sandbox Code Playgroud)

当我在一个终端中运行Program1而在另一个终端中运行Program2时,对于Program1,CPU分配为50%,对于Program2,CPU分配为50%.Program1的每个线程都获得10%(Program1累积50%)

这表明,无论进程具有什么线程,每个进程都将获得相同的CPU份额.这表明CPU分配是在进程级别完成的.

pstree显示

??bash???P1???5*[{P1}]
??bash???P2???{P2}
Run Code Online (Sandbox Code Playgroud)

情景-2:

terminal-1 : ./Program1 &  ./Program2
Run Code Online (Sandbox Code Playgroud)

当我在SAME终端中运行Program1和Program2时,对于Program1和Program2的所有线程,CPU分配都是相同的.这意味着Program1的每个线程几乎达到17%(累计Program1达到83%),Program2也达到17%.这表明CPU分配是在线程级别完成的.

pstree显示

 ??bash???P1???5*[{P1}]
 ?      ??P2
Run Code Online (Sandbox Code Playgroud)

我使用的是Ubuntu 12.04.4 LTS,kernel-config-3.11.0-15-generic.我也使用了Ubuntu 14.04.4,kernel-3.16.x并得到了类似的结果.

任何人都可以解释一下LINUX KERNEL的CPU调度程序如何区分SCENARIO-1和SCENARIO-2?

我认为CPU调度程序在分配CPU之前在某处区分SCENARIO.要了解CPU调度程序如何区分SCENARIO-1和SCENARIO-2,我已经下载了Linux内核源代码.
但是,我没有在源代码中找到区分SCENARIO-1和SCENARIO-2的地方. 如果有人向我指出CPU调度程序区分SCENARIO-1和SCENARIO-2的源代码或函数,那将会很棒.

提前致谢.

注意:虽然Ubuntu基于Debian,但令人惊讶的是,在Debian 8(kernel-3.16.0-4-686-pae)中,两个SCENARIO的CPU分配都是在Thread级别完成的,这意味着Program1的每个线程都接近17%(累计为Program1)获得83%),而Program2也获得17%.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

Program2(只有主线程)

#include <stdio.h>
#include <stdlib.h>

int main()
{
 while(1);// Representing CPU Bound Work
}
Run Code Online (Sandbox Code Playgroud)

要通过gcc禁用所有优化,我在编译这两个程序时使用了O0选项.

gcc -O0 program1.c -o p1 -lpthread
gcc -O0 program2.c -o p2 
Run Code Online (Sandbox Code Playgroud)

更新:根据ninjalj的解释,在场景-1中,CPU分配在控制组级别完成,因为我使用两个不同的终端(意味着两个不同的会话),因此2个不同的控制组和每个控制组获得50%的CPU分配.这是由于原因,默认情况下启用自动组.

由于Program2只有一个线程,而Program1有更多的线程,我想在单独的终端(不同的会话)中运行该程序,并为Program1获得更多的CPU分配(如在场景-2中,Program1获得83%的CPU分配,而17 Program2的百分比).是否有可能,Scenario1的CPU分配与Ubuntu中的Scenario-2相同?

同样令我惊讶的是,尽管Ubuntu基于Debian,但仍然是Debian和Ubuntu表现不同.在Debian的情况下,Program1在两个场景中都获得了更多的CPU.

Cra*_*tey 5

Linux内核在调度中区分进程与线程.

线程是恰好碰巧共享大部分内存的进程.除此之外,调度程序也同样对待它们.

您可以拥有50个进程和30个线程.这是80个"东西",内核将安排它们,不管它们是进程还是线程