一、linux进程
1、父进程和子进程
1)父进程和子进程的关系
- [1] 子进程由fork函数创建,fork函数调用一次,返回2次,其中子进程的返回值是0,父进程的返回值是子进程的pid;
- [2] 父进程和子进程共享代码空间、堆栈,但是数据空间是独立的。即改变子进程中的局部变量和全局变量的值并不影响父进程中对应变量的内容,反过来也成立。
2)父进程和子进程的执行顺序
- 父进程和子进程的执行顺序是不确定的
2、僵尸进程
1)僵尸进程的产生
- 如果子进程比父进程先退出,并且父进程没有回收子进程的资源,那么这个子进程就会成为一个僵尸进程。如果子进程的父进程退出,僵尸进程会被系统的init托管,并回收僵尸进程所占用的资源。
2)僵尸进程的危害
- 任何一个进程在退出时,内核会自动释放该进程的所有资源,但是依然会为其保存但是仍然为其保留一定的信息(包括进程号,退出状态,运行时间等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.
3)如何避免僵尸进程
- 在父进程中调用wait函数等待子进程退出;
- 使子进程变成孤儿进程,使其父进程变成init,通过init来处理僵尸进程;
三、孤儿进程
1)孤儿进程的产生
- 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
1)孤儿进程的危害
- 孤儿进程产生后,会被init进程托管,init会调用wait等待其子进程退出,完成对孤儿进程的一切善后工作,因此孤儿进程并不会产生危害。
二、linux下进程和线程的异同
1)相同点
- 进程和线程在退出时都需要回收自己占用的资源,进程调用wait等待资源的释放,线程调用pthread_join等待资源的释放;
- 子进程共享父进程的代码空间和堆栈,进程中创建的线程同样共享父进程的代码空间和堆栈;
2)不同点
- 子进程拥有独立于父进程的数据空间,线程共享进程的数据空间;
- 线程的开销要远小于进程;
- 对于线程而言,父进程的退出并不会导致子进程的结束,而是让子进程被init进程托管。创建线程的进程退出后,会立即其内部创建的所有线程;
- 进程是资源分配的最小单位,线程是程序执行的最小单位;