第一、基础知识
MBR引导--内核--内核程序--》协调其它程序
一般内核运行在硬件之上,各应用也在硬件之前
1)OS的基本功能:文件系统、网络功能、进程管理、内存管理、驱动程序、安全功能
以上为通用目的设置的程序。,
程序=指令+数据,
程序运行在内存当中。这个内存由物理内存映射逻辑空间
左则表示二个框分别表示指令和数据。物理内存划分固定大小的页框称为pageframe。
右则下面的方框表示物理内存。每个进程在右则上面的方框中,这部分为假的内存
空间称为线性地址空间。
2)CPU指令: 四个级别ring0,ring1,ring2,ring3
ring0特权敏感指使,ring3环境中为普通指令加减乘除等
控制内存及磁盘数据读取的为特权指令。
特权指令 :
普通指令
3)程序执行环境:
内核模式:运行内核级指令
用户模式:运行普通指令
4)应用程序:
运行在内核代码或应用程序代码
运行普通指令:直接运行于CPU
运行特权指令:通过system call
5)内存:8bits, 1byte
32bit巡址空间s, 2^32, 0-2^32-1, 2^10*2^10*2^10*2^2 bytes =
2^10*2^10*2^2 kilo bytes = 2^10*2^2 MB = 4GB
64bits, 2^64, 4billions 4G
32位 4G: 1G, kernel ,每个应用程序假设自己拥有线性地址空间为4G地址空间
可用,包括自己以及系统内核。1G内核使用,3G为线性地址空间使用。
3G, app
6)ROM+RAM
ROM, RAM
7)地址空间:
物理地址空间
线性地址空间
8)IPC: Inter Process Communication
同一主机:
signal
semerphor
shm (shared memory)
不同主机:
rpc: remote procedure call
socket:
9) 进程调度:
进程运行程序,是程序的一部分
多任务:多进程同时运行
抢占式多任务
10)进程分类:
CPU bound: CPU密集型 (类似高清视频)
I/O bound: IO密集型(编辑器等,频繁IO操作)
11)进程优先级:
140:0-139
1-99:实时优先级,数字越大优先级越高
100-139:数字越小,优先级越高;
静态优先级 (进程运行时默认自己拥有优先级)
动态优先级(进程运行时平衡优先级)
Linux准备140队列,0优先级在0队列中,1优先级在1队列中
以此类推。当运行时从队列首部开始,选择优先级高的运行。如下图:
每个进程运行的时间不同。Linux支持抢占式多任务,当一个
低先级的程序在运行,这时有一个高优先级的运行。过一段时间后
这里高优先级优先,提前运行。
算法时间复杂度:Big O (衡量标准算法)
O(1) 恒定的,无论优先级,消耗时间相同;(最好的)
O(logn) 每次调度,调度程序需要从树中找出优先级最高的进程
O(n) 线性的
O(n^2) 抛物线机制
O(2^n) 随队列深度增长
12)进程创建:
请求发出者:进程 (由fork进行创建,为系统调用)
任何子进程parent—>为子进行发起一个fork调用—>child
这里child(task struct)与父进行相同。包括进程ID,父进程ID
进程:fork(), clone()
两者的虚拟空间不同,但其对应的物理空间是同一个
示例:父进程P1创建P2子程序,
复制P1的正文段,数据段,堆,栈这四个部分让P2的正文段指向P1的正文
段块,数据段->P2自己的数据段块(为其分配对应的块),堆->P2自己
的堆块,栈->P2自己的栈块。如下图所示:同左到右大的方向箭头表示
复制内容
COW: Copy On Writing 写时复制
内核只为新生成的子进程创建虚拟空间结构,它们来复制于父进程的虚拟
究竟结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,
当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。
关闭进行调用destroy(销毁某个进行
13)进程的状态:
运行态:running
睡眠态:sleeping
可中断睡眠:interruptible (中断过程中时可随时唤醒)
不可中断睡眠: uninterruptible (被IO阻塞的进程)
就绪态:runnable
停止态:stopped,不可被调度为运行状态;
僵死态:zombie
(父进程处理子进程关闭后的状态,如父进程意外关闭后,子进程
处于孤立的状态。这时当子进程停止后为僵死进程)。当父进程关闭
前后利用init ,systemd(centos 7)进程指定为子进程新的父进程。
14)进程管理:
task struct: 用于保存每个进程元数据信息
例如:pid, ppid, memory, thread, files
task list: 用一种称作“链表”的数据结构来保存每个进程的task struct.
进程退出前会将其状态和结果保存到自己的自己的task struct中,下次运行中
直接从tasks struct,这种称为挂起状态
进程切换:context switch
保存现场:
恢复现场:
OS: 提供虚拟的计算机,进而能够将有限资源借助于“保护”机制分配多个
同时运行的程序,即“进程”使用,从而实现了所谓的多任务;
15) 并行处理机制
现代编程采用多线程模型,每个线程单独的功能。单独的执行流
进程: 方块中代表4个内核,4条线条件4个单独线程。并行执行。
该种方式运行在程序独立、相互干扰少的情况下。
线程:tread
共享进程的资源,如父进程、打开文件等;
更轻量的、可被单独调度的运行单元;
LWP:Light Weight Process(Linux是轻量级处理过程,
Linux是线程即进程,进程即线程)
第二、进程命令
Linux进程查看及管理工具:top, pstree, ps, pidof, pgrep, pkill, htop,
glances, pmap, vmstat, dstat, iostat, sar, kill, job, bg, fg
Linux系统上除init以外的所有子进程,都是由其父进程fork()自身而来,
遵循COW机制;进程展现为“进程树”;
1) pstree命令:
进程树查看;
-p: 显示各进程的PID;
centps 7父为systemd centos 6为init
pstree –p 显示进程及id
2)ps: process state
显示的是ps命令执行时,系统上当前进程状态信息的快照 为静态结果;
Linux运行中的内核的相关信息是通过/proc伪文件系统输出的;各进程
都有一个以其PID命名的子目录,每个子目录中有许多文件存储了进程的
相关状态信息;
proc目录下包括进程ID的目录(为正在运行的进程创建该目录)说其
是伪文件系统是因为它是一个映射。每个目录下都包括相应的文件。
ps相关命令都是调用该目录下的相关文件。
支持众多选项:
BSD风格 (不需要减号 -
SysV风格 (需要都减号 - 引用)
根据进程启动时是否是通过终端上的用户接×××互式启动的,进程可分为两类:
与终端相关的进程: a
与终端无关的进程: x
以用户为中心组织进程状态信息显示:u
AA:常用选项组合1:axu (在centos 7中可用-aux或aux 结果相同)
命令解释:与用户终端相关或无关的进程。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER表示进程的属主,那个身份在运行。
pid为进程号
%CPU CPU比例
%MEM 内存百分比
VSZ: Virtual memory Size 线性地址空间占用的空间大小;
RSS:常用驻内存集;指不可以被交换至swap空间的数据占据空间大小;
tty 终端:那个终端启动的此进程 ?表示不知道那个
STAT:进程状态
R: running,运行状态;
S:interruptible sleeping,可中断睡眠
D:uniterruptible sleeping, 不可中断睡眠
T: stopped
Z: zombie
s: session leader (一般为执行命令的bash)
+: 前台进程,占据着某终端
l: 多线程进程
<:>
N: 低优先级进程
START: 启动时间
TIME: 占据CPU累积时长
COMMAND: 启动当前进程或线程的命令行程序,[]表示为内核线程;
BB:常用选项组合2: -ef -e: 显示所有进程; (相当前aux)
-f: 显示丰富格式信息fullformat
CC:常用选项组合3:-eFH
-F: 显示额外信息
-H: 以层级形式显示进程间关系;
DD:自定义需要显示的信息:
axo (a代表与终端相关 ,x与终端无关,o可选项)
ps axo pid,command,psr,pri,ni
psr: 当前进程运行的CPU编号;
pri: 当前进程的优先级;
ni: 当前进程的nice值(与进程调整相关)
-20, 19
ppid代表父进程
3)pgrep: 用于过程进程
语法格式:pgrep [OPTIONS] "PATTERN"
-U UID:仅显示以指定用户身份运行的进程;
-G GID
-l: 显示PID和进程名;
示例:显示postfix的用户进程号和名称
4)pidof:
pidof PROGRAM
PROGRAM: 给定命令行程序
显示与程序sshd相关进程id信息
5)top命令:
第1)-4)为静态状态命令,后为动态命令(定时刷新)
有许多交互式的子命令;
第一行top:显示当前系统负载信息。与uptime执行结果相同
说明:启动时间 运行时长 当前登陆用户数量 过去负载状态
0.00,0.001,0.05 代表过1分钟、5分钟、15分钟的负载)
(以上并不是CPU资源的百分比,是队列的长度:多个队列等
待运行)
第二行:tasks:
说明:多个个进程 运行数量 sleeping数量 stop数量 僵死态数量
第三行: CPU百分比
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
us: user space
sy: system (kernel space)
ni: nice
id: idle
wa: wait io 等待IO的百分比
hi: hardware interrupt
si: software interrupt
st: stolen, 被虚拟机“偷走”的百分比
1:平均或单独显示CPU的负载状态;
第四行:内存
KiB Mem : 1877664 total, 1150304 free, 351380 used, 375980 buff/cache
总物理内存 剩余内存 使用的 buffer内存
第五行:交换swap
KiB Swap: 5242876 total, 5242876 free, 0 used. 1337264 avail Mem
交换内存所有空间 空闲空间 已用空间 可用空间
第五行:
pid 用户 优先级 nice值 虚拟内存级 常驻内存级 共享内存 状态
占CPU百分比,占内存百分比 ,累计运行时间,启动运行的命令
显示排序黑CPU百分比进行(默认)
P:以占据的CPU百分比大小排序;
M:以占据Memory空间大小排序;
T:CPU累积占用时间排序;
l: 是否显示系统负载行;(第一行)
队列长度的合理区间:CPU颗数*0.7
t: 是否显示进程摘要信息及CPU负载状态;
m: 是否显示内存相关的状态信息;
s: 修改延迟时长
k: 终止指定进程
q: 退出命令
s: 修改延迟时长
k: 终止指定进程
top命令的选项:
-b: batch,批次显示
-n #: 显示的批次数量
示例:top –b –n 2 显示二批
-d #: 指明延迟时长
示例:top –d 1 表示1秒刷新一次
6)uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;
命令总结:pstree, ps, pgrep, top, uptime, pidof
7)htop:
需要在epel源当中安装
在/etc/yum.repos.d目录下创建epel.repo文件
内容如下:
利用yum install htop进行安装
交互式命令:
u: 过滤仅显示选定用户的进程;(先U再选择用户)
s: 跟踪选定的进程所发起的系统调用;
l: 显示选定进程所打开的文件;
t: 显示进程的层次结构;
a: 设定进程的cpu亲缘性;(将选定的进程绑定在指定的CPU上)
选项:
-d #: 延迟时长
-u USERNAME: 仅显示指定用户的进程;
-s COLUMN: 根据指定的字段进行排序;
8)vmstat命令: 状态查看
用法:vmsate [delay [count]] 每隔2秒,显示6次退出
procs: 进程相关状态
r: 运行队列的长度:有数字时等待运行的进程的个数;(队列长度)
b:阻塞队列长度:有数字是表示处理不可中断睡眠状态的进程的个数;
(即IO阻塞队列长度) 单个CPU core 不能大于3基本正常
memory:
swpd: 交换内存使用量;
free: 空间的物理内存量;
buffer: 用于buffer的内存总量;
cache: 用于cache的内存总量;
swap:
si: 数据进入swap中的速率(kb/s) 物理放到交换内存
so: 数据离开swap的速率(kb/s) 交换内存至物理内存
io
bi: 从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率(kb/s)
system
in: 中断速率
cs: 进程切换的速率
cpu
us: eser space
sy: system sy高说明程序有问题,太多系统调用
id: idle
wa: waitting wait过高表示磁盘速率慢
st: steal
选项:
-s:显示内存的状态统计数据
9)/proc/#接口: (针对proc目录相应进程号下面的文件)
10)pmap: 查看指定进程的内存映射关系;
pmap [OPTIONS] pid...
-x: 显示扩展信息
也可通过cat /proc/#/maps 查看
11)glances: (需要epel源)
使用python开发
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port]
[-P password] [--password] [-t refresh] [-f file] [-o output]
常用选项:
-b: 以Byte/s为单位显示网卡设备数据交换速率;
-d: 关闭磁盘I/O功能模块;
-f /PATH/TO/SOMEFILE:设置输出文件的位置及格式;
-o {HTML|CSV}:
-m: 关闭mount功能模块
-n: 关闭网络功能模块
-r: 关闭进程列表功能模块
-t #: 指定延迟时长,默认为3秒;
-1:单独显示每颗CPU相关负载数据信息;
glances支持远程模式:
即可以以C/S模式工作:
Server: 以监听模式启动glances;
Client: 以远程模式启动glances,远程连入指定服务器,并Server上的相关性能数据;
服务模式:
glances -s -B IPADDR
-B: 用于指明监听的本地地址;
客户端模式:
glances -c IPADDR
-c: 用于连入的服务器的地址;
12)dstat: 整合了vmstat, iostat, netstat and ifstat四款工具的功能;
dstat [-afv] [options..] [delay [count]]
示例 dstat 2 5 #每2秒刷新 显示5次,第6次退出
sysmte下面的 int 是中断 csw指切换上下文
-c: 显示cpu性能指标相关的统计数据;
-d: 显示disk相关的速率数据;
-g: 显示page相关的速率数据;
-i: 显示interrupt相关的速率数据;
-l: 显示load average相关的统计数据;
-m: 显示memory相关的统计数据;
-n: 显示网络收发数据的速率;
-p: 显示进程相关的统计数据,
-r: io请求的速率;
-s: 显示swap的相关数据
-y: 显示系统相关的数据,包括中断和进程切换;
--top-cpu:显示最占用CPU的进程;
--top-bio:显示最消耗block io的进程;
--top-io:最占用io的进程;
--top-mem:显示最占用内存的进程;
--ipc: 显示进程间通信相关的速率数据;
--raw: 显示raw套接的相关的数据;
--tcp: 显示tcp套接字的相关数据;
--udp: 显示udp套接字的相关数据;
--unix: 显示unix sock接口相关的统计数据;
--socket:
-a: -cdngy
IPC: 进程间通信
常见形式:
msg( message queue) (消息队列)
sem( semerphore) (旗语,很短小的消息)
shm(shared memory) (共享内存)
signal (标签)
13) signal: 传递给进程的短小信息
Linux主机支持的进程间可用到的信息:
(1) kill -l
(2) man 7 signal
向进程发信号:
kill [-SIGNAL] PID
默认的信号为SIGTERM;
信号表示方式:
(1) 完整名称,例如SIGINT
(2) 简写名称,例如INT
(3) 数据代称,例如2
常用信号:
SIGHUP: 1, 通知进程重读其配置文件以让新的配置生效,但不用重新启动进程;
SIGINT:2, 打断正在运行中的进程,相当于键盘组合键Ctrl+c
SIGKILL:9, 强行中止正在运行中的进程
SIGTERM: 15, 安全中止正在运行中的进程
SIGSTOP: 19, 暂停进程
SIGCONT: 18, 继续运行指定进程
kill相似的一组进程:
killall [-SIGNAL] PROGRAM
示例:启用httpd service httpd start
查看http的进程号,kill默认是15(安装终止正在运行的进程)
示例:利用数字 kill –9 进程号
示例:kill httpd
命令总结:htop, vmstat, glances, dstat, kill, killall
第三、作业管理:
1)定义
作业是定义的一组具有相同功能的一组进程或程序,称为作业。
通过是否通过终端启动分为
前台作业:通过终端启动,并且在停止之前也会一直占据终端;
后台作业:作业启动之时与终端无关,或者是在前台启动,但启动后转为
与终端无关模式运行; (不是所有命令适合在终端上运行)
如何让作业运行于后台?
1、对于已经启动并处于运行中的作业:
Ctrl+z
Note: 作业被送往后台后,默认处于stopped状态;
示例:运行后使用htop命令,control+z后为stop状态
2、对于尚未启动的作业:
COMMAND &
示例: vmstat 1 & 将送到后台
注意: 此两类方式相关作业,仍然与终端相关;这意味着,终端终止,将会导
致与此终端相关的所有作业被终止; 与session leader分离
剥离进程与终端的关系:
# nohup COMMAND &
3、守护进程:自动运行在后台
作业查看:
jobs命令
作业号、作业状态、启动命令行程序
作业控制命令:
fg [[%]job_num]:把指定的作业调回前台; 示例:fg %2 表示调后2号作业。或%百分号也可
bg [[%]job_num]:把调往后台的指定的作业启动起来,让其后台默默运行;
但此作业必须支持运行于后台;
kill [%job_num]:终止指定的作业; kill的作业号的百分号%i不能够省略。
4、 进程优先级调整:
AA定义:
优先级级别从0-139 1-99为实时优先级 数字越大优先级越高。
100-139为静态优先级:数字越小优先级越高
内核针对静态优先级进行调整
动态优先级:动态调整
静态优先级:
BB:手动调整优先级,利用nice值
调整时只能够调大nice值
通过指定进程的nice值来调整其优先级;用户 空间运行的进程一般都有其nice值;
nice值: -20, 19
优先级: 100, 139
默认启动进程时,其nice值为0, 其优先级为120;
(1) 对于尚未启动的进程:
# nice -n N COMMAND
(2) 对于已经启动并处于运行中的进程:
# renice -n N PID
示例:ps axo pid,command,pri,ni(查看进程号、名称、nice、优先级)
nice -n -5 httpd 调整nice值为-5,输出为
针对已运行的使用renice
注意:普通用户仅能够调大nice,调低优先级;
第四:其它命令整理
1)sar :收集、报告用户信息
sar [ options ] [ [ ] ]
Options:
-B 所有page信息
-A 所有信息相当于
-b io速率
示例: sar -u 2 5 CPU利用率
sar -r -n DEV -f /var/log/sa/sa16
显示内存及网络并保存到/var/log/sa/sa16目录
2) iostat,
显示CPU、device及分区信息
iostat [ options ] [ [ ] ]
Options:
-c 显示 CPU -d 显示设备
示例:iostat 2 5
示例:iostat –c / iostat –d
3)ifstat
显示网络接口信息
ifstat [OPTION] [ PATTERN [ PATTERN ] ]
-e erros错误信息
-r reset
示例:
4) tsar;
作业:
命令总结:jobs, fg, bg, nice, renice
博客作业:进程管理工具htop/glances/dstat的使用;