操作系统的组成
image.png程序员写程序可以实现库调用和系统调用来实现。调用库或者系统,其实就是调用一个已经写好的功能
应用程序调用的过程(系统调用为例)
image.png执行用户代码,用户空间模式。一旦发起系统调用,执行内核代码就是在内核模式下
内核的功用: 进程管理,文件系统,网络功能,内存管理,驱动程序,安全功能
进程管理
进程:运行的程序一个副本
linux内核存储固定进程的信息在task struct里面
内存中存在多个进行task结构体,要调用多个进程,每个进程都有一小段空间指向下一个结构体的链,而最后一个结构体,又指向第一结构体
多任务的task struct组成的链表:task list
内核初始化完,创建init进程,后续的进程都是init创建的
进程是父子关系,每一个进程,都由父进程创建,都由fork() 内核调用的接口,向内核请求创建进程。每个进程都由父进程调用fork()启动而来,而后fork()后调用clone()接口,复制自己的数据给子进程
进程优先级
0-139
0-99:实时优先级,数字越大,优先级越高
100-139: 静态优先级,数字越小,优先级越高
NICE值
-20-19 分别对应 100-139
linux内核分为140个队列,等待运行的程序分别放到140个队列里面,当程序运行时,内核扫描队列首部,运行优先级最高程序。还有另外一个140个过期队列,存放已经运行过的处于同一优先级的程序,过期队列等待运行队列的程序运行完毕后,过期队列与运行队列对调
进程内存
page Frame:页框,用于存储页面数据。存储page。可以是不连续的
page:进程中用到的内存页,是连续的
每个进程都认为只有自己和内核两个程序
进程间通信
IPC: inter process communication
同一主机上:
signal 信号
shm: share memory 共享内存
sememphor 旗语
** 不同主机**
rpc: remote procevure all 远程过程调用
socket:
linux内核:抢占式多任务
进程类型
守护进程: daemon在系统引导过程中,启动的进程
前台进程/用户进程: 用户通过终端打开进程
注:也可把前台送往后台,已守护模式运行
进程状态
运行态: running
就绪态:ready 可以运行,但没有运行(睡眠态)
可中断:interruptable 可以立即运行
不可中断:uninterrupdate 无法运行
进程需要指令加数据,进程启动了,需要加载文件(把文件从磁盘装入内存中),文件很大需要等待。等待过程中需要把cpu让出来,此时数据还没有加载完成,叫醒此进程也无用。此为不可中断状态。等待数据加载完了,就可以叫醒了,此为可中断睡眠
image.png
内核也是进程,有自己的专有内存
停止态: stopped 暂定于内存,但不会调度,除非手动启动 crtl+z
僵尸态: zombie
子进程运行着,父进程挂了。子进程变成孤儿进程,此时孤儿进程结束了,没人处理。子进程也就变成了僵死状态。因此父进程在终结前,应为子进程找到新的父进程或者移交给init进程
进程分类
CPU-Bound: CPU密集型,消耗cpu多,多分cpu
IO-Bound: IO密集型,消耗IO多,调高优先级
linux系统上进程管理工具
pstree
进程树查看
ps
/proc/:内核中的状态信息
内核参数:可以设置从而调整内核/proc/sys运行特性的参数
状态变量:用户输出内核中的统计信息,仅用于查看
进程:/proc/pid/* 保存当前进程的相关状态
ps 查看 /proc/ 下面进程状态
启动进程方式:
系统启动过程中自启动: 与子终端无关的进程
用户通过终端启动:与终端相关的进程
**ps [options]**
unix 必须带-
BSD 必须不带-
长格式带 --
a:与终端相关的进程
x:所有与终端无关的进程
ax 查看所有进程
u:以用户为中心组织进程状态信息显示,显示用户信息
ps aux
VSZ:virtual memory size虚拟内存集,占用虚拟内存(进程占用内存空间,一个是线性地址空间,一个是物理内存空间),虚拟内存集,就是标明进程在线性内存集中占用内存大小
公有库左边和右边两个进程都调用一个公有库
左边的虚拟内存:2个 真正占用的内存是1个
右边的虚拟内存:3个 真正占用的内存是2个
image.png
RSS: 常驻内存集,不能放到交换内存的数据
STAT:当前进程状态(aux)BSD风格
R: RUNNING
S:可中断睡眠
D:不可中断睡眠
T:stopped状态
Z:zombie 僵死状态
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:会话领导者
-------------------------------------------------
# unix风格
-ef
SIMIE:启动时间
C:cpu占用百分比
TIME:累计消耗cpu时间
-F:显示完成格式进程信息
PSR:运行在哪个cpu上
-H:以层级结构,显示进程相关的信息
ps -eFH
o: 可自定义字段,以逗号分隔,filed1,filed2
ps axo pid,comm,psr,ni
常用filed:pid,ni,pri(优先级),psr,pcpu(cpu使用率),comm,tty,ppid,rtprio
ni:nice 值(-20,19)
pri:优先级
rtprio:实时优先级
pgrep pkill
根据进程名查询,或发送信号
pgrep [options] pattern
-u uid:显示用户进程 effective user
-U uid:显示用户进程(常用)real user
[root@ceshi ~]# pgrep -u postfix 显示postfix用户进程
1159
1160
-t TERMAAL:指定终端进程
-l:显示进程名
-a:显示完整格式的进程名
-p pid:显示此进程的子进程
pgrep ssh 显示进程中有ssh名字的
pkill 与pgrep 一样
pidof
取指定进程的进程名,根据进程名取其pid
top
显示linux进程新
Load average:在cpu行等待运行队列长度,队列长度总数量不能大于cpu核心数 1分钟 5分钟 15分钟
ni:调整nice值时,cpu占用百分比
hi:硬件中断,cpu占用百分比
si:软件中断,cpu占用百分比
st:偷走的cpu的百分比,虚拟化程序偷走的百分比
PR:优先级
ni:nice值
VIRI:虚拟内存集
RES:常驻内存集
SHR:共享内存
命令排序方式
M 内存占用的百分比
T cpu占用时间百分比
P 占据cpu百分比排序
首部,关闭命令如下
uptime 信息:l
cpu Task信息:t
内存信息:m
修改刷新时间间隔: s
中止指定进程:k
选项
-d :指定刷新时间间隔默认3秒
-b:以批次方式显示
-n:显示多少批次
top -b -n 1
htop
top的升级版,支持鼠标点击
F1 帮助,查看子命令
l 能打开一个选定进程的所有文件
s 跟踪一个进程发起的系统调用
t 以层级关系显示进程状态
a 将进程绑定到cpu核心
选项
-d 指定延迟时间间隔
-u 仅显示指定用户的进程
-s 以指定字段排序
vmstat
是用于报告虚拟内存使用的数据
vmstat [options] [delay[count]]
delay 每隔多少秒显示
count 显示多少次
procs:
r: running 等待运行进程的个数,cpu上等待运行的队列长度,实时的top里面的load average是平均值
b:处于不可中断睡眠状态进程个数,被阻塞的队列长度。如果这个大,IO能力比较差
memory:
swpd: 交换内存使用总量
free: 空闲的物理内存总量
buffer: 用于buffer内存总量
cache:用于cache内存总量
swap:
si:数据进入swap中,数据的平均速率(kb/s)换进
so:数据离开swap的平均速率(kb/s)换出
如果si,so活动频繁,物理内存太小,如果si频繁,so不频繁,问题不算太严重
io:
bi:从块设备读入数据到系统的速度(kb/s)
bo:保存数据到块设备的速率(kb/s)
system:
in: interrupts 中断速率,任何网络报文都可以到达。
当IO设备与cpu交互式,cpu如何知道IO设备与其交互
1.轮询:每隔1秒钟,就去看信号有没有来。
2.通知机制:信号来了,就提前通知cpu
采用的是通知机制,敲一次键盘,就发一次信号,中断cpu一次。
cpu如何知道哪个设备发的信号
有个中断的集线器。连接每一个IO设备,与其对应。用此标识,比如键盘在1号位
cs:context swtich 上下文切换速率,进程被内核的切换速率。如cs 达到上万个,说明被切换的进程太多,cpu太弱了
cpu:
us,sy,id,wa,st
选项
-s 显示内存统计数据
pmap
显示一个进程的内存映射表
pmap [options] pid
-x 显示详细信息
cat /proc/1/maps ==> pmap 1
glances
常用选项
-b: 以byte为单位。显示网上数据速率
-d: 关闭磁盘IO模块
-m: 关闭mount模块
-n: 关闭network模块
-t:刷新时间间隔
-I:每颗cpu相关数据单独显示
-o: 指定输出格式的[HTML/CSV]
-f: /PATH/TO/SOMEDIR 设定输出文件的位置
C/S模式下运行glances命令
服务模式:
glances -S -B IPADDR
客户端模式
glances -C IPADDR
dstat
dstat [-afv] [options] [delay][count]
dstat 2 5 2秒显示一次,显示5次
-c 显示cpu信息
-d 显示disk信息
-C #,#...,total 分别显示每一颗cpu
-D sda,sdb 指明磁盘
-g 显示page相关统计数据(速率数据)
-m: memory 统计相关的数据
-n: 网络相关统计数据
-p:进程相关统计数据
-r:显示io请求相关统计数据
-s:显示swapped的相关统计数据
--top-cpu 显示最占用cpu进程
--top-io 显示最占用IO的进程
--top-mem 显示最占用内存的信息
--top-lantency 延迟最大的进程
kill
终止一个进程,用于向进程发送信号,已实现进程管理
显示当前系统可用的信号 kill -l
[root@ceshi ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
4
每个信号标识方法有三种
1) 信号的数字标识
2) 信号的完整标识
3) 信号的简写名称
向进程发送信号
kill -s single pid
-SIGNAL
## 常用信号
1 SIGHUP 无须关闭进程,而让其重读配置文件
2 SIGINT 终止正在运行的进程,相当于CRTL+C
9 SIGKILL 杀死进程,不管进程打开的文件,直接杀死
15 SIGTERM 终止正在运行的进程 进程有正在打开的文件,等待文件关闭后。然后在杀死进程
18 SIGCONT 让停止程序继续运行
19 SIGSTOP 让程序停止
kilall
根据进程名,杀死进程
killall []
进程调度
保存现场,恢复现场
现场:一个进程的状态信息,保存在task struct(任务结构),内核为了追踪每一个任务,所以靠一个链表的数据结构保存诸多task struct.task list(任务列表)
cpu: us,sy,ni,id,wa,ni,si,cs(上下文切换),st
Memory:VSZ,RSS,SHM
linux作业机制
job:
前台作业:通过终端启动,且启动会一直占据终端
后台作业:可以通过终端启动,但启动后立即转入后台运行(释放终端)
如何让作业运行于后台
1) 运行中的作业: crtl+Z 转为停止状态
2) 尚未启动的作业
COMMAND &
注意:此类作业虽然被送往后台,依然与终端相关,如果希望送往后台的作业,剥离与终端的关系
nohup COMMAND &
jobs查看所有任务
可实现作业控制常用命令
fg [%]JOB_NUM
让作业运行在前台
bg [%]JOB_NUM
让后台停止作业,继续运行
kill %JOB_NUM
%不能省略,终止执行作业
调整进程优先级
可通过nice值调整优先级范围 100-139
分别对应:-20-19
进程启动时,其NICE值默认为0,其优先级120
nice命令:
以指定的nice值启动,并运行命令
nice [OPTIONS] [COMMAND]
-n 指明其nice值
注意:进管理员可以调低nice值
renice命令
renice [-n] NICE PID
调整运行的NICE值
查看NICE值和优先级
ps axo pid,ni,priority,comm
网友评论