一.程序💕进程
1.程序
程序是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成任务
2.进程
进程则是运行着的程序,是操作系统执行的基本单位,是程序运行的过程,动态,有生命周期及运行状态
- 从用户的角度来看进程是程序的一次动态执行过程。
- 从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。
- 进程是资源分配的最小单位。
- 每一个进程都有自己独立的地址空间与执行状态。
- 像Linux这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。
3.进程和线程的区别
- 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有。
- 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执
行。
二.linux下的进程
每个用户均可同时运行多个程序。为了区分每一个运行的程序,Linux给每个进程都做了标识,称为进程号(process ID),每个进程的进程号是唯一的。
Linux 给每个进程都打上了运行者的标志,用户可以控制自己的进程:给自己的进程分配不同的优先级,也可以随时终止自己的进程。
进程从执行它的用户处继承UID、GID,从而决定对文件系统的存取和访问
使用PID区分不同的进程:
- 系统启动后的第一个进程是init(注:init是CenTOS 5/6,CenTOS 7是systemd),它的PID是1。init是唯一一个由系统内核直接运行的进程。
- 除了init之外,每个进程都有父进程(PPID标识)
- 每个进程还有四个与用户和组相关的识别号
- 实际用户识别号 (real user ID,RUID)
- 实际组识别号 (real group ID,RGID)
- 有效用户识别号 (effect user ID,EUID)
- 有效组识别号 (effect group ID,EGID)
- RUID和RGID的作用:识别正在运行此进程的用户和组。
- EUID和EGID的作用:确定一个进程对其访问的文件的权限。
1.父子进程的关系
父子进程的关系子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程在linux系统中,使用 系统调用fork创建进程。 fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。父进程终止子进程自然终止。
子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
2.进程类型
进程类型:
- 交互进程
- 由一个Shell启动的进程。
- 交互进程既可以在前台运行,也可以在后台运行。
- 批处理进程
- 不与特定的终端相关联,提交到等待队列种顺序执行的进程。
- 守护进程(Daemon)
- 在Linux在启动时初始化,需要时运行于后台的进程。
3.进程的启动方式
进程的启动方式:
- 手工方式:使用操作系统提供的用户接口
- 前台
- 后台 (&)
- 调度方式:按照预先指定的时间执行
- at
- batch
- cron
前台进程:
- 指一个程序控制着标准输入/输出,在程序运行时,shell 被暂时挂起,直到该程序运行结束后,才退回到 shell。在这个过程中,用户不能再执行其它程序.
后台进程:
- 用户不必等待程序运行结束就可以执行其它程序。运行后台进程的方法是在命令行最后加上 “&”。
4.进程和作业的区别
作业:shell程序的概念,由shell程序负责管理
- 一个操作系统可以启动多个shell程序,shell本身也是一个进程
- 一个作业里至少包含一个进程,也可以包含多个进程
- 作业分前台和后台运行之分
三.linux进程管理工具
1.pstree命令
用于查看进程树之间的关系,既哪个是父进程,哪个是子进程,可以清楚的看出来谁创建了谁。
-A | 各进程树之间的连接以ASCII码字符来连接 |
---|---|
-p | 同时列出每个进程的pid |
-U | 各进程树之间的连接以utf8字符来连接,某些终端可能有错误 |
-u | 同时列出每个进程的所属账号名称 |
2.ps命令
ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。
选项:
- -A:所有的进程均显示出来,与-e具有同样的效用;
- -a:显示现行终端机下的所有进程,包括其他用户的进程;
- -u:以用户为主的进程状态;
- -x:通常与a这个参数一起使用,可列出较完整信息
输出格式规划:
- l:较长、较详细的将该PID的的信息列出;
- j:工作的格式(jobsformat)
- -f:做一个更为完整的输出。
F代表这个程序的旗标(flag),4代表使用者为superuser;
S代表这个程序的转态(STAT);
UID代表执行者身份;
PID 进程的ID号;
PPID 父进程的ID;
C CPU使用的资源百分比;
PRI指进程的执行优先权(Priority的简写),其值越小越早被执行 ;
NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值;
ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行的程序,一般就是【-】;
SZ 使用掉的内存大小
WCHAN 目前这个程序是否正在运行当中,若为 - 表示正在运作;
TTY 登入者的终端机位置;
TIME 使用掉的CPU时间
CMD 所下达的指令名称
USER:该进程属于哪个使用者账号
PID:该进程的进程ID号
%CPU:该进程使用掉的CPU资源百分比
%MEM:该进程所占用的物理内存百分比
VSZ:该进程使用掉的虚拟内存量
RSS:该进程占用的固定的内存量
TTY:该进程是在那个终端机上面运作,若与终端机无关,则显示 ?。另外,tty1-tty6 是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连接进主机的程序
STAT:该程序目前的状态,主要的状态有:
R:该程序正在运作,或者是可被运作
S:该程序正在睡眠中,但可被某些讯号(signal)唤醒
T:该程序目前正在侦测或者是停止了
Z:该程序应该已经终止,但是其父进程却无法正常的终止他,造成zombie(僵尸)程序的状态
START:该进程被触发启动的时间;
TIME:该进程实际使用CPU运作的时间
COMMAND:该程序的实际指令;
3.pgrep命令
经常要查看进程的信息,包括进程的是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其程序名,找到匹配的进程
-l | 同时显示进程名和pid |
---|---|
-o | 当匹配多个进程时,显示进程号最小的那个 |
-n | 当匹配多个进程时,显示进程号最大的那个 |
注:进程号越大,并不一定意味着
4.killall命令
killall命令用于杀死指定名字的进程(kill process by name),我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在此之前使用ps等命令配合grep来查找进程,而killall将这两个过程合二为一,是个很好的命令
-z | 只杀死拥有scontext的进程 |
---|---|
-e | 要求匹配进程名称 |
-I | 忽略大小写 |
-g | 杀死进程组而不是进程 |
-i | 交互模式 |
-l | 列出所有的已知信号名称 |
-q | 不输出警告信息 |
-s | 发送指定的信号 |
-v | 报告信号是否发送成功 |
-w | 等待进程死亡 |
5.kill命令
kill命令用来终止指定的进程的运行,是linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+c键,但是,对于一个后台进程就必须使用kill命令来终止,我们需要先使用ps/pidof/pstree/top工具获取进程PID,然后使用kill命令来杀掉进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要使用编号为9的kill信号,强行杀掉进程。
kill [选项] [进程id]
常用信号:
HUP 1 终端断线
INT 2 中断(同Ctrl+c)
QUIT 3 退出(同Ctrl+\)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续
STOP 19 暂停(同Ctrl+z)
-l | 列出全部的信号信息 |
---|---|
-a | 当处理当前进程时,不限制命令名和进程号的对应关系 |
-p | 指定kill命令只打印相关进程的进程号,而不发出任何信号 |
-s | 指定发送信号 |
-u | 指定用户 |
重点:
1.kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。
2.kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。
3.可以向多个进程发信号或终止它们。
4.当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下enter键使shell的命令提示符再次出现时,才会显示出来。
5.应注意,信号时进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入killall或者kill 0.因为有些后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用killall,kill 0来终止所有由当前shell启动的进程,是个有效的方法。
在这里注意,kill 0 中0不代表信号id
6.kill 0 不发送任何信号,常用来检测进程是否存在,在脚本中echo$?,存在返回0,不存在返回1
6.pkill命令(了解)
7.vmstat命令:
vmstat命令是常见的linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
用法:vmstat [选项] [delay] [count]
-n 只在开始时显示一次各字段名称 -a 显示活跃和非活跃内存 -d 显示各个磁盘相关统计信息 -D 显示磁盘总体信息 -p 显示指定磁盘分区统计信息 -s 显示内存相关统计信息及多种系统活动数量 -m 显示slabinfo -t 在输出信息的时候也将时间一并输出出来 -S 使用指定单位显示。参数有K,k,m,M,分别代表1000,1024,1000000,1048576字节(byte) delay 刷新时间间隔,如果不指定,只显示一条显示结果 count 刷新次数,如果不指定刷新次数,但指定了刷新时间间隔,这事刷新次数为无穷
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位秒,第二个参数是采样的次数:
各字段含义:
类别 选项 含义 说明 process r 等待执行的任务数 展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU个数,就会出现CPU瓶颈 B 等待IO的进程数量 Memory swpd 正在使用虚拟的内存大小,单位k 值大于0表示物理内存已经不足,需要考虑升级内存 free 空闲内存大小 指物理内存 buff 已用的buff大小,对块设备的读写进行缓冲 cache 已用的cache大小,文件系统的cache 指的是page cached内存大小 nact 非活跃内存大小,即被标明可回收的内存,区别于free和active 使用-a选项时显示 active 活跃的内存大小 使用-a选项时显示 Swap si 每秒从交换区写入内存的大小(单位:kb/s) 表示每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄漏了,要查找耗内存进程,解决掉 so 每秒从内存写到交换区的大小 表示内存进入磁盘,也就是由内存交换区进入内存的内存大小 IO bi 每秒读取的块数(读磁盘) 现linux版本快的大小为1024bytes bo 每秒写入的块数(写磁盘) 如果bi+bo的值过大,且wa值较大,则表示系统磁盘IO瓶颈 System in 每秒中断数,包括时钟中断 值越大,会看到由内核消耗的cpu时间会越多 cs 每秒上下文切换数 值越大,会看到由内核消耗的cpu时间会越多 CPU Us 用户进程执行消耗cpu时间(user time) us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了 Sy 修通进程消耗cpu时间 sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。一般来说us+sy应该小于80%,如果大于80%,说明可能存在CPU瓶颈 id 空闲时间(包括IO等待时间) wa 等待IO时间 wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈 注意:如果评估CPU,需要重点关注process项的r列的值和CPU项的us,sy,wa列的值
8.lsof命令:
lsof没有这个命令的话需要先安装,yum install -y lsof
lsof是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof输出信息的含义:在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存和各种文件,所以必须以root用户的身份运行它才能够充分地发挥其功能。
各字段含义:
COMMAND 进程的名称 PID 进程标识符 USER 进程所有者 FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd,txt等 TYPE 文件类型,如DIR,REG DEVICE 指定磁盘的名称 SIZE 文件的大小 NODE 索引节点(文件在磁盘上的标识) NAME 打开文件的确切名称
参数:
lsof abc.txt ➖➖➖🔊显示开启文件abc.txt的进程
lsof -c abc ➖➖➖🔊显示出以字母abc开头进程现在打开的文件
lsof -p 1234 ➖➖➖🔊列出进程号为1234的进程所打开的文件
lsof -g gname/gid ➖➖➖🔊显示归属gname或gid的进程情况
lsof- u uname/uid ➖➖➖🔊显示归属uname或uid的进程情况
lsof +d /usr/local/ ➖➖➖🔊显示目录下被进程开启的文件
lsof +D /usr/local/ ➖➖➖🔊同上,但是会搜索目录下的目录,时间较长
lsof -d 4 ➖➖➖🔊显示使用fd为4的进程
lsof -i➖➖➖🔊 用以显示符合条件的进程情况
lsof -i [46] [protocol] [@hostname|hostaddr] [:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的servicename(可以不止一个)
port --> 端口号(可以不止一个)
四.进程优先级
linux进程调度及多任务 :每个CPU(或CPU核心)在同一个时间点上只能处理一个进程,通过时间片技术,linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的印象。
相对优先级nice: 由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所用的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),但还有其他一些调度策略略用于不同的目的。SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值,可以有40种不同级别的nice值
nice值越高: 表示优先级越低,例如+19.该进程容易将CPU使用量让给其他进程
nice值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU
1.查看进程的nice级别:
1.使用top查看nice级别:
NI:实际nice级别
PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
2.使用ps查看nice级别:
TS表示该进程使用的调度策略为SCHED_OTHER
2.更改现有进程的nice级别:
1.使用top更改nice级别:
r调整进程的优先级(Nice Level)(-20高) — 0 — (19低)
2.使用shell更改nice级别:
用 renice 去更改
五./proc与/sys介绍
/proc正在运行的内核信息映射
主要输出:进程信息
内存资源信息
磁盘分区信息等等
/sys硬件设备的驱动程序信息
/proc文件系统
linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构,改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式访问系统内核数据的操作提供接口。
/proc下文件基本都是只读的,除了/proc/sys目录下,它是可写的(查看和修改内核的运行参数)
/proc下数字命令的目录就是对于PID的进程目录
/proc/cmdline 启动时传递给kernel的参数信息(就是bootargs信息) /proc/cpuinfo cpu的信息 /proc/crypto 内核使用的所有已安装的加密密码及细节 /proc/devices 已经加载的设备并分类 /proc/dma 已经注册使用的ISA DMA频道列表 /proc/execdomains linux 内核当前支持的execution domains /proc/fb 帧缓冲设备列表,包括数量和控制它的启动程序 /proc/filesystems 内核当前支持的文件系统类型 /proc/interrupts x86架构中的每个IRO中断数 /proc/iomem 每个物理设备当前在系统内存中的映射 /proc/ioports 一个设备的输入输出所使用的的注册端口范围 /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理 /proc/loadavg 根据过去一段时间内cpu和io的状态得出的负载状态,与uptime命令有关 /proc/locks 内核锁住的文件列表 /proc/mdstat 多硬盘,RAID配置信息 /proc/meminfo RAM使用的相关信息 /proc/misc 其他的主要设备(设备号为10)上注册的驱动 /proc/modules 所有加载到内核的模块列表 /proc/mounts 系统中使用的所有挂载 /proc/partitions 分区中的块分配信息 /proc/pci 系统中的pci设备列表 /proc/slabinfo 系统中所有活动的slab缓存信息 /proc/stat 所有的CPU活动信息 /proc/uptime 系统已经运行了多久 /proc/swaps 交换空间的使用情况 /proc/bus 系统总线信息,例如pci/usb等等 /proc/driver 驱动信息 /proc/fs 文件系统信息 /proc/ide ide设备信息 /proc/irq 中断请求设备信息 /proc/net 网卡设备信息 /proc/scsi scsi设备信息 /proc/tty tty设备信息 /proc/net/dev 显示网络适配器及统计信息 /proc/vmstat 虚拟内存统计信息 /proc/vmcore 内核panic时的内存映像 /proc/diskstats 取得磁盘信息 /proc/schedstat kernel调度器的统计信息 /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用 /proc目录中进程N的信息每一个进程中基本包含以下信息:
/proc/N/cmdline 进程启动命令 /proc/N/cwd 链接到进程当前工作目录 /proc/N/environ 进程环境变量列表 /proc/N/exe 链接到进程的执行命令文件 /proc/N/fd 包含进程相关的所有的文件描述符 /proc/N/maps 与进程相关的内存映射信息 /proc/N/mem 指代进程持有的内存,不可读 /proc/N/root 链接到进程的根目录 /proc/N/stat 进程的状态 /proc/N/statm 进程使用的内存的状态 /proc/N/status 进程状态信息,比stat/statm更具有可读性 /proc/N/self 链接到当前正在运行的进程
/sys文件系统
sysfs是一种基于ram文件系统和proc一样。Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。其实,就是在用户态可以通过对sys文件系统的访问,来看内核态的一些驱动或者设备等。
1./sys/devices(/sys文件系统最重要的目录结构)
该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platformdevices和systemdevices。platformdevices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;systemdevices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。
2./sys/dev
该目录下有字符设备(block)和块设备(char)两个子目录,里面全是以主次设备号(major:minor)命名的链接文件,链接到/sys/devices。
3./sys/class(按功能分类设备)
该目录下包含所有注册在kernel里面的设备类型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下是具体设备的符号链接,这些链接指向/sys/devices/…下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)
4./sys/block(从linux2.6.26版本开始已经移到了/sys/class/block)
代表着系统中当前被发现的所有块设备。按照功能来说防止在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了
CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。
5./sys/bus(按总线类型分类设备)
一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/…下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下是一些可以观察和修改的driver参数。(它也是构成linux统一设备模型的一部分)
6./sys/module
该目录包含所有被载入kernel的模块,无论这些模块是以内联方式编译到内核映像文件中还是编译为外模块(.ko文件)
7./sys/fs
该目录用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点
8./sys/kernel
该目录下存放的是内核中所有可调整的参数
9./sys/firmware
该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口
10./sys/power
该目录下有几个属性文件可以用于控制整个机器的电源状态,如向其中写入控制命令让机器关机/重启等等