程序:
文件,一般是二进制,静态 /usr/sbin/httpd,/usr/sbin/sshd
程序是二进制文件(面试题之一)
进程:
是程序运行的过程, 动态,有生命周期的,
可以产生和消亡的(进程是已启动的可执行程序的运行实例,实例即运行可执行程序)。
线程:
线程是进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程;
一个进程至少包括一个线程,通常将该线程称为主线程;
一个进程从主线程的执行开始,进而创建一个或多个附加线程,就是所谓基于多线程的多任务.
父进程:
程序运行时产生的第一个进程,任何进程都可以作为父进程创建子进程。
子进程:
由父进程使用fork()函数完全复制自己的地址空间创建出来的新的进程就是子进程,
子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,
以及程序代码,随后,子进程可能exec自己的程序代码。
poccess id: pid 进程号!
为父进程跟踪和安全性以及管理人员的控制和管理所需,
父进程会给子进程分配一个唯一的进程id,这个id就是pid
在多任务处理操作系统中,每个CPU(或每个核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU 时间和资源分配的要求会不断变化(进程不会持续的占用cpu,而是根据自己的需求来决定是否需要使用cpu时间),所以进程在运行的时候会有不同的状态,它随着环境要求而改变,具体的状态可以参考下图来看:
一个进程被父进程fork()衍生出来之后,会统一由内核进程调度程序来根据当前这个进程对于cpu的时间和资源的需求来进行调度,如果进程需要使用cpu,那么调度程序会根据当前进程的优先级来进行调度,从而通知进程什么时间会被cpu进行处理。此时进程会处于R状态
R-(running运行状态)
R状态包括两种情况:
1.第一种情况是正在排队等待cpu的处理处于Runnable状态
2.第二种情况是正在被cpu处理处于running状态;
进程在运行的时候可能由用户发出一个stop的状态,从而暂停到后台,这个时候进程就处于T状态;
T-(stop停止状态)
当然进程也可能不需要cpu处理或者是运算或者他本身是一个父进程,有子进程正在工作,这个的时候就会处于sleeping状态;
S-(sleeping睡眠状态)
当进程结束工作之后,会释放掉自己的各种资源,然后进入到Z状态,
Z-(zombie僵尸状态)
当父进程回收之后就会处于彻底终结的X状态
X-(彻底终结)
具体如图所示:
状态总结:
R状态:包含runnable和running,表示进程正在等待运行或者是正在cpu上运行
Sleeping: 包含S、D、K三种状态
S:可中断睡眠,进程在等待事件触发/接收到指定的信号(硬件请求/系统之间的访问)才会运行起来。
D:不可中断睡眠,不会接收或者是相应外界传来的信号,通常情况下正在进行I/O操作
K:和D的状态相同,但是可以被中断
Stopped:T状态,表示进程被停止,通常是由用户或者是其他进程发送的信号。
Zombie:包含X、Z两种状态
Z:除了pid之外,其他的资源都已经释放掉,给父进程发送退出信号之后进入到Z状态
X: 彻底退出状态
僵尸进程危害:
大量的僵尸进程会导致我们系统中没有可用的pid,导致系统出现问题。
僵尸进程如何产生?
1. 子进程结束运行后,父进程还在运行,这个时候所有的子进程就会进入僵尸状态,
少量的僵尸进程对系统危害不大,但是大量的僵尸进程会拖垮服务器。
命令1:
ps aux
命令2:
ps -elf
以ps aux为例
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 /usr/lib/systemd/systemd
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存,包括程序、代码、共享库等所有的
RSS: 占用实际内存 驻留内存
TTY: 进程运行的终端,?表示不依赖于任何的终端
STAT: 进程状态
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
Ss s进程的领导者,父进程
S< <优先级较高的进程
SN N优先级较低的进程
R+ +表示是前台的进程组
Sl 以线程的方式运行
START: 进程的启动时间
TIME: 进程占用CPU的总时间,单位是minute
COMMAND: 进程文件,进程名
PPID 父进程进程号
查看指定进程的pid
ps aux |grep 服务名
查看进程树
需要先下载一个软件包:yum install -y psmisc
举例:pstree apache (启动进程的用户名)
进程优先级使用nice值来表示
进程优先级: 0--------139 数值越小,优先级越高
高优先级进程: 获取cpu更多的执行时间 cpu优先执行
nice值: -20-----19
nice值设定:
rnice 值 pid
[root@localhost ~]# renice 0 9349
9349 (进程 ID) 旧优先级为 6,新优先级为 0
使用命令:top
第一部分:系统整体统计信息
top - 14:22:36 up 4:45, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 206 total, 2 running, 204 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.6%us, 0.7%sy, 0.0%ni, 96.8%id, 0.9%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4019424k total, 1327584k used, 2691840k free, 131012k buffers
Swap: 2047992k total, 0k used, 2047992k free, 650880k cached
load average: 0.23, 0.06, 0.02 1分钟,5分钟,15分钟之内系统的平均负载
us:用户占用的cpu的百分比
sy:内核占用的cpu的百分比
ni 改变过优先级的进程占用的cpu的百分比
id:cpu的空闲时间
wa:cpu的IO等待的时间
hi:硬中断占用的cpu的百分比
si:软中断
st:cpu被偷走的时间
第二部分:进程信息
命令
h或?获得帮助
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 对排序进行反转
f 自定义显示字段,调整字段顺序(选中正行上下箭头调整)
1 显示所有CPU的负载
W 保存top环境设置
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
df -Th:查看磁盘信息
free -m:查看内存信息
lscpu:查看CPU信息
作业控制是一个命令行功能,可以允许一个shell 能够同时运行多个进程,还可以实现进程管理,例如可以选择性暂停、恢复某些进程,让shell可以在子进程运行期间返回接受其他命令
进程前台、后台
前台:前台进程会占用当前终端,当前终端为该进程的控制终端,进程会接收键盘产生的输入信号
后台:后台进程没有控制终端,不需要终端的交互,不接收终端输入的信号
fg
调用& 前台 (单独使用fg命令,调用作业中有+作业)
bg
有前台执行的命令ctrl+z 挂起(stop),由bg调到后台运行状态
kill
杀死进程
pkill
批量杀死进程