一、程序1.1什么是程序

  • 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
  • 用于描述进程要完成的功能,是控制进程执行的指令集

二、进程2.1什么是进程

(1)运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位

  • 进程ID(Process ID,PID)号码被用来标记各个进程
  • UID、GID语境决定对文件系统的存取和访问权限
  • 通常从执行进程的用户来继承
  • 存在生命周期
  • 都由其父进程创建

(2)进程创建:

  • CentOS6:是init第一个进程,CentOS7:是systemd第一个进程
  • 进程:都由其父进程创建

(3)进程具有的特征:

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是系统进行资源分配和调度的一个独立单位;
  • 结构性:进程由程序、数据和进程控制块三部分组成。

(4)进程和线程的区别:

  • 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
  • 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
  • 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
  • 调度和切换:线程上下文切换比进程上下文切换要快得多;
怎么查看进程中的线程?
第一步:先查看系统进程号:pstree -p
第二步:grep -i threads /proc/PID号/status

2.2进程使用内存的问题

内存使用会出现的问题:

  • 内存泄漏:指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
  • 内存溢出:指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出,类似红杏出墙
  • 内存不足:原因给应用分配内存太少:

比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
使用的解决办法:
(1)限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
(2)给系统增加swap空间

2.3进程状态

(1)进程更多的状态:

  • 运行态:running
  • 就绪态:ready
  • 睡眠态:分为两种:可中断:interruptable;不可中断:uninterruptable
  • 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
  • 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态的子进程

(2)僵尸进程:
一个进程结束了,但是如果该进程的父进程先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵厂进程。

总结:父进程退出子进程没有退出 ,那么这些子进程就没有父进程来管理了, 就变成僵尸进程。子进程已经结束了,父进程没有意识到。

2.4进程之间通讯

同一主机:

  • pipe:管道,单向传输
  • socket:套接字文件,双工通信
  • Memory-maped file:文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
  • shm shared memory:共享内存
  • signal:信号
  • Lock:对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
  • semaphore:信号量,一种计数器

不同主机:socket=IP和端口号

  • RPC:远程调用
  • MQ:消息队列,生产者和消费者。如:Kafka,RabbitMQ,ActiveMQ

2.5进程的优先级OS

进程优先级调整:

  • 静态优先级:100-139
  • 进程默认启动时的nice值为0,优先级为120
  • 只有根用户才能降低nice值(提高优先性)

2.6进程分类

操作系统分类:
(1)协作式多任务:早期 windows 系统使用,即一个任务得到了CPU时间,除非它自己放弃使用CPU ,否则将完全霸占CPU ,所以任务之间需要协作,使用一段时间的 CPU ,主动放弃使用。
(2)抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务。
进程类型分类:
(1)守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
(2)前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
按进程资源使用的分类:
(1)CPU-Bound:CPU 密集型,非交互
(2)IO-Bound:IO 密集型,交互

三、进程管理相关命令3.1ps命令

ps可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status下的各文件中

 1 查看静态的进程统计信息 2 "ps aux" 可以查看系统中所有的进程; 3 "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级; 4 "ps -l" 只能看到当前 Shell 产生的进程; 5  6 常用选项 7 -a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。 8 -u:使用以用户为主的格式输出进程信息。 9 -x:显示当前用户在所有终端下的进程信息。10 -e:显示系统内的所有进程信息。11 -l:使用长(Long)格式显示进程信息。12 -f:使用完整的(Full)格式显示进程信13 -k:对属性排序,属性前加 - 表示倒序14 -o:显示定制的信息 pid、cmd、%cpu、%mem

PRI (最终值) = PRI (原始值) + NI

修改 NI 值时有几个注意事项:

  • NI范围:是 -20~19,越小越好。
  • 普通用户调整NI值的范围是:0~19,而且只能调整自己的进程。
  • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
  • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

3.2top命令

top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

 1 选项: 2 -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒; 3 -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中; 4 -n 次数:指定 top 命令执行的次数。一般和"-"选项合用; 5 -p 进程PID:仅查看指定 ID 的进程; 6 -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误; 7 -u 用户名:只监听某个用户的进程; 8  9 在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:10 ? 或 h:显示交互模式的帮助;11 c:按照 CPU 的使用率排序,默认就是此选项;12 M:按照内存的使用率排序;13 N:按照 PID 排序;14 T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;15 k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;16 r:按照 PID 给某个进程重设优先级(Nice)值;17 q:退出 top 命令;

缓冲(buffer)和缓存(cache)的区别:

  • 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
  • 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

简单来说,缓存(cache)是用来加速数据从硬盘中”读取”的,而缓冲(buffer)是用来加速数据”写入”硬盘的。

3.3pgrep命令

pgrep命令:查看指定的进程-U 指定用户-l: 显示进程名-a: 显示完整格式的进程名-P: 显示指定进程的子进程

3.4pstree

pstree:以树形结构列出进程信息

常用选项:-a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等-p:显示PID-T:不显示线程thread,默认显示线程-u:显示用户切换-H:pid高亮显示指定进程及其前辈进程

3.5lsof

lsof:是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。

lsof [选项]

实验:删除大文件不释放空间

3.6监控系统资源vmstat

vmstat命令:可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。

五大系统资源:

cpu利用率:怎么查看(top,ps aux)

内存利用率:(free)

磁盘:(df,fdisk -l,lsblk)

磁盘读写性能:(dd,vmstat,iostat)

带宽:网络资源

四、进程管理

4.1手动启动(jobs,fg,bg)

  • 前台启动:通过终端启动,且启动后一直占据终端
  • 后台启动:可通过终端启动,但启动后即转入后台运行(释放终端)

“命令&”,把命令放入后台执行(具有交互性质的命令不建议放入后台比如ping命令)

让作业运行于后台(并行执行):
运行中的作业:Ctrl+z

jobs,fg,bs命令使用

4.2结束进程kill,killall

(1)kill

命令格式:kill [信号] PID kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
  • kill -9:强制杀死进程
  • kill -18:运行进程
  • kill -19:停止进程

(2)killall

命令格式:
killall
[选项] [信号] 进程名killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用-i:交互式,询问是否要杀死某个进程-I:忽略进程名的大小写

五、计划任务5.1at一次性

HH:MM YYYY-MM-DD:规定在某年某月的某一天的特殊时刻进行该项任务

5.2crontab周期

1 crontab [选项] [file]

在书写 crontab 定时任务时,需要注意以下几个事项:

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
  • crontab 定时任务的最小有效时间是分钟,最大有效时间是月。
  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。