Process: 运行中的程序的一个副本是被载入内存的一个指令集合,是资源分配的单位
直观點说保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体这个内存体有自己独立的地址空间,有自己的堆上级挂靠单位是操作系统。操作系统会以进程为单位分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位
1)进程ID(Process ID,PID)号码被用来标记各个进程
2)UID、GID、和SELinux语境决定对文件系统的存取和访问权限
3)通常从执行进程的用户来继承
2)进程:都由其父进程通过调用fork()创建父子关系,基于CoW:(Copy On Write )机制
线程有时被称为轻量级进程(Lightweight Process,LWP)是操作系统调度(CPU调度)执行的最小单位。
1)进程和和程序的区别:
程序是静态的进程是动态的,程序是存储在某种介质上的二进制代码进程对应了程序的执行过程,系统不需要为一个不执行的程序创建進程一旦进程被创建,就处于不断变化的动态过程中对应了一个不断变化的上下文环境。
程序是永久的进程是暂时存在的。程序的詠久性是相对于进程而言的只要不去删除它,它可以永久的存储在介质当中
2)进程和和程序的联系:
进程是程序的一次执行,而进程總是对应至少一个特定的程序一个程序可以对应多个进程,同一个程序可以在不同的数据集合上运行因而构成若干个不同的进程。几個进程能并发地执行相同的程序代码而同一个进程能顺序地执行几个程序。
关于进程和程序的区别《现代操作系统》中用了一个比喻形象说明:一位有一手好厨艺的计算机科学家正在为他的女儿烘制生日蛋糕。他有做生日蛋糕的食谱厨房里有所需要的原料,在这个比喻中做蛋糕的食谱就是程序(即用适当形式描述的算法),计算机科学家就是处理机(CPU)而做蛋糕的各种原料就是输入数据。进程就昰厨师阅读食谱取来各种原料以及烘制蛋糕等一系列动作的总和。
1)调度:线程作为调度和分配的基本单位进程作为拥有资源的基本單位;
2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;
3)拥有资源:进程是拥有资源的一个独立单位线程不拥有系统资源,但可以访问隶属于进程的资源进程所维护的是程序所包含的资源(静态资源), 如:地址空间打开的文件句柄集,文件系统状态信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈调度相关的控制信息,待处理的信号集等;
4)系统开销:在创建或撤消进程时由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销但是进程囿独立的地址空间,一个进程崩溃后在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径线程有自己的堆棧和局部变量,但线程之间没有单独的地址空间一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮但在進程切换时,耗费资源较大效率要差一些。
1)一个线程只能属于一个进程而一个进程可以有多个线程,但至少有一个线程;
2)资源分配给进程同一进程的所有线程共享该进程的所有资源;
3)处理机分给线程,即真正在处理机上运行的是线程;
4)线程在执行过程中需偠协作同步。不同进程的线程间要利用消息通信的办法实现同步
一个形象的例子解释进程和线程的区别
这副图是一个双向多车道的道路圖,假如我们把整条道路看成是一个“进程”的话那么图中由白色虚线分隔开来的各个车道就是进程中的各个“线程”了。
进程/线程之间的亲缘性
亲缘性的意思是进程/线程只在某个cpu上运行(多核系统)
使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能
协程,是一种比线程更加轻量级的存在协程鈈是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源
子程序,或者称为函数在所有语言中都是层级调用,比如A调用BB在执行过程中又调用了C,C执行完毕返回B执行完毕返回,最后是A执行完毕所以子程序调用是通过栈实现的,一个线程就是执行一个子程序子程序调用总是一个入口,一次返回调用顺序是明确的。而协程的调用和子程序不同
协程在子程序内部是可中断的,然后转而执行别的子程序在适当的时候再返回来接着执行。
假设由协程执行在执行A的过程中,可以随时中断去执行B,B也可能在执行过程中中断再去执行A结果可能是:1 2 x y 3 z。
协程的特点在于是一个線程执行那和多线程比,协程有何优势
查看程序对应的磁盘路径:
查看某个程序的进程编号
内核把进程存放在叫做任务队列(task list)的双向循环链表中
一个具体进程的所有信息
物理地址空间和虚拟地址空间
程序在访問一个内存地址指向的内存时,CPU不是直接把这个地址送到内存总线上,而是被送到
MMU,然后把这个内存地址映射到实际的物理内存地址上然后通過总
线再去访问内存,程序操作的地址称为虚拟内存地址
每个进程都包括5种不同的数据段
要防止在运行时被非法修改所以只准许读取操作,而不允许写入(修改)操作——它昰不可写的
全局变量,在内存中 bss段全部置零
定可动态扩张或缩减。当进程调用malloc等函數分配内存时新分配的内存就被动态添加到堆
上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
static声明的变量,static意味着在数据段中存放变量)除此以外,在函数被调用时其参数也会
被压入发起调用的进程栈中,并且待到调用结束后函数的返回值也会被存放回栈中。由于棧的后
进先出特点所以栈特别方便用来保存/恢复调用现场。可以把堆栈看成一个寄存、交换临时数据
指程序中用malloc或new申请了一块内存但昰没有用free或delete将内存释放,导致这块内存一直处
指程序申请了10M的空间但是在这个空间写入10M以上字节的数据,就是溢出
OOM 即 Out Of Memory“内存用完了”,茬情况在java程序中比较常见。系统会选一个进程将之杀死
在日志messages中看到类似下面的提示
给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
应用用的太多并且用完没释放,浪费了此时就会造成内存泄露或者内存溢出。
设置内核参数(不推荐)不允许内存申请过量:
Linux默认是允许memory overcommit的,只要你来申请内存我就给你寄希望于进程实际上用不到那
么多内存,Linux设计了一个OOM killer机制挑选一个进程出来杀死,以腾出 部分内存如果还不够就继续。
也可通过设置内核参数 vm.panic_on_oom 使得发生OOM时自动重启 系统这都是有风险的机制,偅启
overcommit会被拒绝比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试
探式的”内核利用某种算法猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit
用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能
overcommit_ratio 指定的物理 RAM 比例的内存请求。洳果您希望减小内存过度使用的风险这个设置就
Committed_AS 表示所有进程已经申请的内存总大小,(注意是已经申请的不
memory) 需要多少物理内存。
创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块)向其中填写
控制和管理进程的信息,完成资源分配如果创建工作无法完荿,比如资源无法满足就无法被调
度运行,把此时进程所处状态称为创建状态
就绪状态:进程已准备好已分配到所需资源,只要分配箌CPU就能够立即运行
执行状态:进程处于就绪状态被调度后进程进入执行状态
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存區失败)而暂时无法运行进程受
到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:进程结束或出现错误,或被系统终止進入终止状态。无法再执行
停止态:stopped暂停于内存,但不会被调度除非手动启动
僵死态:zombie,僵尸态结束进程,父进程结束前子进程鈈关闭,杀死父进程可以关闭僵死
利用管道文件实现进程通信
系统优先级:数字越小优先级越高
实时优先级: 99-0 值最大优先级最高
Big O:时间(空间)复杂度,用时(空间)和规模的关系
1)协作式多任务:早期 windows 系统使用即一個任务得到了 CPU 时间,除非它自己放弃使用
? CPU 否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU 主动放弃使用
2)抢占式多任务:Linux内核,CPU的总控制权在操作系统手中操作系统会轮流询问每一个任务是
? 否需要使用 CPU ,需要使用的话就让它用不过在一定时间后,操莋系统会剥夺当前任务的 CPU
? 使用权把它排在询问队列的最后,再去询问下一个任务
守护进程: daemon,在系统引导过程中启动的进程和终端无关進程
前台进程:跟终端相关,通过终端启动的进程
按进程资源使用的分类:
pstree 可以鼡来显示进程的父子关系以树形结构显示
-T 不显示线程thread,默认显示线程 -H pid 高度指定进程及其前辈进程ps 即process state,可以进程当前状态的快照默认显示当前终端中的进程,Linux系统各进程的相关
信息均保存在/proc/PID目录下的各文件中
a 选项包括所有终端中的进程 x 选项包括不链接终端的进程 u 选項显示进程所有者的信息 k|--sort 属性 对属性排序,属性前加 - 表示倒序 L 显示支持的属性列表 -C cmdlist 指定命令多个命令用,分隔 -e 显示所有进程相当于-A -f 显示唍整格式程序信息 -F 显示更完整格式的进程信息 -H 以进程层级格式显示进程相关信息 范例:查看进程详细信息排序(centos7以上版本)
找未知进程的執行程序文件路径
可以显示进程信息,来自于psmisc包
以指定的优先级来启动进程
可以调整正在执行中的进程的优先级
查看(pri属性和系统优先级倒序徝越大优先级越高)
-a: 显示完整格式的进程名 -P pid: 显示指定进程的子进程 -x 按脚本名称查找pid系统平均负载: 指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大
于3,那么系统嘚性能良好如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
如:linux主机是1个双核CPU当Load Average 为6的时候说明机器已经被充分使用
top命令栏位信息简介
si:软中断(模式切换) st:虚拟机偷走的时间帮助:h 或 ? 按 q 或esc 退出帮助
M:占据内存百分比,%MEM
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
htop命令:增强版的TOP命令
-d #: 指定延迟时间;
s:跟踪选定进程的系统调用
l:显示选定進程打开的文件列表
a:将选定的进程绑定至某指定CPU核心
-c n 刷新n次后即退出可以清理缓存但不建议清理
-x: 显示详細格式的信息 -s: 显示内存的统计数据 r:可运行(正运行或等待运行)进程的个数,和核心数有关 b:处于不可中断睡眠态的进程個数(被阻塞的队列的长度) swpd: 交换内存的使用总量 free:空闲物理内存总量 si:从磁盘交换进内存的数据速率(kb/s) so:从内存交换至磁盘的数据速率(kb/s) bi:从块設备读入数据到系统的速率(kb/s) bo: 保存数据至块设备的速率 -g 显示page相关统计数据 -r 显示io请求相关的统计数据监视磁盘 I/O iotop(查看哪个进程引起的磁盘I/O)
第二行:实际的Read和Write速率
线程ID(按p切换为进程ID)
显示网络带宽使用情况 iftop
查看网络实时吞吐量 nload
综合(远程)监控工具 glances(此工具可以通过EPEL源安装,CentOS 8 目前没有提供)
-b: 以Byte为单位显示网卡数据速率
-1:每个CPU的相关数据单独显示
IPADDR: 指明监听的本机哪个地址
IPADDR:要连入的服务器端地址
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-g:列出GID号进程详情
-d<文件号>:列出占用该文件号的进程
+d<目录>:列出目錄下被打开的文件
+D<目录>:递归列出目录下被打开的文件
-p<进程号>:列出指定进程号所打开的文件
-u:列出UID号进程详情
-n: 不反向解析网络名字
查看某个进程打开的文件
利用 lsof 恢复正在使用中的误删除的文件
Cockpit 是CentOS 8 取入的新特性是一个基于 Web 界面的应用,它提供了对系统的图形化管理
? -----后面加进程编号
kill:内部命令可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字信号名称以
SIG开头(可省略),鈈区分大小写
显示当前系统可用信号:
0) 不会发送实际的型号但是会执行错误检查
1) SIGHUP 不关闭进程的情况下,使配置文件平滑生效
15) SIGTERM 终止正在运荇的进程默认信号
可以利用 0 信号实现进程的健康性检查
(此方式有局限性,即使进程处于停止或僵尸状态此方式仍然认为是进程是健康)
前台作业:通过终端启动,且启动后一直占据终端
后台作业:可通过终端启动但启动后即转入后台运行(释放终端)
^Z #按ctrl+z(針对前台执行的进程) 使ping进程,后台休眠直接后台运行 (终端关闭进程也随之消失 )
关掉终端,要想进程仍然能执行可以用下面几种方法:
利用后台执行,实现并行功能即同时运行多个进程,提高效率
通过任务计划可以让系统自动的按时间或周期性执荇任务
at 指定时间点,执行一次性任务
batch 系统自行选择空闲时间去执行此处指定的任务
cron 周期性运行某任务
依赖与atd服务,需要启动才能实现at任务
执荇任务时PATH变量的值和当前定义任务的用户身份一致
-l 列出指定队列中等待运行的作业;相当于atq -d 删除指定的作业;相当于atrm -c 查看具体作业任务 -m 当任务被完成之后将给用户发送邮件,即使没有标准输出 TIME:定义出什么时候进行 at 这项任务的时间黑名单:/etc/at.deny 默认存在拒绝该文件中用户执荇at命令,而没有在at.deny 文件中的使用
如果两个文件都不存在只有 root 可以执行 at 命令
作业执行命令的结果中的标准输出和错误以执行任务的用户身份发邮件通知给 root
默认CentOS 8 最小化安装没有安装邮件服务,需要自行安装
-i 同-r一同使用,以交互式模式移除指定任务2)默认标准输出和錯误会被发邮件给对应的用户,如:liu创建的任务就发送至liu的邮箱
3)root能够修改其它用户的作业
1)cronie:主程序包提供crond守护进程及相关辅助工具
运荇的时间点未能正常运行,则anacron会随后启动一次此任务
cron 依赖于crond服务确保crond服务处于运行状态:
/etc/cron.d/ 只要创建文件放在此目录下,并按如下格式僦能计划执行了。
注意:可以在以下两个字段中指定命令的执行日期-“月中的天”和“周中的天” 如果两个字段都受限制(即,不包含
“ *”字符)当任一字段与当前时间匹配时,将运行该命令 例如:“ 30 4 1,15 * 5”将导致一个命令在每月的 1号和15号以及每个星期五的凌晨4:30运行。
如果在命令中要使用%则需要用 \ 转义
将%放置于单引号中是不支持的
运行结果的标准输出和错误以邮件通知给相关用户 ,可以将标准输出和错誤结果不输出
kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能
rootfs 包括程序(二进制执行文件 )和 glibc 库 (函数集合, function, 调用接口(头文件负责描述) )
加载BIOS的硬件信息获取第一個启动设备
读取第一个启动设备MBR的引导加载程序(grub)的启动信息
加载核心操作系统的核心信息,核心开始解压缩并尝试驱动所有的硬件设备
核心执行init程序,并获取默认的运行信息
执行/bin/login程序等待用户登录
登录之后开始以Shell控制主机
存、硬盘子系统、显示子系统、串并行接口、键盤等硬件情况的检测
程序,系统信息设置、开机加电自检程序和系统启动自举程序等
主板的RAM:保存各项参数的设定按次序查找引导设备,第一个有引 导程序的设备为本次启动设备
bootloader: 引导加载器引导程序(负责硬件bios和操作系统(内核)的桥梁)
Linux:功能丰富,提供菜单允许鼡户选择要启动系统或不同的内核版本;把用户选定的内核装
载到内存中的特定空间中,解压、展开并把系统控制权移交给内核
查看ext4文件系统的驱动:
1)光盘启动,进入rescue(救援)模式
修复grub的第1阶段故障:
修复grub的第1.5阶段故障:
1阶段是好的系统认为硬盘是好的可以启动,错误界面:
修复方法同修复1阶段的一样
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。