我理解的进程是一个动态的概念,区别于程序(静态的概念,只存在于硬盘)进程存在于内存,它占有代码段,数据段(全局,静态),堆栈(动态分配的变量),当我一旦开了一个进程,就必须记得exit()。而且我也要写wait函数确保子进程消亡,(如果我想让他出错就用abort函数)避免它成为僵尸态。既然开了一个进程,我要让他去执行别的任务,因此exec系列函数让它执行别的任务,如果它优先级太低那我就给他nice(x)提升一下。如果我嫌弃我fork的进程太多占内存,(当然现在内存一般都很大),那我就要开线程,同事做好消亡线程的准备(pthread_exit()),让父线程等子线程消亡后join去,回收了资源。把一个小任务做了线程,还有一个好处,就是如果你这个线程很耗时,那么他就可以在时间到了以后离开这个内存,让别的同级的子线程使用资源。不会因为上下文的缘故,这个耗资源的线程一直霸占内存。
线程和进程只是形式上不同,本质都是do_fork()。
父子进程之间拥有相同的整个地址空间,但是子进程不继承父进程的锁和id号,还有书上多次出现的未决警告,(未决警告)这个我没查清干啥的。在父子进程中,都会有pid = fork(),谁先返回谁是正数,否则便是零(有操作系统的插手),因此fork有两个返回值。
父子线程拥有相同的地址空间,轮流在这个地方运行。假设一种情况(father,son1,son2) son1里面有几个函数son 2也有。现在有一个全局变量key,针对不同的线程想有不同的数据(线程私有数据)会采用一件键值来搞定这个问题。用pthread_key_t 声明这个key,用pthread_key_create函数绑定这个key.在整个的共享的内存地址空间上,有一块区域,放着总指针,假设叫fa_key,它是一个数组指针,第一个元素存放的是第一个全局变量key的地址,第二个元素存放第二个全局变量的地址,这样你执行的时候就会对应去找相应的key,出现同名不同值的情况。如果想有一个全局变量,这个在任何的线程内保持数据的同步,那么你要考虑条件变量。对条件变量更改真假值(从而释放或者阻塞其他进程的)时候就要考虑上锁,同时别的进程要有pthread_cond_wait函数接受你的pthread_cond_wait阻塞要不然不管用。
进程和线程比,上下文切换慢,但是线程用的内存小,不过现在内存都大,我觉得除非使劲用,要不然内存不会玩完的。