美文网首页
linux 进程基础(一)

linux 进程基础(一)

作者: eeert2 | 来源:发表于2019-08-05 22:18 被阅读0次

    转载 https://www.cnblogs.com/vamei/archive/2012/09/20/2694466.html 作者:Vamei

    一、进程与程序

    我们做编程就是写程序,而程序则是由进程来实现。

    运行我们写好的程序,系统会将它加载到内存中,成为一个个体,也就是进程,并给予这个进程唯一一个 ID,就是 PID,同时依据触发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设置。

    我们可以使用 ps 命令来查询正在运行的进程,比如ps -eo pid,comm,cmd
    (-e表示列出全部进程,-o pid,comm,cmd表示我们需要PID,COMMAND,CMD信息)

    每一行代表了一个进程。每一行又分为三列。第一列PID(process IDentity)是一个整数,每一个进程都有一个唯一的PID来代表自己的身份,进程也可以根据PID来识别其他的进程。第二列COMMAND是这个进程的简称。第三列CMD是进程所对应的程序以及运行时所带的参数。

    我们看第一行,PID为1,名字为init(有的是systemd)。这个进程是执行/bin/init这一文件(程序)生成的。当Linux启动的时候,init是系统创建的第一个进程,这一进程会一直存在,直到我们关闭计算机。这一进程有特殊的重要性,我们会不断提到它。

    实际上,当计算机开机的时候,内核(kernel)只建立了一个init(也有叫systemd)进程。Linux内核并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。进程存活于内存中。每个进程都在内存中分配有属于自己的一片空间 (address space)。当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。

    还可以用pstree命令来显示整个进程树:

    二、子进程 与 父进程

    fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。

    通常在调用fork函数之后,程序会设计一个if选择结构。当PID等于0时,说明该进程为子进程,那么让它执行某些指令;而当PID为一个正整数时,说明为父进程,则执行另外一些指令。由此,就可以在子进程建立之后,让它执行与父进程不同的功能。

    子进程会沿用父进程的相关权限,因为子进程是从父进程 fork (复制)过来的,子进程会具有父进程的环境变量和权限。

    三、子进程的终结

    当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数)。在这个信息里,会解释该进程为什么退出。父进程在得知子进程终结时,有责任对该子进程使用wait系统调用。这个wait函数能从内核中取出子进程的退出信息,并清空该信息在内核中所占据的空间。但是,如果父进程早于子进程终结,子进程就会成为一个孤儿(orphand)进程。孤儿进程会被过继给init进程,init进程也就成了该进程的父进程。init进程负责该子进程终结时调用wait函数。

    当然,一个糟糕的程序也完全可能造成子进程的退出信息滞留在内核中的状况(父进程不对子进程调用wait函数),这样的情况下,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。

    参考文件
    https://www.cnblogs.com/vamei/archive/2012/09/20/2694466.html 作者:Vamei

    相关文章

      网友评论

          本文标题:linux 进程基础(一)

          本文链接:https://www.haomeiwen.com/subject/ngbvdctx.html