一、Linux进程基础:
Linux程序:系统,用户,固件
程序运行,需要系统调用,然后缓存到内存中,然后被CPU处理。整个过程称为执行任务
程序:
一组指令以及参数集合,按照相应的逻辑控制计算机完成特定的任务。(文件,由一组指定参数集合起来的,完成相应任务。)特点:静态的、封闭的。
程序运行产生多个进程。
进程:
运行的程序,是一个动态的过程。是操作系统的基本单位,有生命周期,有状态的。具有并发性(一个程序对应多个进程),交互性(一个进程可派生多个子进程)。
操作系统以进程为单位分配系统资源。
每一个进程运行是独立的
具有独立的地址空间,运行状态
多个程序同时运行,每一个程序就是一个进程
线程:
一个进程中可有多个线程,每一个线程只能被一个进程所拥有。(线程把整个任务完成之后,才能运行,即任务每一个线程可以被不同的进程运行,但运行结果需要整合到一起才能被使用)
线程不能独立运行,线程的运行由进程决定。
程序运行起来可以对他进行交互操作。(每一个Linux线程或者Linux进程都有一个独立的资源集,资源集中有:CPU资源、内存资源、I/O资源等),入口、序列、出口。
1、进程的生命周期:
等待状态------就绪状态-------运行状态--------阻塞状态------休眠状态-------死亡状态
sleeping:睡眠状态
stopping:停止状态
running:运行状态
zombie:僵死状态
这些状态是实时变化的
[root@localhost ~]# ping 192.168.239.200 > /dev/null 2>&1 &
[1] 8256
[root@localhost ~]# ls
//将ping的结果输出重定向到/dev/null 中,并将其扔至后台,还可以继续执行命令
2、父进程和子进程:
父进程在运行过程中,产生子进程。子进程继承父进程所有资源和权限,并运行自己的程序(通过调用 exec 方法运行)。子进程运行过程中父进程处于休眠状态,只有子进程运行结束,父进程才再次运行。
父进程可以产生多个子进程,当一个子进程完成后父进程进入执行状态,然后再进入休眠状态(只要有一个子进程完成任务,父进程就会苏醒一次)。父进程产生的子进程还可以产生自己的子进程。
3、僵尸进程:
一个父进程产生了一个子进程,子进程A又产生了自己的子进程B,当子进程A运行结束后,父进程从休眠状态进入执行状态,此时子进程A产生的子进程B将会处于僵尸状态,被系统定期清理掉。
【扩充】
1.操作系统:自下而上结构
硬件,内核(内核文件,内核模块,驱动程序),固件(芯片+程序),应用(应用程序)
应用(应用程序)
|
内核(内核文件,内核模块,驱动程序)
| 固件(芯片+程序)
硬件
二、Linux进程管理工具:
pstree:进程树,查看进程间的关系------>父进程、子进程
-p:显示进程号,PID
-u:显示用户
-A:各进程树之间的连接以ASCII码字符来连接
-U:各进程树之间的连接以 utf8 字符来连接,某些终端可能会有错误
注:子进程的端口号大于父进程的端口号。
[root@localhost ~]# yum install psmisc
//CentOS7上没有pstree命令
[root@localhost ~]# pstree
init─┬─atd
├─auditd───{auditd}
├─console-kit-dae───63*[{console-kit-da}]
├─crond
├─dbus-daemon───{dbus-daemon}
├─login───bash
├─master─┬─pickup
│ └─qmgr
├─5*[mingetty]
├─rsyslogd───3*[{rsyslogd}]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───sftp-server
└─udevd
ps:查看进程
-a:显示所有进程
-A:显示所有进程,与 -e 效果相同
-u:显示以用户为主的进程
-x:和 -au 一起使用,显示完整信息
-l:显示更完整信息
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 7221 7211 0 80 0 - 28860 do_wai pts/0 00:00:00 bash
F:标志类型;代表这个程序的旗标(flag),4代表使用者为superuser;
S:进程状态
UID:代表执行者身份
PID:进程的ID号
PPID:父进程的ID
C:CPU使用的资源百分比
PRI:指进程的执行优先权,其值越小越早被执行
NI:这个进程的nice值,其表示进程可被执行的优先级的修正数值
ADDR:地址内核函数,指出该程序在内存的那个部分。如果是个执行的程序,一般就是[-]
SZ:使用掉的内存大小
WCHAN:目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY:登入者的经端机位置
TIME:使用掉的CPU时间
CMD:所下达的指令名称
[root@localhost ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.3 0.6 127996 6540 ? Ss 23:10 0:03 /usr/lib/syste
USER:该进程属于哪个使用者账号
PID:该进程的进程ID号。
%CPU:该进程使用掉的CPU资源百分比
%MEM:该进程所占用的物理内存百分比
VSZ:该进程使用掉的虚拟内存量(kbytes)
RSS:该进程占用的固定的内存量(Kbytes)
TTY:该进程是在那个终端机上面运作,若与终端机无关,则显示?。另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连按进主机的程序,
STAT:该程序目前的状态,主要的状态有:
R:该程序目前正在运作,或者是可被运作;
S:该程序目前正在睡眠当中,但可被某些讯号唤醒
T:该程序目前正在侦测或者是停止了
Z:该进程应该已经终止,但是其父进程却无法正常的终止他,造成僵尸程序的状态
START:该进程被触发启动的时间
TIME:该进程实际使用CPU运作的时间
COMMAND:该程序的实际指令
pgrep:查看正在调度的进程信息,包括进程是否已经消亡
pgrep通过匹配其程序名,找到匹配的进程;通常与kill命令一起使用。
-l 进程名:显示进程名和PID
-o:匹配多个进程时,显示进程号最小的那个
-n:匹配多个进程时,显示进程号最大的那个
注:进程号越大,并不意味着进程的启动时间越晚
[root@localhost ~]# pgrep ssh
6988
7271
7275
//默认只显示PID
[root@localhost ~]# pgrep -l httpd
7521 httpd
7522 httpd
7523 httpd
7524 httpd
7525 httpd
7526 httpd
//显示所有父、子进程的PID和进程名称
[root@localhost ~]# pgrep -o httpd
7521
//显示httpd进程号最小的那个
[root@localhost ~]# pgrep -n httpd
7526
//显示httpd进程号最大的那个(父进程)
kill killall pkill:杀死进程
格式:kill 选项 PID
-l:列出已知信号名称
-a:当处理当前进程时,不限制命令名和进程号的对应关系
-u:指定用户
-w:等待进程死亡
[root@localhost ~]# kill -l
1) HUP //终端断线
2) INT //中断(同Ctrl+C)
3) QUIT //退出(同Ctrl+\)
9) KILL //强制终止
15) TERM //终止
18) CONT //继续
19) STOP //暂停(同Ctrl+z)
-9:直接强制杀死进程
-0:只看进程状态,不杀死进程
[root@localhost ~]# killall -0 httpd
[root@localhost ~]# echo $?
0
//-0:只看进程状态,不杀死进程;用来判断进程是否启动
htop:用来监控软件
默认支持图形界面的鼠标操作;
可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行;
杀进程时不需要输入进程号。
要使用htop,需要先安装epel 包:
[root@localhost yum.repos.d]# mv yum.repo bak
[root@localhost yum.repos.d]# ls
bak CentOS-Base.repo
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# mount /dev/sr0 /media
[root@localhost yum.repos.d]# yum list |grep epel
epel-release.noarch 7-11 extras
[root@localhost yum.repos.d]# yum install epel-release -y
[root@localhost yum.repos.d]# yum install htop -y
vmstat:按照时间间隔显示服务器状态。
-V:显示 vmstat 版本信息
-n:只在开始时显示一次各字段名称
-a:显示活跃和非活跃内存
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 3848 72240 36 266396 0 0 40 27 43 62 1 1 99 0 0
procs:显示进程数
r:等待执行的任务数
b:等待的进程数
memory:(以 KB 为单位)
swpd:虚拟内存或交换内存的数量
free:可用物理内存的数量
buff:用作缓冲区的内存数量
cache:用作缓存的物理内存数量
swap:显示交换分区的活动(以 KB 为单位)
si:将内存从磁盘交换回物理 RAM 的速率(当si数字显示不为零,说明内存不足,启用swap分区了。)
so:将内存从物理 RAM 交换到磁盘的速率
io:显示输入输出活动(以块/秒为单位)
bi:系统向块设备发送数据的速率
bo 系统从块设备中读取数据的速率
system:显示系统相关活动
in:每秒钟中断的进程数
cs:每秒钟上下文切换的次数
CPU:显示CPU负载的信息
us:用户进程执行程序消耗的时间
id:空闲时间(包括等待时间)
wa:等待io时间
st:系统等待时间
三、程序优先级:0 - 139
1、优先级划分:
【0-139】:数字越小,优先级越高
有效的实时优先级:0 - 99
非有效实时优先级:【100 - 139】;
静态优先级(nice值:(-20)- 19 ; nice值越小,优先级越高,默认是0,0表示不做任何调整。它是对100-139段进行调整)
2、相对优先级 nice 值调整:
top:进程优先级查看和调整nice值
PR = 静态优先级 - 100(rt是负的静态优先级)
NI:是 nice 值,(-20) - 19
PRI:静态优先级 - 40
调整优先级:输入 字母 r-------Enter键-----输入pid号-----输入要改为多少(范围是nice的范围,超出按nice的最大和最小值计算)
[root@localhost ~]# ps axo pid,command,nice --sort=-nice
PID COMMAND NI
31 [ksmd] 5
1 /usr/lib/systemd/systemd -- 0
//使用ps查看nice级别
[root@localhost ~]# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 48393 ep_pol ? 00:00:05 systemd
renice:修改子进程(PPID)的nice值
[root@localhost ~]# renice 10 7708
7708 (process ID) old priority 0, new priority 10
htop:
F7(nice-);F8(nice+)
四、Linux作业控制
1、进程与作业的区别:
区别:进程时一个程序在一个数据集上的一次执行,而作业是用户提供给系统的一个任务。
联系:一个作业通常包括几个进程,几个进程共同完成一个任务,即作业。
2、作业:
一个前台只能运行一个进程组或一个作业,而一个后台可以运行多个进程组或者多个作业。
3、作业控制
一个前台作业由多个进程完成,一个后台作业由多个进程完成。shell一次可以同时运行多个作业,包括前台作业和后台作业,这称为作业控制。
4、命令
egrep ===== grep -E
[root@localhost ~]# ps -ef |grep -E "ping|sleep"
&:将输出结果放到后台
jobs:查看后台作业;与终端有关系,不同终端上的作业要在对应终端上查看 。
[root@localhost ~]# jobs
[2]+ Running ping www.baidu.com > /dev/null 2>&1 &
fg %job编号:将作业从后端提到前端
(Ctrl+c:将进程杀死)
[root@localhost ~]# fg &2
ping www.baidu.com > /dev/null 2>&1
//百分号%可以不写
bg %job编号:当一个作业处于挂起状态,用 bg 命令可以让作业再次运行起来
(Ctrl+z:让进程处于挂起状态)
[root@localhost ~]# ping 192.168.239.200 >/dev/null 2>&1
^Z
[6]+ Stopped ping 192.168.239.200 > /dev/null 2>&1
(Ctr+z:让进程6挂起)
[root@localhost ~]# jobs
[3] Running ping www.baidu.com > /dev/null 2>&1 &
[6]+ Stopped ping 192.168.239.200 > /dev/null 2>&1
(查看其是挂起状态:stopping)
[root@localhost ~]# bg 6
[6]+ ping 192.168.239.200 > /dev/null 2>&1 &
[root@localhost ~]# jobs
[3] Running ping www.baidu.com > /dev/null 2>&1 &
[6]+ Running ping 192.168.239.200 > /dev/null 2>&1 &
kill %job编号:让进程先停止后杀死
ping 192.168.239.200 &:已经在后台运行,在前台输出结果;不影响前台作业执行(可以执行jobs和kill)。
[root@localhost ~]# kill %4
[root@localhost ~]# jobs
[3] Running ping www.baidu.com > /dev/null 2>&1 &
[4] Terminated ping 192.168.239.200 > /dev/null 2>&1
[5]- Running ping 192.168.239.200 > /dev/null 2>&1 &
[6]+ Running ping 192.168.239.200 > /dev/null 2>&1 &
(进程挂起)
[root@localhost ~]# kill %4
-bash: kill: %4: no such job
(进程被删除)
五、Linux系统结构
1、在x86平台的CPU是如何执行内核程序和用户程序?
ring从里到外依次为:ring0,ring1,ring2,ring3;从里到外越来越低级
ring0:与硬件相关或与硬件寄存器,总线控制相关的程序----------(内核程序)
ring1 - ring2:驱动程序或者与虚拟化相关的程序。
ring3:用户态的程序
2、系统结构:(从里到外)
计算机底层资源(CPU、内存、硬盘)----负载、使用率
|
内核
|
命令解释器 shell
|
用户控件
3、/proc文件夹:正在运行的内核信息映射
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
/proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)。
/proc下数字命令的目录就是对于PID的进程目录。
(1)PID是不是文件? 是,/proc中
(2)资源使用情况是否以文件形式存放? 是,/proc中
(3)分区情况是否存放在文件中? 是,/proc中
(4)驱动程序的一切信息? 是,/sys中
[root@localhost proc]# cat meminfo
//内存信息,与 free -m 效果一样
[root@localhost proc]# cat cpuinfo
//CPU信息
[root@localhost proc]# cat mounts
//磁盘挂载信息
[root@localhost proc]# cat swaps
//查看磁盘分区信息
[root@localhost proc]# cd /proc/sys
[root@localhost sys]# ls
//与系统相关的
[root@localhost sys]# cd kernel/
//与内核相关
[root@localhost proc]# cd /sys
//内核驱动相关
[root@localhost sys]# cd power/
//电源相关
[root@localhost sys]# cd module/
//模块
[root@localhost sys]# cd kernel/
//内核中可调整的参数
[root@localhost sys]# cd hypervisor/
//虚拟化相关的模块
[root@localhost sys]# cd fs
//系统模块
[root@localhost sys]# cd firmware/
//对固件对象
4、/sys文件夹:硬件设备的驱动程序信息
[root@localhost sys]# cd devices/
// 是/sys文件系统最重要的目录结构
[root@localhost sys]# cd dev
//含有字符设备和块设备两个子目录,里面全是以主次设备号命名的链接文件
[root@localhost sys]# cd class/
//按功能设备分类
[root@localhost sys]# cd bus/
//按照总线类型分类设备