进程管理

1、进程

主要概念

进程是正在运行的可执行程序的实例,通过进程ID(pid)识别

LInux使用虚拟内存,所以每个进程都拥有自己特定的内存地址空间

进程有一个uid和一组gid

进程有其文件系统环境,包括cwd、unmask、根目录和一组打开的文件

进程有调度环境,包括优先级值

进程有一组环境变量

ps命令可用来查看所有正在运行的进程

top命令可用来监控所有正在运行的进程


进程管理_第1张图片


进程管理_第2张图片


进程管理_第3张图片


进程管理_第4张图片


进程管理_第5张图片


进程管理_第6张图片


2、进程状态

主要概念

在Linux系统中,第一个进程/sbin/init由内核在启动时运行。其他所有进程都是父进程自我复制或派生的结果。

一个进程由另一个进程执行的过程叫做exec

通常,新命令由进程(通常是Shell)运行,首先派生(fork),继而执行(exec)。这种机制被称为派生和执行机制。

进程总是处于五种状态之一:可运行(runnable)、自愿睡眠(voluntarily sleeping)、强制睡眠(involuntarily sleeping)、停止(stopped)或僵尸(zombie)

进程家谱可以用pstree命令查看

当进程终止时,父进程负责收集进程的返回值和资源使用信息

如果父进程在子进程之前终止,失去父进程的子进程托孤给第一个进程(通常是/sbin/init)

2、Linux系统不同于其他操作系统,进程创建和命令执行是两个不同的概念

不运行新命令也可以创建进程,不创建新进程也可以运行命令。

创建新进程(派生)

新进程通过一种名叫派生的方式创建。当进程派生时,他创建自己的一个副本。新派生的进程(子进程)几乎都是精确复制了原进程(父进程)。子进程继承了与父进程内存完全一样的副本,继承了父进程任何打开的文件,并且继承完全一样的父进程拥有的任何参数,例如当前工作目录或unmask。父进程与子进程之间的唯一区别在于,子进程的遗留信息(对初学者而言,子进程和父进程有不同的进程ID)和fork()系统调用的返回值(对于普通程序员而言)

进程如何终止

当进程终止时,可能是通过选择退出正常终止,也可能是因为接受到信号而非正常终止。进程在终止时会留下整数形式的状态码(也称作返回值),当进程退出时除了返回码外,它的所有资源都被释放了。收集这个信息并且释放终止的子进程最后所剩的资源,是父进程的责任。

孤儿进程

如果父进程在子进程终止之前终止,子进程就变成额孤儿进程。由内核启动的第一个进程的特殊职责就是收养所有孤儿进程。

僵尸进程

当进程退出、释放大多数资源和它的父进程收集它的返回值、释放剩余资源这两段时间之间,子进程处于一种特殊状态,被称作僵尸进程。每个进程都会经过一个短暂的僵尸状态。通常用户只要在恰当的时间注意看,就能看到处于僵尸状态的进程。它们出现在进程列表中,却不占用内存空间、CPU时间,以及其他任何系统资源。它们只是之前进程的影子,等待父进程来终止它们。

疏忽大意的父进程和长久存在的僵尸进程

父进程有时候会疏忽大意。它们启动了子进程,然后当子进程终止后却不进行清理。

出现这种情况时(通常是由于程序员出错所致),子进程可能会退出,进入僵尸状态,并且一直保持这种状态。

3、五种进程状态

可运行(R)

处于可运行状态的进程,一旦有机会,就会访问CPU。多个进程可以(而且经常)处于可运行状态,但是因为在任何给定时间内只有一个进程可以在CPU上运行。

自愿睡眠(可中断的)(S)

处于自愿睡眠状态的进程选择处于该状态。一个经典的例子就是网络守护进程,如网页服务器的httpd进程。在客户端(网络浏览器)发出之前,服务器无事可做,选择睡眠。

非自愿(不可中断或强制)睡眠

停止的(挂起的)进程T

用户有时决定挂起进程,被挂起的进程在被用户重新启动前不会执行任何操作

僵尸进程(Z)

查看进程状态


进程管理_第7张图片

4、进程调度:优先级(nice)和更改优先级(renice)

主要概念

Linux内核的基本任务是调度进程

每个进程都有一个影响其调度的优先级值(niceness)

nice和renice命令可以改变进程调度的优先顺序

进程调度的术语

Linux内核的一个基本任务是确保进程有效地共享系统资源,要共享的一个基本的资源是CPU,内核决定哪个进程何时在CPU上可执行被称作调度。

5、发送信号

主要概念:

信号是进程间通信的底层形式,由多种来源产生,包括内核、终端和其他进程

信号由信号值(或信号号码)区分,信号值具有约定的符号名称和用途。信号值的名称可以用kill-l命令列出

kill命令向其他进程发送信号

接收到信号时,进程可以忽它或用内核指定的默认方式作出反应,也可以调用一个自定义信号处理程序

根据约定,信号值15(SIGTERM)用来请求终止进程

信号9(SIGKILL)可以终止进程,而且该信号不能被忽略

可以用pkill和killall命令向那些由命令名或者拥有它们的用户指定的进程发送数据

信号

LInux系统用信号通知进程发生的异常事件,并且把信号作为进程间通信的原始机制。

为什么要发送信号

硬件异常

进程让硬件执行了一些错误的操作

软件状态

要把一些异常的软件状态通知给进程

终端中断

各种各样的终端控制组合键会把信号发送给bash Shell的前台进程。

发送信号:kill命令

kill命令用来向其他进程发送自定义信号

接收信号

当进程收到信号时,会采取一下三种行动中的一种

执行内核默认的信号处理程序

对每种信号而言,都有一个由内核执行的默认响应,每个信号被映射到下列一种行为中

终止:接收信号的进程被杀死

忽略:接收进程忽略信号

core:接收进程终止,但首先把它的内存映像转储到进程当前工作目录下名为core的文件中。程序员可以用core文件帮助调试程序

停止:停止(挂起进程)

选择忽略信号

程序员可以选择让自己的应用程序忽略指定的信号

选择执行自定义信号处理程序

程序员可以在接收到指定信号时执行自己的动作。程序响应完全由程序员决定

用信号终止进程


进程管理_第8张图片

kill的替代命令

pkill命令


进程管理_第9张图片


进程管理_第10张图片

5、作业控制

bash Shell允许命令作为“作业”在后台运行

bash Shell允许前台运行一个作业,后台运行多个作业

jobs命令会列出后台所有的作业

Crtl+Z组合键会挂起当前的前台作业,并将其置于后台。

bg命令可以恢复置于后台作业的运行

fg命令可以将后台作业置于前台


进程管理_第11张图片

6、调度延迟的任务

主要概念

at命令可以是命令稍后运行

batch命令可以让命令在机器负载较低的情况下运行

可以直接进入命令,或者以脚本的方式提交命令

作业中的标准输出用邮件发送给用户

atq命令和atrm命令用来查看和删除当前的计划任务


进程管理_第12张图片

你可能感兴趣的:(进程管理)