1、进程
主要概念
进程是正在运行的可执行程序的实例,通过进程ID(pid)识别
LInux使用虚拟内存,所以每个进程都拥有自己特定的内存地址空间
进程有一个uid和一组gid
进程有其文件系统环境,包括cwd、unmask、根目录和一组打开的文件
进程有调度环境,包括优先级值
进程有一组环境变量
ps命令可用来查看所有正在运行的进程
top命令可用来监控所有正在运行的进程
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)
查看进程状态
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文件帮助调试程序
停止:停止(挂起进程)
选择忽略信号
程序员可以选择让自己的应用程序忽略指定的信号
选择执行自定义信号处理程序
程序员可以在接收到指定信号时执行自己的动作。程序响应完全由程序员决定
用信号终止进程
kill的替代命令
pkill命令
5、作业控制
bash Shell允许命令作为“作业”在后台运行
bash Shell允许前台运行一个作业,后台运行多个作业
jobs命令会列出后台所有的作业
Crtl+Z组合键会挂起当前的前台作业,并将其置于后台。
bg命令可以恢复置于后台作业的运行
fg命令可以将后台作业置于前台
6、调度延迟的任务
主要概念
at命令可以是命令稍后运行
batch命令可以让命令在机器负载较低的情况下运行
可以直接进入命令,或者以脚本的方式提交命令
作业中的标准输出用邮件发送给用户
atq命令和atrm命令用来查看和删除当前的计划任务