本文讨论内核以Linux1.0为例。
Linux内核为每个进程创建了struct task_struct结构,保存每个进程所独有的数据。独立于用户进程空间。(用户进程空间是整个程序主体,包含代码段,数据段,堆栈段。)
Linux中用进程结构指针数组的方式提供了NR_TASKS(128)个可用的空间,当需要进程时可以遍历数组,查找为NULL项,然后申请一个页面存放进程结构主体,在将NULL项指向主体。
所以NR_TASKS的大小指定了整个可以同时运行的进程数。而这个数字在1.0内核中是128。但这个数字在我的redhat上是十分小的。所以我以1024这个数字来说明如果同时运行该数目数字的进程的化会导致的后果,来说明进程总数指定的严格性。
如果我们同时运行了1024个进程。
假定程序每1/100秒切换一次进程,1024个进程都运行一遍需要1.024秒。如果我们的程序是一个占用CPU高的程序,比如递归的求解数独程序,运行程序求解一个数独需要10秒,而现在需要1.024*(10/(1/100))=1024 约需17分钟。这是让人无法忍受的。而这种情况如果发生在图形界面的话,程序会卡卡卡.....(下面有一个程序,可以在LINUX图形界面下运行,可以看看有多卡顿)
我们每个进程进程结构占用1KB空间,内核栈占用1KB空间,页目录页表占用80KB空间,1024共用去82MB的空间,这样的占用对内存来说是巨大的开销。
代码:
int childCount=0;
void child_do(void)
{
int a;
int b;
int c;
while(1)
{
a=b+1;
c=a+b;
b=c-1;
}
}
int main(int argc,char **argv)
{
int pid;
while(1)
{
pid=fork();
if(pid<0)
{
break;
}else if(pid==0)
{
child_do();
}else
{
childCount++;
}
}
printf("all Child %d \n",childCount);
while(1)
{
;
}
}