Linux内核知识 (详解在注释里面,图片加载需要时间)
2023-07-04 08:48:55 0 举报
AI智能生成
知识要点和原理解析,详细信息和图片均在黄色图标的注释中,鼠标移动到黄色图标上即会显示,图片加载有时较慢。
作者其他创作
大纲/内容
用户态、内核态
C P U 指令集
C P U 指令集 权限分级
用户态与内核态简介
用户态与内核态的空间
虚拟内存
用户态与内核态的切换
内核架构图
什么情况会导致用户态到内核态切换
系统调用
异常
中断
文件系统
一切皆文件
磁盘结构
盘面
磁道
扇区
磁盘的基本单位
块
文件系统操作文件的最小单位
页(并非磁盘的概念,属于内存层面)
内存的基本单位
Linux文件系统
分为两层
VFS(虚拟文件系统)
VFS在linux架构中的位置
具体文件系统
虚拟文件系统四大对象
1、超级块
2、索引节点:inode
inode描述
一个inode可以有多个文件名(目录项:dentry)来对应它
inode能描述文件占用的块数
inode描述了文件大小和指向数据块的指针
通过inode实现文件的逻辑结构和物理结构的转换
inode怎样生成的?
inode和文件的关系?
3、目录项:dentry
目录项和索引节点的关系:多对一
目录项和目录是一个东西吗?
4、逻辑块
文件数据是如何存储在磁盘的?
inode保存指向逻辑块的指针:一对多
文件分配方式
连续分配
优点
缺点
链式分配
隐式链接
优点
缺点
显式链接
优点
缺点
索引分配
优点
文件的创建、增大、缩小很方便
不会有碎片的问题
支持顺序读写和随机读写
缺点
如果文件很大
链式索引块
多级索引块
空闲空间的管理
空闲表法
优点
缺点
碎片空间
空闲链表法
优点
无碎片空间
缺点
不能随机访问,工作效率低
数据块的指针消耗了一定的存储空间
位图法
索引节点、目录项以及文件数据关系图
文件的存储
块组
目录的存储
内存管理
虚拟内存、内存管理单元(MMU)、物理内存
映射关系管理
分段
分段机制会把程序的虚拟地址分成 4 个段
好处
能产生连续的内存空间
不足之处
内存碎片
内存交换的效率低
分页
怎么解决分段的内存碎片、内存交换效率低的问题?
如果内存空间不够:LRU
虚拟地址和物理地址是如何映射的?
举例
简单的分页有什么缺陷呢?
多级页表
二级页表空间分析
局部性原理
不分级为何无法节省内存
页表缓存TLB(Translation Lookaside Buffer)
页、页表、和页表元素 PTE 的概念和关系
虚拟页为何有会是否已经被缓存在主内存中一说?
分析 PTE 的内部构造
CPU 内存访问过程
内存回收
三种回收方式
1、回收内核中的缓存
2、swap 机制
3、触发 OOM(Out Of Memory) 机制
swap机制原理
哪些进程的内存交换到硬盘中?
匿名内存页(数据段、堆段 和 栈段)
LRU 内存淘汰算法
主要构成
active_list
inactive_list
PG_referenced标志位
流程
申请一个匿名内存页
匿名内存页被进程访问
内存淘汰过程
活跃链表 的内存页也有衰退的过程
DMA
没有DMA以前的数据获取
整个数据的传输过程,都要需要 CPU 亲自参与搬运数据的过程,CPU阻塞
DMA:直接内存访问(Direct Memory Access)
弊端:四次上下文切换 + 四次拷贝。
Page cache与Buffer cache
Page Cache
缓存文件的页以优化文件IO
以Page为单位,每页4k,缓存文件内容
文件读写流程
读Cache
写Cache
触发脏数据刷新到磁盘的条件
超时
脏数据占用内存空间过大
Buffer cache
缓存块设备的块以优化块设备IO
两类缓存的逻辑关系
内存不够用时
两类缓存的演进历史
第一阶段:仅有Buffer Cache
第二阶段:Page Cache、Buffer Cache两者并存
问题:冗余存储
第三阶段:Page Cache、Buffer Cache两者融合
零拷贝
Zero-copy 能做什么
减少甚至完全避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作,从而减少用户态 -- 内核态上下文切换带来的系统开销
减少甚至完全避免操作系统内核缓冲区之间进行数据拷贝操作
帮助用户进程绕开操作系统内核空间直接访问硬件存储接口操作数据
利用 DMA 而非 CPU 来完成硬件接口和内核缓冲区之间的数据拷贝,从而解放 CPU,使之能去执行其他的任务,提升系统性能。
主要分为三类
减少甚至避免用户空间和内核空间之间的数据拷贝
绕过内核的直接 I/O
内核缓冲区和用户缓冲区之间的传输优化
传统的 I/O 读写
四次用户态/内核态切换,四次数据拷贝(两次CPU、两次DMA)
应用场景
java的NIO
Netty
kafka
零拷贝计术
mmap
mmap原理
读写操作
读
写
mmap 具体原理
1、分配地址:进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域
2、完成映射:调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系
3、进程读写:进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝
特征
4次用户态和内核态切换
3次数据拷贝
优缺点
优点
简化用户进程编程
读写效率提高:避免内核空间到用户空间的数据拷贝
避免只读操作时的 swap 操作
节约内存
什么情况下使用去访问文件会更高效
对文件执行随机访问时
多个进程同时访问同一个文件时
缺点
数据传输过程中依然需要一次 CPU 拷贝
内存映射技术是一个开销很大的虚拟存储操作
由于 mmap 使用时必须实现指定好内存映射的大小,因此 mmap 并不适合变长文件
特殊情况
尽管可以减少一次 I/O 拷贝,但由于的实现很复杂,调用将会带来额外的开销,因此在一些情况下,没有使用的必要
访问小文件时,直接使用传统io或将更加高效
单个进程对文件执行顺序访问时(sequential access),使用几乎不会带来性能上的提升
mmap 的主要额外开销为
mmap 等调用的开销
缺页中断的开销
页面首次使用触发的分配和清零开销
场景
多个线程以只读的方式同时访问一个文件
mmap 非常适合用于进程间通信
mmap 虽然比 sendfile 等机制多了一次 CPU 全程参与的内存拷贝,但是用户空间与内核空间并不需要数据拷贝,因此在正确使用情况下并不比 sendfile 效率差;
代码
sendfile
DMA的四次切换+及四次拷贝
问题:如果数据没有发生修改,只是传输
sendfile函数
避免了内核缓冲区和用户缓冲区之间的拷贝
流程
sendfile+DMA scatter/gather
流程
正在的零拷贝
Socket缓冲区
进程和线程
进程
进程的概念
进程的状态
五状态模型
七状态模型
进程的控制结构
PCB
每个 PCB 是如何组织的?
进程的切换
进程上下文切换有的场景
线程
线程的上下文切换
线程是不是属于同一个进程
不属于同一进程
同一进程
进程调度
什么时候调度进程
以什么原则来调度进程
进程调度算法(可以采用的调度策略)
先来先服服务
时间片轮转
需根据业务场景配置合适的时间片
最短作业优先
最短剩余时间优先
优先级调度
多级反馈队列调度
CFS:Linux的完全公平调度
那CFS应该什么时候进行任务切换呢?
示例
任务最小时间片:min_granularity
给任务分配权重
进程间通讯
多路复用
文件描述符
fd 与 socket 关系
从阻塞 I/O 到 I/O 多路复用
同步/异步、阻塞/非阻塞
阻塞非阻塞
同步异步
简单的记忆方法
Java 中的BIO,NIO和AIO
BIO同步阻塞
NIO同步非阻塞
AIO异步非阻塞
小结
IO模型详解
IO操作
IO操作分为两种动作
IO调用:IO调用是由进程(应用程序的运行态)发起
IO执行:IO执行是操作系统内核的工作
两个过程
准备数据阶段
拷贝数据阶段
IO过程包括以下几个步骤
阻塞IO模型
非阻塞IO模型(NIO)
非阻塞IO的流程
存在问题
IO多路复用模型
核心思路
IO多路复用之select
优点
缺点
IO多路复用之poll
poll解决了连接数限制问题
IO多路复用之epoll
函数
epoll_create是创建一个epoll句柄,每个进程只调用一次
epoll_ctl是注册要监听的事件类型,每个socket事件创建只调用一次
epoll_wait则是等待事件的产生。类似select,等待有就绪的fd,需要调用多次
epoll惊群现象(重要)
信号驱动IO模型
关于ET、LT两种工作模式(重要)
水平触发level trigger LT(状态达到)
边缘触发edge trigger ET(状态改变)
选择
IO 模型之异步IO(AIO)
同步阻塞IO
适合的场景
优缺点
优点
并发量较少的网络通信场景较高效
应用程序开发简单
缺点
不适合并发量较大的网络通信场景
当使用阻塞 I/O 时,需要使用多线程来处理多个文件描述符
同步非阻塞IO
优缺点
优点
在内核IO数据准备阶段不会阻塞应用线程,适合对线程阻塞敏感的网络应用
缺点
轮询查询内核IO数据状态,耗费大量CPU,效率低
需要不断轮序,增加开发难度
每次发起系统调用,只能检查一个文件描述符是否就绪。当文件描述符很多时,系统调用的成本很高(遍历、每次都要用户态-内核态切换)
多路复用
多路复用的基本工作流程
linux三种状态管理器
select
poll
epoll
并发连接不高的情况下,多线程+阻塞I/O方式可能性能更好
主要优点
可以通过一次系统调用,检查多个文件描述符的状态
缺点
I/O 多路复用引入了一些额外的操作和开销,性能更差
优点
但是好处是用户可以在一个线程内同时处理多个 I/O 请求。如果不采用 I/O 多路复用,则必须通过多线程的方式,每个线程处理一个 I/O 请求。后者线程切换也是有一定的开销的。
进程阻塞是否占用cpu?
创建socket
工作队列
等待队列
唤醒进程
内核接收网络数据全过程
接收数据
唤醒进程
多路复用-SELECT
源码
select函数
select的流程
优缺点
优点
跨平台,几乎所有平台都支持
时间精度高,ns 级别
缺点
单个进程能够监视的文件描述符的数量存在最大限制
时间复杂度
内存拷贝
多路复用-poll
多路复用-epoll
基于事件驱动的I/O方式
API
int epoll_create(int size)
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
epoll比select/poll的优越之处
epoll初始化时
epoll高效主要原因之一
流程简介
原理和流程
1、epoll_create
2、epoll_ctl
3、接收数据
4、epoll_wait
实现细节
就绪队列数据结构
epoll_wait两种触发方式(有事件发生时触发)
水平触发(LT)
边缘触发(ET)
select、poll、epoll对比
使用MMAP内存映射技术
0 条评论
下一页