进程和任务
目录一、程序和进程的关系
1、程序
执行特定任务的一串代码,静态,存在硬盘中
2、进程
运行中的程序叫做进程,动态,存在内存中有生命周期
2.1 进程具有的特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
- 结构性:进程由程序、数据和进程控制块三部分组成。
2.2 线程和进程的关系
2.2.1 线程:程序执行的最小单位
- 线程 是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。
- 一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
- (一个线程挂掉会影响其他线程,而进程之间是互相隔离的,互不影响)
2.2.2 进程:资源分配的最小单位
- 进程 是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。
- 从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位
2.2.3 查看单线程还是多线程
另一个方法:
2.3 进程使用内存的问题
-
内存泄露:指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
-
内存溢出:指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出,类似红杏出墙
-
内存不足:“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示:
*Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child**
当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理)。
2.3.1 解决方法
-
限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
-
给系统增加swap空间
2.4 进程状态
基本状态 | 描述 |
---|---|
创建状态 | 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态 |
就绪状态 | 进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行 |
执行状态 | 进程处于就绪状态被调度后,进程进入执行状态 |
阻塞状态 | 在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用 |
终止状态 | 进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行 |
如图:
还有几个其他的状态:
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程
2.4.1 过滤僵尸进程
首先创建一个僵尸进程
过滤僵尸进程
2.5 进程分类
操作系统分类:
- 协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用
- 抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务
进程类型:
- 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
- 前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转换
二、查看进程信息
1、查看静态进程信息——ps
1.1 常用选项
命令 | 作用 |
---|---|
a | 显示当前终端下的所有进程信息,包括用户的进程 |
u | 使用以用户为主的格式输出进程信息 |
x | 显示当前用户在所有终端下的进程信息 |
-e | 显示系统内的所有进程信息 |
-l | 使用长格式显示进程信息 |
-f | 使用完整的格式显示进程信息 |
k|--sort | 对属性排序,属性前加-表示倒序 ps aux k -%cpu |
o属性 | 选项显示定制的信息pid、cmd..... |
实例:
ps -aux
ps -ef
ps aux k -pid
1.2字段分析
表头 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID。 |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?代表和终端无关,系统进程 |
STAT | 进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -W:内存交互状态(从 2.6 内核开始无效)。 -X:死掉的进程(应该不会出现)。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 -+:位于后台。 |
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
表头 | 含义 |
---|---|
F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
UID | 运行此进程的用户的 ID; |
PID | 进程的 ID; |
PPID | 父进程的 ID; |
C | 该进程的 CPU 使用率,单位是百分比; |
PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
ADDR | 该进程在内存的哪个位置; |
SZ | 该进程占用多大内存; |
WCHAN | 该进程是否运行。"-"代表正在运行; |
TTY | 该进程由哪个终端产生; |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
CMD | 产生此进程的命令名; |
2、查看动态信息 ——top
2.1常用选项
命令 | 作用 |
---|---|
-d秒数 | 指定top命令每隔几秒更新。默认是3秒 |
-b | 使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中; |
-n | 指定 top 命令执行的次数。一般和"-"选项合用; |
-p | 进程PID:仅查看指定 ID 的进程; |
-s | 使 top 命令在安全模式中运行,避免在交互模式中出现错误; |
-u | 用户名:只监听某个用户的进程; |
2.2交互操作选项
命令 | 作用 |
---|---|
?/h | 显示交互模式的帮助; |
c | 按照 CPU 的使用率排序,默认就是此选项; |
M | 按照内存的使用率排序; |
N | 按照 PID 排序; |
T | 按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序; |
k | 按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号; |
r | 按照 PID 给某个进程重设优先级(Nice)值; |
q | 退出 top 命令; |
2.3 字段分析
行列名称 | 各字段涵义 |
---|---|
第一行任务队列信息 | 14 : 09 : 16(系统时间)up 5:31(系统已运行时长)2user(当前登录用户数)oad average: 0.00, 0.01, 0.05(系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值)(Load Average的值应该小于CPU个数核数0.7) |
第二行为进程信息 | Tasks(总进程数)running(正在运行的进程数 )sleeping(休眠的进程数) stopped(中止的进程数) zombie(僵死的进程数) |
第三行为CPU信息 | us(用户占用)sy(内核占用)ni(优先级调度占用)id(空闲CPU,要了解空闲的CPU百分比,主要看%id 部分)wa(I/O等待占用)hi(硬件中断占用)si(软件中断占用)st(虚拟化占用) |
第四行为内存信息 | total(总内存空间)free(空闲内存)used(已用内存)buff/cache(物理内存和交换内存的缓冲区总和) |
第五行为交换空间信息 | total(总交换空间)free(空闲交换空间)used(已用交换空间)avail Mem(可用物理空间) |
3、 查看进程信息——pgrep
3.1格式
pgrep “进程名” #默认只输出PID号,相似的命令"pidof"
3.2常用选项
选项 | 功能 |
---|---|
-l | 显示进程名 |
-U | 指定特定用户 |
-t | 指定终端 |
实例:
pgrep:
pidof:
4、 查看进程树——pstree
4.1 格式
pstree [选项]
4.2常用选项
命令 | 作用 |
---|---|
-a | 显示完整信息 |
-u | 列出对应用户名 |
-p | 列出对应的PID号 |
5、查看系统中已被打开的文件
5.1 格式
lsof[选项]
5.2 常用选项
命令 | 作用 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件。 |
+d 目录名 | 列出某个目录中所有被进程调用的文件。 |
-u 用户名 | 只列出某个用户的进程打开的文件。 |
-p pid | 列出某个 PID 进程打开的文件。 |
实例:
三、进程的启动方式
1、手工启动
1.1 前台启动:用户输入命令,直接执行程序
1.2 后台启动:在命令行尾加入"&"
四、进程的前后台调度
1、Ctrl +Z组合键
将当前进程挂起,调入后台并停止执行
2、jobs 命令
查看处于后台的任务列表
3、fg命令
将后台进程恢复到前台运行,可指定任务序号
实例:
五、结束进程
1、Ctrl + c 组合键
中断正在执行的命令
2、kill、killall命令
kill用于终止指定pid号的进程
killall用于终止指定名称相关的所有进程
2.1格式
kill [信号] PID
killall [选项] [信号] 进程名
2.2 常用选项
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出。 |
9 | KILL | 杀死进程,即强制结束进程。 |
11 | SEGV | 段错误。 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
六、计划任务管理
1、at命令
一次性计划任务
1.1格式:
at [HH:MM] [yyyy-mm-dd] #指定时间设置任务(不加年月日表示当天)ctrl+D退出
atq #查看未执行的任务列表
atrm [任务序号] #删除第一条任务
2、crontab命令
周期性计划任务
2.1 格式
crontab -e [-u 用户名] #编辑计划任务,-u缺省时表示当前用户
crontab -l [-u 用户名] #查看计划任务
crontab -r [-u 用户名] #删除计划任务
2.1 常用选项
选项 | 功能 |
---|---|
-u user | 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
-e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 |
-l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 |
-r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 |
-i | 在删除用户的 crontab 文件时,给确认提示。 |
实例:
字段解析:
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
-(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
/(正斜线) | 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令。 |