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

我想了解CPU是如何分配不同的进程之间不同的线程。我有两个程序Program1和Program2。

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

情景-1:

terminal-1 : ./Program1 terminal-2 : ./Program2 

当我在一个terminal上运行Program1并在另一个terminal上运行Program2时,Program1的CPU分配为50%,而Program2的CPU分配为50%。 Program1的每个线程获得10%(对于Program1,累积50%)

这表明,不pipe进程有没有线程,每个进程将获得CPU的平等份额。 这显示CPU分配在进程级完成。

pstree显示

 ├─bash───P1───5*[{P1}] ├─bash───P2───{P2} 

情景-2:

 terminal-1 : ./Program1 & ./Program2 

当我在SAMEterminal中同时运行Program1和Program2时,CPU的分配完全等于Program1和Program2的所有线程。 这意味着Program1的每个线程几乎获得17%(累计Program1获得83%),Program2也获得17%。 这显示CPU分配在线程级完成。

pstree显示

  ├─bash─┬─P1───5*[{P1}] │ └─P2 

我正在使用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内核源代码。
不过,我并没有在源代码中find区分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%正在增长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; } 

程序2(只有主线程)

 #include <stdio.h> #include <stdlib.h> int main() { while(1);// Representing CPU Bound Work } 

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

 gcc -O0 program1.c -o p1 -lpthread gcc -O0 program2.c -o p2 

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

由于Program2只有一个线程和Program1有更多的线程,我想运行在不同的terminal(不同的会话)两个程序,并获得更多的CPU分配给Program1(如scheme2,程序1获得83%的CPU分配比17 Program2的%)。 是否有可能以任何方式,Scenario1的CPU分配将与Ubuntu中的Scenario-2相同?

对我来说,虽然Ubuntu基于Debian,但Debian和Ubuntu的performance却不尽相同。 在Debian的情况下,Program1在这两种情况下都获得了更多的CPU。

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

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

你可以有50个进程和30个线程。 这是80个“事情”,内核会安排它们, 不管它们是进程还是线程