进程:
指可并发执行的程序在一个数据集合上的运行过程。
特性:并发性,独立性,动态性。
状态:执行态,就绪太,阻塞态。
在Linux中所有程序都是以进程的形式执行的。Linux系统的进程只能有一个父进程,而一个父进程可以有多个子进程,所有的进程组成一颗书,系统进程init就是这颗树的树根。
Linux中创建一个新进程的唯一方法是调用系统调用fork。虽然Linux系统提供另一个系统调用vfork,但这个函数只不过是函数fork的一个别名。
函数fork执行时,创建一个新进程,调用函数fork的进程是父进程,新创建的进程是子进程,父进程中,函数fork返回子进程的进程号,这是一个正整数,子进程中函数fork返回0,当函数调用失败时返回-1。因为父进程可以创建多个子进程,所以他需要获得不同子进程的进程号,而子进程只有一个父进程,而且在子进程的系统进程表项中记录有父进程的信息,所以不需要马上知道父进程的进程号,如果需要他可以在函数返回后调用getppid来获得父进程的进程号。
进程与线程的区别:
参考阮一峰的网络日志,很通俗易懂。
僵尸进程:
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程
是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退
出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信
号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动
会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
Linux系统对运行的进程数量有限制,如果产生过多的僵尸进程占用了可用的进程号,将会导致新的进程无法生成。这就是僵尸进程对系统的最大危害。