Linux系统概念模型
在我眼里,Linux系统主要有如下部分组成
内存管理
-
虚拟内存:Linux把应用程序实际使用的虚拟地址以页为单位映射到物理地址,从而提高了内存资源的利用率;每个应用程序只能看到属于自己的统一的,连续的虚拟地址空间,从而保证了不同应用程序的隔离性,也降低了编程复杂度。同时,虚拟内存机制可以实现共享内存、写时拷贝、内存压缩、大页等等一系列优化。
-
页表与TLB:Linux中,每个进程都拥有一个页表,用于记录本进程的虚拟地址到物理地址的映射关系,为了减少页表的占用空间,Linux通常会使用多级页表,由此实现了页表项按需分配;为了加速虚拟地址到物理地址翻译的速度,MMU中包含了一个特殊的TLB缓存,缓存了虚拟页号到物理页号的映射关系,如果能在此缓存中找到所需要的映射,就免去了从内存读取所需页表项的代价。
-
页替换策略:常见的策略有FIFO,Second Chance,LRU,Clock,它们各有优缺点,目前衍生出了LRU-K,LIRS等更优化的策略。
-
物理内存分配:Linux内核本身的数据结构,如页表,task_struct
等都需要物理内存分配器来为其分配内存。物理内存分配器的优劣的重要评价维度是内存碎片和分配速度,对于大块内存,Linux使用伙伴系统;对于小内存,Linux使用SLAB分配器。
进程、线程与调度
- 进程:为了抽象出一个运行的程序,Linux引入了进程。
- 线程:针对进程间数据共享代价高,进程创建开销大的问题,Linux引入了线程作为更加轻量级的执行单元。
- 调度:Linux通过保存和恢复进程/线程运行中的上下文,使进程/线程可以暂停,切换,恢复,从而实现了它们对CPU资源的共享,Linux目前默认使用CFS调度器。
Traps及系统调用
- Traps:系统调用、异常、以及设备中断会使CPU把原来的执行序列放在一边,转而强制执行一段特殊的代码来处理事件,这三种事件处理统称为Traps。
- 系统调用:为了保证内核安全、更好的管理和抽象硬件资源,Linux给用户提供了系统调用来执行完成特定工作的内核态代码。
中断与设备管理
- 中断机制赋予了设备通知CPU的能力。设备通过向CPU发出中断来打断CPU的执行,使得CPU去处理这个中断。
- 设备管理涉及到设备数据传输、设备识别、设备中断处理、设备驱动模型。
- Linux有三种基本设备抽象:字符设备,块设备以及网络设备;Linux也定义了一套统一的设备驱动模型,使驱动开发流程更加方便规范。
文件系统
- 文件系统是操作系统对于数据的组织和存取的抽象。
- Linux的文件系统是两层结构,虚拟文件系统负责对多种文件系统进行管理和协调,允许它们在同一个操作系统上共同工作;其下面是各种特异化的文件系统,Linux支持多种文件系统,如EXT3,HPFS,EXT4,VFAT等
运行过程举例
读文件
读文件在Linux中大致会经历一下流程
- 使用系统调用
read
,提供一个文件描述符,以及用户态buffer的首地址。
- 内核根据
read
中提供的文件描述符在进程的打开文件表中找出该文件描述符对应的file
数据结构
- 如果需要读的内容所在的块在内存中,直接从内存中块的缓存区拷贝到用户态buffer。
- 否则,会触发调用磁盘的读,磁盘将所需要的块读进内存的缓存区后,再将相应内容拷贝到用户态buffer。
应用程序性能分析
性能分析通常有以下工具
-
perf,配合火焰图
-
top
-
netstat
-
vmstat
-
gprof
从上面描述的Linux系统模型,影响应用程序性能表现的因素可能有:
- 应用层内存分配器的性能,如
malloc
对比tcmalloc
,jemalloc
性能有差距
- 内核的CPU调度算法,页置换算法对应用程序的workload来说是否合适
- 应用程序的workload是否会导致抖动现象,swap大量换入换出,造成性能低下
- 应用程序是否对缓存,TLB友好,尽量减少缓存与TLB的刷新
- 应用程序是否执行了大量用户态到内核态的切换
- 应用程序是否使用更新的Linux技术来避免额外开销,如Linux新支持的
io_uring
可以支持异步操作,并减少读写时用户态到内核态,内核态到用户态的额外内存拷贝。
- 应用程序是否采用流水线,多线程,异步编程等技术,来使CPU与磁盘的利用率达到较高水平
从系统的角度分析影响程序执行性能的因素
原文:https://www.cnblogs.com/Led-Zeppelin/p/14753586.html