linux系统把系统分成了用户空间和内核空间,内核空间中所有的指令包括特权指令都可以执行
用户态的应用程序可以通过三种方式来访问内核态的资源:
(1)系统调用(2)库函数(3)Shell脚本
在其中主要有shell,应用程序,文件系统,进程管理,网络管理等部分
通过PCB来标识一个进程,其状态有:运行态、就绪态、阻塞态、创建态、终止态。
linux可以用schedule函数来进行进程调度,常用的调度算法有SCHED_RR:实时,基于优先级的轮转法 ;SCHED_FIFO :实时,先进先出算法 ;SCHED_NORMAL: 非实时,基于优先级的轮转法Linux进程调度时机有以下四种情况: 进程状态发生变化时 ;当前进程时间片用完时 ;进程从系统调用返回到用户态时 ;中断处理后,进程返回到用户态时
Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。用户程序使用的是线性的虚拟内存空间,无法直接操作物理内存,使用虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存)和使得用户程序编写时可以使用看起来连续的地址,还可以让用户程序使用比实际物理内存更大的地址空间。
物理内存按大小被分成页框,每块物理内存可以被映射为一个或多个虚拟内存页。这块映射关系,由操作系统的页表来保存,页表是有层级的。层级最低的页表,保存实际页面的物理地址,较高层级的页表包含指向低层级页表的物理地址,指向顶级的页表的地址,驻留在寄存器中。当执行地址转换时,先从寄存器获取顶级页表地址,然后依次索引,找到具体页面的物理地址。
负责管理网络资源,提供了通过网络与外部机器通信的能力。
中断分为可屏蔽中断和不可屏蔽中断,I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断,只有几个特定的危急事件才引起非屏蔽中断。如硬件故障或是掉电
在linux系统中一切都是文件,Linux系统启动时,首先挂载根文件系统,之后可以自动或手动挂载其他的文件系统,这些文件系统要挂载到挂载点上,与虚拟文件系统(Virtual File System)和通用块设备层(General Block Device Layer)建立联系。虚拟文件系统为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()
、read()
、write()
这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。
举一个读文件的例子以帮助我们更好的理解该系统:
(1)读文件本身是一个I/0操作,也是一个特权操作,需要调用lib中的sys_open 库函数向内核发起系统调用(2)触发系统调用后,通过 Trap 陷入内核态,同时设置好相应的中断向量号和参数(3)在中断向量表中找到对应的中断处理子程序do_sys_open并执行,这里有函数调用堆栈保证完成后可以回到之前的进程(4)在中断处理子程序中,首先通过中调用 getname() 从虚拟文件系统读取到需要的文件信息并通过内存管理将数据放到内核空间中,之后返回文件描述符fd到用户空间,在这个I/O过程中可能会有进程的调度过程,这时候通过进程管理暂停原进程而去调度执行另外的进程(5)在读文件完成后,通过中断通知的方式让进程管理系统调度原来的进程继续执行,系统调用返回结果给用户程序
我们将一个应用程序放入该系统模型中来系统性的梳理影响程序性能表现的因素:主要包括软件方面的因素和硬件方面的因素。
硬件方面主要的影响因素有CPU,内存,磁盘I/O,网络宽带:
(1)cpu的性能包括核心数、主频、cache 大小等都会影响应用程序的运行,同一个程序在在单处理器和多处理器中的执行性能可能有着很大的差别
(2)内存的内存频率、容量大小等也会影响程序的性能表现,其中容量不足还可能造成程序的错误
(3)磁盘I/O,也就是外存类型、传输速率、容量大小等,可能对于I/O密集型的程序的性能表现有着较大的影响
(4)网络宽带的传输速率,连接稳定性,延迟等对于需要进行网络通讯的应用程序影响重大
软件方面我们知道应用程序经过预处理、编译、汇编和链接最终成为一个单一可执行文件的程序,在系统中以进程的形式执行,可执行文件首先被装载到内存中,然后分配内存资源完成进程的创建,进程创建后处于就绪状态,等待分配 CPU 资源后才能执行,进程成功获得执行后,接下来的性能表现则更多地与应用程序本身的代码和它要完成的任务
在这其中主要的影响因素有:
(1)应用程序本身的规模大小,这会直接影响到程序装载的速度
(2)进程管理部分的进程调度策略,直接影响到处于就绪状态的进程何时以及如何拥有 CPU 资源
(3)如果应用程序需要频繁的访问系统资源,就需要通过系统调用进入内核态,内核态和用户态的切换对性能表现有很大影响
(4)程序中是否进行了大量的函数调用,当发生函数调用时,系统要维护每个函数的函数调用堆栈,这也需要性能开销,所以大量的函数调用以及太深的函数嵌套都会影响程序性能
(5)程序是否很好的利用了著名的局部性原理来更多的使用缓存,访问CPU 高速缓存远大于内存远大于外存,如果应用程序没有很好的使用局部性原理的话就会造成频繁的cache 缺失和缺页异常影响应用程序的性能表现
使用Linux性能分析工具和命令如netstat、vmstat、gprof、perf、top等可以分析是因为何种原因导致应用程序的性能表现受到影响
原文:https://www.cnblogs.com/edwinsmith/p/14782809.html