进程是由多个线程构成 一个是资源分配的最小单位 一个是处理调度的最小单位――这是我对进程和线程最笼统的感受。
最近,《操作系统》扯到Linux的内核分析,又提到Linux系统的进程管理,感触颇深。
我不知道在Windows中,进程和线程之间的联系是如何的,进程创建之时又需做哪些处理。但在Linux中,进程和线程的区分并不是十分严格,“共享内存”是进程通信的一个显著特点。
许多进程在创建的时候是与父进程共用一个存储空间的,所以严格说来还是线程;但子进程又可以建立自己的存储空间,并与父进程脱离,成为真正意义上的进程。另外,线程也有task_struct这样数据结构的控制块。所以,在很多文章中,这两个词是没有严格区分的。
Linux系统运行的第一个进程是在初始化时“捏造”出来的,而此后的进程或线程都是由一个已存在的进程象细胞分裂一样通过fork(),clone()这样的系统调用复制出来的。――这是《Linux内核情景分析》中的原话,很是形象。也让我一下子感到了Linux的奇妙。
附上我今天在Linux中运行的C程序:
#include<stdio.h>
main(){
int p1,p2;
if(p1=fork())
putchar('b');
else{
if(p2=fork())
putchar('c');
else putchar('a');
}
}
运行结果是:bca (acb bac都有可能)原因是父子进程有一个抢占处理机的问题。
fork函数即是全部复制,将父进程中的全部资源通过数据结构的复制传给子进程,在外观上看,父进程和子进程的代码都是一样的,不同的是p1、p2的值。上文提及的clone则是部分复制。