2 进程概述 通俗的讲程序是一个包含可以执行代码的静态的文件。进程是一个开始执行但是还没有结束的程序的实例。 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用。
1.1 进程的分类 按照进程的功能和运行的程序分类,进程可划分为两大类: 系统进程 可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。 用户进程 通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。 针对用户进程,又可以分为如下3类: 交互进程:由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。 守护进程:守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd进程,crond进程等。 1.2 进程状态 为了充分的利用资源,系统还对进程区分了不同的状态。 一般操作系统将进程分为五个状态:
新建:新建表示进程正在被创建。 运行:运行是进程正在运行。 阻塞:阻塞是进程正在等待某一个事件发生。 就绪:就绪是表示系统正在等待CPU来执行命令。 完成:完成表示进程已经结束了系统正在回收资源。
Linux上进程有5种状态,这5中状态可以与一般操作系统的状态对应起来:
运行:正在运行或在运行队列中等待。 中断:休眠中, 受阻, 在等待某个条件的形成或接受到信号。 不可中断:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。 僵死:进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。 停止:进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
1.3 进程ID与父子进程 一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子孙进程。 为了区分各个不同的进程,系统给每一个进程分配了一个ID以便识别。Linux系统中,进程ID(PID)是区分不同进程的唯一标识。PPID表示父进程。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。 一般每个进程都会有父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但子进程关闭,父进程不一定终止。
1.4 僵尸进程 每个进程在结束后都会处于僵死状态,等待父进程将其释放资源,处于该状态的进程已经结束,但父进程还没有释放其系统资源。 由于某种原因,父进程在子进程退出前退出,则所有子进程就变成一个孤儿进程,拖没有相应处理机制,则孤儿进程会一直处于僵死状态,资源无法释放。这种僵死的孤儿进程即僵尸进程。 此时解决方法是在启动进程内找一个进程作为这些孤儿进程的父进程,或者直接让init进程作为它们的父进程,进而释放孤儿进程占用的资源。
1.5 线程 线程在Linux中被称为轻量级的进程。 进程有独立的内存地址空间,线程没有。线程不能独立存在,线程由进程创建的。 2. ps 查看隶属自己的进程 PID : 进程号 PPLD: 父进程的进程号 TTY : 进程启动的终端 STAT : 进程当前状态(S休眠状态,D不可中断的休眠状态,R运行状态,Z僵死状态,T停止) NI : 进程优先级 TIME: 进程自从启动以后启用CPU的总时间 COMMAND/CMD:进程的命令名 USER: 用户名 %CPU: 占用CPU时间和总时间的百分比 %MEM: 占用内存与系统内存总量的百分比