我试图理解CPU是如何在具有不同线程的不同进程之间分配的。我有两个程序Program1和Program2。
Program1有5个线程,而Program2只有主线程。
SCENARIO -1:
terminal-1 : ./Program1
terminal-2 : ./Program2
当我在一个终端中运行Program1而在另一个终端中运行Program2时,Program1的CPU分配为50%,Program2为50%。 Program1的每个线程都获得10%(Program1累计为50%)
这表明,无论进程具有什么线程,每个进程都将获得相同的CPU份额。 这表示CPU分配是在流程级别完成的。
pstree显示
├─bash───P1───5*[{P1}]
├─bash───P2───{P2}
SCENARIO -2:
terminal-1 : ./Program1 & ./Program2
当我在SAME终端中运行Program1和Program2时,对于Program1和Program2的所有线程,CPU分配都是相同的。这意味着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内核源代码。
但是,我在源代码中找不到它区分SCENARIO-1和SCENARIO-2。
如果有人向我指出CPU调度程序区分SCENARIO-1和SCENARIO-2的源代码或函数,那将会很棒。
提前致谢。
注意:虽然Ubuntu基于Debian,但令人惊讶的是,在Debian 8(kernel-3.16.0-4-686-pae)中,SCENARIO的CPU分配都是在线程级别完成的意味着每个线程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;
}
Program2(只有主线程)
#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
UPDATE:根据ninjalj的说明,在场景-1中,CPU分配在控制组级别完成,因为我使用两个不同的终端(意味着两个不同的会话),因此2个不同的控制组和每个控制组获得50%的CPU分配。这是由于原因,默认情况下启用自动组。
由于Program2只有一个线程,而Program1有更多线程,我想运行 程序在单独的终端(不同的会话)中并为Program1获得更多的CPU分配(如在场景-2中,Program1正在获得83%的CPU分配,相比之下,Program2的17%)。是否可以以任何方式,Scenario1的CPU分配与Ubuntu中的Scenario-2相同?
虽然Ubuntu基于Debian,但Debian和Ubuntu的表现不同,我也感到惊讶。在Debian的情况下,Program1在两个场景中都获得了更多的CPU。
答案 0 :(得分:5)
Linux内核不在调度中区分进程与线程。
线程是碰巧共享大部分内存的进程。除此之外,调度程序也同样对待它们。
您可以拥有50个进程和30个线程。这是80&#34;事情&#34;并且内核将在没有的情况下安排它们,无论它们是进程还是线程