linux进程及作业管理
CPU划分为时间片(timeslice),分配给程序使用,根据优先级确定给哪个程序使用
内核负责进程的管理
CPU中有一个指针指令寄存器,其中记录的是下一条命令的指针(地址),保存当前进程的状态
内核的功能:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
进程有生命周期,进程在内核中称为任务
task,struct,任务结构体,linux内核存储进程信息(元数据)的固定格式。
数组在内存中必须是连续的空间
链表在尾部加上指针,指向下一个数据
多个任务的task,strct组成的链表:task list任务列表
当中断发生时,必须由内核接管CPU
进程的创建:进程都是由父进程创建, 如果不写入数据则公共使用共享数据,只有在子进程需要写入数据时再copy一份进行写入操作,COW,写时复制。
子进程是父进程为完成某个功能创建的,子进程结束后由父进程销毁。
进程的优先级:0-139
0-99 (0很少使用)实时优先级,数字越大优先级越高
100-139 用户可调整优先级,数字越小,优先级越高
nice值:(-20)到(+19),对应100-139
通过调整nice值改变进程的优先级:
每个优先级有两个队列,一个为运行队列,一个为过期队列,每次只扫描140个运行队列的首部,当运行时间结束,与过期队列调换继续在CPU上运行。
内核负责资源的分配:
为了完成现代操作系统的管理,内核将自身在占用以外的内存划分为4K大小(页框),用于存放页面数据,页框:page Rfame
内核采用虚拟内存机制,使得每个程序都认为自己是独占内存,线性地址。线性地址与实际地址的对应关系由内核管理。
MMU:memory management unit,CPU中的内存管理单元,负责实时转换线性地址为真实地址。
缺页异常:内存中的页面不存在了,可能是被交换出去了,也可能在硬盘上存储,内存中的数据不是所有都可以交换的。
必须存在于内存中的,称为常驻内存级;
可以交换出去的,称为虚拟内存级。
IPC:Inter porcess communication 进程间通信
同一主机:single发信号
shm:shared memory
跨主机:socket 套接字
RPC:Remote Procecure Call 远程过程调用
linux内核:抢占式多任务
进程类型:
守护进程daemon,在系统引导过程过程中启动的进程,根终端无关的进程
用户进程:前台进程,跟终端相关,通过终端启动的进程。
进程状态:
运行态:running
就绪态(睡眠态)
可中断睡眠:Interruptable
不可中断睡眠:uninterruptable 等待数据载入
当一个进程向内核申请从磁盘获取数据时,内核先间数据载入内核空间,再将数据复制到进程内存中啊,一次IO分两段运行
停止态:stopped,暂停于内存中,但是不会被调度,除非手动启动
僵死态:Zombie,没有被回收的进程
进程分类:
CPU-Bound CPU密集型,一般为非交互式
IO-Bound IO密集型,一般为交互式,交互式需要立即反应,因此优先级较高
家目录下的配置文件,只针对单个用户生效
~/.bashrc 定义别名等
~/.bash_profile 定义PATH环境变量
/etc/针对所有用户生效的配置文件
/etc/bashrc PS1、PATH、UID
/etc/profile PATH、EUID(进程的有效用户ID)
/etc/profile.d/.sh
环境的执行顺序
~/.bash_profile —> ~/.bashrc —> /etc/bashrc —> /etc/profile —> /etc/profile.d/.sh
~/bash_logout该配置文件(脚本)会在正常退出终端时执行
~]#id -ru #显示用户的真实UID
/etc/issue 登录显示的信息
/etc/issue.net 远程登录时显示的登录信息(需要开启ssh调用),在登录完成后显示
/etc/ssh/sshd_config中Banner开启并指向/etc/issue.net文件
/etc/motd 不区分登录方式显示提示信息
~]# stty -a #查看所有快捷键
centOS6中让自己写的脚本或者源码支持chkconfig
向放入/etc/init.d/下的脚本中添加两行信息
# chkconfig: 2345(生效的级别) 10(启动的顺序) 90(关闭的顺序)
# description: 服务的描述信息
~]# chkconfig -add 脚本名
验证是否成功:echo $?
~]# chkconfig —list |grep 服务名 #检查是否安装加入开机自启动
模块加载:
/lib/modules/2.6.32./kernel
~]# lsmod #列出当前已启用的所有模块
~]# modinfo Mode_Name #查看指定模块的详细信息,所有支持的模块都能够查看
~]# modprobe Mode_Name #装载指定的模块到内核
当新加入一个模块(复制到目录下)时,本机不能够立即识别,需是同平台模块。
~]# depmod #扫描模块,将新的模块信息写入
/lib/mudulles/2.6.32./modeles.dep 保存模块信息的模块,只有在modules.dep文件
~]# modprobe -r MOD_NAME #卸载指定模块
系统管理:
进程是一个状态,是计算机中的程序关于某数据集合上的一次活动
线程是进程处理的最小单位,也称为轻量级进程
例如用户访问80的请求为线程
程序是代替人管理操作系统,完成特定的任务,解决特定问题的一段代码集合
~]# ps aux (以BSD风格显示)
USER 由哪个用户产生
PID 进程号
%CPU CPU使用百分比
%MEM 内存使用占比
VSZ 虚拟内存级,占用虚拟内存的大小
RSS 常驻内存级,占用真实内存的大小
tty 登录终端
STAT 进程状态
S 休眠状态
R 正在运行的程序
+ 处于前台的进程
N 优先级较低的进程
< 优先级较高的进程
! 多进程的(包含有子进程)
s 进程的领导者
D 无法中断的休眠状态(uninterruptable)
T 停止或被追踪
Z 僵尸进程,有些情况下,父进程被销毁,但是子进程驻留内存
L 被锁定进内存的进程,与系统启动相关
当windows蓝屏时报错为段内存地址空间,可通过这个地址判断蓝屏的原因
START 进程启动时间
TIME 进程运行的时间(在CPU上运行的总时间)
COMMAND 由哪个命令产生的此进程
~]# ps -le
F 当前进程的权限
1 进程可复制
4 进程使用超级管理员权限
PPID 父进程
S 进程状态
C CPU使用占比
PRI 进程优先级(80或-40)
PRI决定了进程获取资源的优先级
NI nice值
[PRI最终值=PRI原值+NI(可修改)]
可通过修改NI值来影响进程的优先级
ADDR 进程在内存中的地址(不锁定不显示)
SZ(size) 进程占用内存大小
WCHAN 进程是否运行(”-“表示正在运行)
优先级:
NI的范围:(”-20”到”+19”)
普通用户只能调大NICE值0-19
- nice -n # service httpd start #服务启动时指定优先级
renice -# PID #更改指定进程的优先级
默认NI为0
PRI为80
~]# top [option]
-d 秒数,指定刷新时间,默认为3秒
-b 使用批处理模式
-n # 指定次数,常与-b一同使用
-p PID #查看指定PID进程
-u 用户名,只看某一用户运行的进程
-s 安全模式,避免在交互式下出现错误
~]# pstree [option] #进程树查看
-p 显示程序进程号
-u 显示进程的用户
~]# kill [signal] PID #默认使用15信号,正常关闭
HUP (1) 通知进程重新加载配置文件
INT (2) 终端,同ctrl+C只能终端前台(占用终端的)进程
TERM (15) 终止,正常退出
CONT (18) 继续运行
STOP (19) 暂停—Ctrl+Z
~]# killall [signal] 进程名 #杀死一类进程
-I(大) 忽略大小写
~]# pkill -t 终端号 #结束终端用户的登录
进程号:不区分终端
工作号:区分终端(工作号只能在相应终端中查看)
工作号只有位于后台的进程才有
~]# jobs -l #显示PID(进程号),查看工作
fg #(工作号) #将指定工作号调回前台执行,默认调回工作号后带”+”号的。
bg #(工作号) #将后台进程(停止的)运行起来,依旧运行在后台。
将命令放入后台的方式:
1. 命令 & #在命令后加上"&"符,将命令放入后台
2. Ctrl+Z ; bg #将前台的进程放入后台,在执行后台的作业
一般来说进程都是与终端相关联的,只要终端关闭,其进程也会关闭
使命令脱离终端运行的方式
- 写入/etc/rc.local(不建议)
- 写入cron定时任务计划任务
- nohup 命令 操作对象 & #使命令脱离终端运行
系统资源查看
~]# vmstat #监控系统资源
procs 进程
r 运行队列中进程数量
b 阻塞队列的数量
Memory内存
swap 如这个值大于0,则表示物理内存不够用
si 每秒从磁盘读入内存的大小
so 每秒从内存读入磁盘的大小
system
in 每秒CPU的中断数,包括时钟中断
cs 每秒上下文的切换次数(资源调用的次数)
~]# dmesg #查看内核的检测信息
/var/log/dmesg #只记录这一次开机时的检测信息
~]# free #查看内存的使用情况
-b 以字节为单位显示
-k 以KB为单位显示
-m 以MB为单位显示
-g 以GB为单位显示
查看CPU信息
- 逻辑CPU个数
cat /proc/cpuinfo |grep “processor” |wc -l - 物理CPU的个数
cat /proc/cpuinfo |grep “physicalid” | sort -u | wc -l - 每个物理CPU中core(核心)个数
cat /proc/cpuinfo |grep “cpu cores” | uniq | awk -F “:” ‘{print $2}’ 查看core id的数量,即为物理CPU上的core的个数
cat /proc/cpuinfo |grep “core id” |uniq |wc -l
非超线程CPU算力强
超线程CPU:能同时执行更多的进程,线程为核心数的两倍
~]# uptime #系统启动时间和平均负载(一般使用top)
~]# uname #查看系统与内核相关信息
~]# lsb_release -a
~]# lsof #列出进程打开或者正在使用的文件信息
~]# lsof -p PID #查看某进程运行时所调用的资源
~]# lsof -u UID #查看指定用户运行的进程调用了哪些文件
~]# ldd COMMAND PATH #查看指定命令执行时要调用的库函数文件
!!有些恶意软件写入函数文件中,在特定的条件下才会被触发,列如执行某个命令,此时需要排查函数文件的文件数据修改时间,如果发现异常,替换为安全的文件。