标签:tar time 内存管理 线性 翻译 linu 其他 ddr 包含
linux中内核的功用:进程管理,文件系统,网络功能,内存管理,驱动程序,安全功能等。
表示运行中的程序的一个副本,是载入内存的一个指令集合。每一个进程,都有一个唯一的进程ID(Process ID),该ID号码被用来标识各个进程。其中,UID,GID,和SELinux语境决定对文件系统的存储和访问权限。通常由执行进程的用户来继承,进程存在生命周期。
程序,相当于一个磁盘文件(当不运行的时候),当运行的时候,会将该文件读取到内存中执行。
内存会给该程序分配一块内存中间,并且分配一个进程ID(PID),这就是进程的诞生。
进程与程序的区别 ?
进程是一个动态的概念,存在生命期,而程序只是磁盘上的文件,是静态的,不存在所谓的生命期。
一个进程,通常对应一个程序,而一个程序,可以对应多个进程。
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在linux-2.6.38.8/include/linux/sched.h文件中。多个task struct 可以组成链表。称为:task list
详解文章 未来需要的时候可以查看
https://blog.csdn.net/peiyao456/article/details/54407343
https://blog.csdn.net/lf_2016/article/details/54347820
在linux中,执行程序后会生成对应的进程,其中
init : 第一个进程
子进程都是由其父进程来创建。
其中,内核中的,fork()方法,用来生成子进程。clone()方法,可以生成子进程和兄弟进程。
copy on wirte : cow 机制 写时复制
在进程创建的时候,父进程正在运行,当他需要开启子进程的时候,系统会在内存中,生成一个新的子进程信息,如果新的子进程信息还未修改。那么只占用同样的内存空间。这时候子进程与父进程,指向同一块内存空间,共用这块内存空间。节约空间。
当子进程涉及到内存修改,才会创建一块新的空间,将子进程移动过去。
当子进程没有被修改时,与父进程占用同样的空间,当子进程发生修改,才会创建新的内存空间存放子进程。
多个程序运行的时候,基于时间片机制,CPU将时间分成多个时间片,每个时间执行不同的操作。
创建:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态。
就绪:进程已经准备好,已分配到所需资源,只要分配到CPU时间片就能够立即运行。
阻塞:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用。
执行:进程处于就绪状态被调度后,进程进入执行状态。
终止:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
根据系统和CPU的架构,分为两种状态:
用于让CPU选择先后执行的进程顺序。各有140个运行队列和过期队列
系统优先级: 数字越小,优先级越高
实时优先级: 99-0 值最大优先级最高,与系统优先级相反。
nice值:-20到19,对应系统优先级100-139或99
上图中的表示,要记住,系统优先级是数字越小越高,而实时优先级是数字越大越高!!
nice的值越大,这个进程的优先级就越小!!!
Linux内核实现了两种不同的优先级范围。第一种是用nice值,它的范围是[-20, 19],默认值是0。越大的nice值意味着优先级越低--你对系统中的别的进程"nice"。相比于那些高nice值(低优先级)的进程来说,低nice值(高优先级)的进程可以获得更多的处理器时间。
会叫的孩子有奶吃,越是不nice的进程越有CPU优先使用权(也就是优先级高咯)。
每个优先级,都有运行队列和过期队列
实际的调度过程
内存中存在: 运行队列 0 ,0队列中存在 1 2 3 这3个程序。 运行队列 1 ,1队列中存在5,6,7
这时候 1运行完CPU时间片,当该时间片执行完,1程序却还没有全部执行完,就把1放到0优先级的过期队列。然后执行2 以此类推。
当 0运行队列中不存在进程的时候,0过期队列就会转化成0运行队列,然后跟其他队列进行优先级比较,谁优先级高就运行谁的队列。他跟1比还是0优先级高,所以继续执行0。
其实也就是高优先级的队列中所有进程全部结束时,才会去执行低优先级队列中的进程。
Page Frame:页框,用于存储页面数据,存储单位为4K。(尽可能的使用内存当缓存,加速运行效率 ,cache最多也就占用内存的90%)
LRU : 近期最少使用算法,释放内存物理地址空间和线性地址空间。缓存的工作机制,主要用来淘汰最近最少被使用访问的内存数 LRU算法存在复杂的变种。
工作机制类似一个可变的堆栈。当数据进入时,会进入缓存,将新的数据进入后,旧数据会往下压。除非使用旧的数据,那么旧数据会再次回到栈顶。当空间不够用的时候,会把栈底的从内存中移出。
MMU:Memory Management Unit负责转换线性和物理地址
TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存。
通过以下三种方式:
通过信号或者共享内存,因为程序在分配内存空间的时候,都会认为自己所得的是一切内存空间。进程之间互相不知道彼此的存在。
信号量:相当于一种计数器。相当于某种资源,这种资源只能背进程独占。表示该资源是否可用
RPC MQ 底层都会依赖socket
Linux内核属于:抢占式多任务
进程类型:
注意:两者可相互转化
进程状态:
睡眠态:
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭。正常情况下,进程结束后,会释放内存空间,僵死态的进程即使结束后,仍会占用内存空间。
系统中存在最多的是可中断睡眠态进程
一个进程,可以有多个线程
进程好比一个项目小组,里面有多个人,每个人就相当于一个线程,在干不同的事情
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
Linux系统状态的查看及管理工具:pstree, ps, pidof,
pgrep, top, htop, glance, pmap, vmstat, dstat, kill,
pkill, job, bg, fg, nohup
用于查看进程,由于命令古老,所以支持三种不同类型的选项.
UNIX选项 如-A -e
BSD选项 如a
GNU选项 如--help
默认只显示当前一个终端的进程。ps process state 显示进程状态 基于快照 。
ls /proc/ 下可以查看所有的进程文件
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
运行程序的时候,可以直接指定程序的优先级,而不是运行起来再指定。
ps 基于快照机制,并不是实时观察系统的情况,只是观察使用命令的那一个瞬间
选项:默认显示当前终端中的进程
其中,PS所输出属性的一些翻译:
承诺内存表示系统承诺可以分配给一个进程的内存空间,而实际内存则是当前分配给该进程的真实内存空间。相当于一个上限和画大饼。
各相关信息的意义:
ps axo 显示后面的选项 pid,cmd,psr,ni,pri,rtpr
ps o pid,cmd,%cpu 只显示pid,cmd,cpu利用率
ps axo pid,cmd,%cpu,tty k %cpu 按cpu使用率来排序显示 ,默认是按pid进行排序的
ps -C 1.sh -C 2.sh 显示多个脚本的信息
ps -C 1.sh -C ping o pid,%cpu,%mem 显示1.sh 和 ping 命令的cpu和内存的使用率
bash 脚本如果不加头文件的话,使用 ps -C 脚本名,是找不到这个执行脚本的
查询你拥有的所有进程
ps -x
显示指定用户名(RUID)或用户ID的进程:
ps -fU apache
ps -fu 48
显示指定用户名(EUID)或用户ID的进程:
ps -fu wang
ps -fu 1000
查看以root用户权限(实际和有效ID)运行的每个进程:
ps -U root -u root
列出某个组拥有的所有进程(实际组ID:RGID或名称):
ps -fG nginx
列出有效组名称(或会话)所拥有的所有进程:
ps -fg mysql
ps -fG 27
通过进程ID来显示所属的进程:
ps -fp 1234
父进程ID来显示其下所有的进程,如显示父进程为1154的
所有进程:
ps -f --ppid 1234
显示指定PID的多个进程:
ps -fp 1204,1239,1263
要按tty显示所属进程:
ps -ft pst/0
以进程树显示系统中的进程如何相互链接:
ps -e --forest
以进程树显示指定的进程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列:
ps -fL -C nginx
要列出所有格式说明符:
ps L
查看进程的PID,PPID,用户名和命令:
ps -eo pid,ppid,user,cmd
19
自定义格式显示文件系统组,ni值开始时间和进程的时间:
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
使用其PID查找进程名称:
ps -p 1244 -o comm=
要以其名称选择特定进程,显示其所有子进程
ps -C sshd,bash
查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用:
ps -C httpd,sshd -o pid=
检查一个进程的执行时间
ps -eo comm,etime,user | grep nginx
查找占用最多内存和CPU的进程:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
显示安全信息:
ps -eM
ps --context
使用以下命令以用户定义的格式显示安全信息。
ps -eo euser,ruser,suser,fuser,f,comm,label
使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视:
watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head‘
查看进程树
pstree -p 花括号扩起来的就是线程
pstree 显示进程树桩结构
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
调整程序的nice优先级
nice -n -5 sleep 100 把sleep 100 的优先级设置为-5后运行
专门用于显示进程过滤后信息的命令
其实最灵活的用法还是ps选项 | 其他命令
按预定义的模式:pgrep
pgrep -at pts/0 显示pts/0 这个终端的进程信息
pgrep "vi.*" 使用正则表达式来匹配显示 (不是文件标识符)
启动总时长 用户数 平均负载情况 1分钟 5分钟 10分钟
数值大的话说明系统的CPU占用过高,负载过大,需要排查
系统平均负载:指在特定时间间隔内运行队列中的平均进程数
通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题。
如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用。
栏位信息简介:
us 用户占用
sy 系统占用
ni 调整nice优先级时间
id 空闲百分比
wa 等待IO时间
hi 软中断 (模式切换)
si 硬中断 (cpu 的一种处理机制)
st 偷盗时间 (比如在linux中跑了一个虚拟机,系统不知道为什么cpu和内存被占用了,就会在st 中显示。)
top存在许多的内置命令:
默认按cpu使用率排序
首部信息显示:
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W (把当前显示的数据保存到文件中)
top -d 5 直接设置刷新间隔为5后显示top菜单
top -b 全部显示所有进程
top -n # 刷新多少次后退出
**硬中断:**
1\. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。
2\. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。
3\. 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。
4\. 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。
**软中断:**
1\. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。
2\. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。
3\. 软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。
4\. 软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。
**问题解答:**
**1\. 问:**对于软中断,I/O操作是否是由内核中的I/O设备驱动设备完成?
答:对于I/O请求,内核会将这项工作分派给合适的内核驱动程序,这个程序会对I/O进行队列化,以可以稍后处理(通常是磁盘I/O),或如果可能可以立即执行它。通常,当对硬中断进行回应的时候,这个队列会被驱动所处理。当一个I/O请求完成的时候,下一个在队列中的I/O请求就会发送到这个设备上。
2\. 问:软中断所经过的操作流程是比硬中断的少吗?换句话说,对于软中断就是:进程 ->内核中的设备驱动程序;对于硬中断:硬件->CPU->内核中的设备驱动程序?
答:是的,软中断比硬中断少了一个硬件发送信号的步骤。产生软中断的进程一定是当前正在运行的进程,因此它们不会中断CPU。但是它们会中断调用代码的流程。
如果硬件需要CPU去做一些事情,那么这个硬件会使CPU中断当前正在运行的代码。而后CPU会将当前正在运行进程的当前状态放到堆栈(stack)中,以至于之后可以返回继续运行。这种中断可以停止一个正在运行的进程;可以停止正处理另一个中断的内核代码;或者可以停止空闲进程。
需要配置epel源,通过epel源进行下载,一个进阶的,更智能的系统监控命令。
选项:
子命令:
free -o 只能在centos6上操作
echo 1 > /proc/sys/vm/drop_caches 清除缓存
虚拟内存信息命令,用于查看虚拟内存使用情况,vmstat对操作的监控,均以内存为参照物的。
procs:
memory:
swap:
io:
system:
cpu:
统计CPU和设备IO信息
iostat /s读写速度 读写量
pmap 查看进程真正使用的空间大小
pmap -x 1
Dirty 脏数据,表示处于修改,还未修改结束的数据
cat /proc/1/maps 直接查看内存状态,pmap 是把这里面的信息做整理后显示。
远程监控主机状态
如何开启glances
需要在被监控端,已服务器的形式开始
然后另一台机器,用glances 当客户端来连接该机器,即可查看主机状态
glances -s (以服务器的方式) -B 192.168.30.7 (绑定IP)
ss -ntl 查看端口监听
glances -c (以客户端的方式) 192.168.30.7 连接到该IP
dstat 需要yum 安装
dstat top-cpu 显示占用CPU最多的进程
进程管理命令,用于关闭进程,休眠进程,启动进程。
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写,显示当前系统可用信号: kill –l,trap -l
常用信号:man 7 signal
指定信号的方法:
(1) 信号的数字标识:1, 2, 9
(2) 信号完整名称:SIGHUP
(3) 信号的简写名称:HUP
不是所有的进程都可以关闭的,有的时候需要使用强制删除
echo $$
mingetty 这个是Linux的登录进程,让用户可以在字符界面登录linux
再生进程 ,杀死后自动激活
实例
kill -1 4754 (httpd) 给httpd发送信号1,让他重新读取配置文件,并且不重启服务
kill 1234 结束1234这个进程
kill -9 1 杀死主进程,虽然杀不死,但是也 会造成子进程的破坏
杀死所有名称匹配的进程,通常用于批量清理进程
killall sleep 删除所有sleep进程 ,killall 后面更的是进程名,不是pid
杀死特定进程
先用pgrep -t pts/0 查找进程
pgrep -at pts/0 查找 pts/0上的所有进程
pkill 针对进程来执行 ,支持正则表达式
pkill -t pts/0 杀掉pts/0全部进程
pkill -9 -t pts/0 强制杀死,可以用来踢人
pkill -9 -t pts/[012] 不能这样用!!!
cmd + & 让程序保持后台执行
jobs 查看后台执行的命令
frontgroup
** fg # : # 代表作业编号,通过Jobs可以查看到,把指定的后台作业调回前台 **
ctrl + z 把命令放到后台,但是命令会处于停止状态
bg 1 启动后台命令 1 为jobs显示的后台队列ID
前台到后台 ctrl + z
后台休眠到后台运行 bg jobnumber
后台运行 cmd&
后台运行到前台运行 fg jobnumber
后台运行到后台休眠 killall -19 ping 发送19信号
后台休息到后台运行 killall -18 ping 发送18信号
jobs 只能看自己终端上运行的后台程序
作业虽然放到后台执行了,但是他还是与终端有关系的。当存放后台执行任务的网络中断,后台任务也会随着中断
如果需要后台程序与终端剥离,在终端断开的情况下,也继续执行,可以使用screen 剥离程序.
然后使用 screen -r ,恢复运行
nohub ping 127.1(代表127.0.0.1) &
nohub 执行的任务,核心就是网络断开后,会将这个后台程序,从子进程变成一个一级主进程。
nohub 只要有标准数据,就会把输出放到nohup.out文件中
作业控制:
fg [[%]JOB_NUM]:把指定的后台作业调回前台
bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
kill [%JOB_NUM]: 终止指定的作业
标签:tar time 内存管理 线性 翻译 linu 其他 ddr 包含
原文地址:https://www.cnblogs.com/ddz-linux/p/10467219.html