从系统的角度分析影响程序执行性能的因素

Posted Elaine?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从系统的角度分析影响程序执行性能的因素相关的知识,希望对你有一定的参考价值。

一、实验总结分析报告要求

1、请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,
并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。 2、然后将一个应用程序放入该系统模型中系统性的梳理影响应用程序性能表现的因素,并说明原因。 3、产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理,严禁引用任何资料(包括本课程的资料)造成文章虚长。

二、操作系统概述

1、操作系统运行机制

(1) 概述
两种不同性质的程序:一种是操作系统内核程序,一种是应用程序。
两种CPU状态:用户态与核心态
两种指令:特权指令与非特权指令
(2)时钟管理:计时,进程切换
(3)中断机制:提高cpu利用率
(4)原语:运行具有原子性,一气呵成
(5)系统控制的数据结构及处理

2、中断与异常

1)用户态与核心态切换.
用户态-->内核态:中断引起,硬件自动完成
内核态-->用户态:一条修改pwd的特权指令
(2)中断的分类。可分为内中断与外中断。其中外中断是指强迫中断,例如外设请求与人工干涉;内中断又称为异常,分为陷入(系统调用陷入指令)、故障(缺页)。

3、系统调用

1)系统调用是指用户在程序中调用操作系统提供的一些子功能。系统中各种共享资源都由操作系统统一掌握,所以凡是与资源相关的操作都需要通过系统调用的方式向操作系统
提出服务请求,并由操作系统代为完成。
(2)系统调用按功能分类:
设备管理、文件管理、进程控制、进程通信、内存管理
(3)系统调用示意图:

三、进程管理

1、概述

(1)进程定义:进程是由正文段(代码)、用户数据段(进程直接进行操作的所有数据, 以及进程使用的进程堆栈)和系统数据段(进程的控制信息)组成的一个动态实体。
(2)在系统数据段存放着进程控制块PCB,PCB是名为task_struct的数据结构,存放着进程的相关信息。进程创建时建立一个task_struct结构体,进程结束时销毁。
Linux在内存中专门开辟了一个空间来存放进程结构体PCB,与进程的内核堆栈一起,放在一个8KB的动态内存中,通过esp就能访问进程描述符。

2、进程的状态

1)运行态、就绪态、阻塞态、创建态、终止态

3、进程调度

1)非剥夺方式 分派程序一旦把处理机分配给某进程后 便让它一直运行下去,直到进程完成或发生某事件而 阻塞时,才把处理机分配给另一个进程。 
(2)剥夺方式 当一个进程正在运行时,系统可以基于某 种原则,剥夺已分配给它的处理机,将之分配给其它 进程。剥夺原则有:优先权原则、短进程、优先原则、 时间片原则。
(3)进程调度算法:先进先出、最短时间优先、优先级调度算法、时间片轮转算法、

四、内存管理

(1)Linux 采用虚拟内存技术管理系统内存。虚拟内存技术即每个进程都有独立的进程地址空间。当进程要求运行的时,不是将他的全部信息装入内存,而是将其一部分先装入内存,
另一部分暂时留在外存,进程在运行过程中,要使用信息不在内存时,发生中断,由操作系统将他们调入内存,以保证进程的正常运行。 (2)Linux 内部的地址的映射过程为根据逻辑地址找到线性地址,再根据线性地址找到对应的物理地址。 (3)Linux 内核通过 task_struct 结构体来管理进程,这个结构体包含了一个进程所需的所有信息。
task_struct 中有一个结构体 mm_struct,描述了一个进程的整个虚拟地址空间。每个进程正是因为都有自己的 mm_struct,才使得每个进程都有自己独立的虚拟的地址空间。

五、文件管理

1)文件系统:就是操作系统中实现文件管理的一组软件、被管理的文件以及为实施文件管理所需要的一些数据结构的总称。
(2)在Linux中一切皆文件,即在 Linux 系统中的所有东西都可以通过文件的方式访问、管理。
(3)虚拟文件系统(VFS),是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。
系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
(4)VFS文件模型如下图:
VFS是一种通用文件模型,包含两个接口,一个与用户连接,一个与底层的文件系统层(提供具体的文件结构实现)连接。不同文件系统通过mount(挂载、安装)到根文件系统中。
用户通过VFS提供的read(),write()等系统调用操作文件,VFS调用sys_read()、sys_write()。
VFS由以下对象组成:超级块对象(存放文件系统信息)、inode对象(FCB)、文件对象(已打开文件和进程的交互信息)、目录项对象(目录与文件的链接信息)。

 

 

六、举例说明(读文件)验证模型

(1)在控制台输入一个简单的ls命令,“按下键盘”的时候
(2)管理键盘的“硬件控制设备”向“中断控制器”发送中断请求,中断控制器根据发来的请求“生成中断向量号”告诉“cpu”,
(3)cpu会根据中断向量号执行“中断处理程序”,在程序里,会向屏幕打印字符,所以我们输入的命令出现在了屏幕上。

(4)之后Shell会fork一个子进程执行,fork是一个系统调用,执行系统调用的过程类似中断处理的过程。
(5)fork后出创建一个子进程,子进程创建后处于Runable状态,
(6)此时他等待处理机给他分配资源,进程给他分配资源后,这里就进行了上述的进程调度过程。
(7)由于子进程是复制过来的,所以他其实也是一个shell程序,他会执行exec系统调用,并将ls命令的可执行文件装入到内存里面,之后执行该命令。 (8)最后,从exec系统调用中返回。

七、将一个应用程序放入系统模型,分析影响应用程序性能表现的因素

1)编写一个c程序代码,里面有4个简单的函数,定义变量i,j并将i的值赋值给j,这4个函数的执行次数依次执行了三千万,六千万,九千万,一亿二千万次。
(2)查看这个程序执行时,各个函数的占用CPU的比例,查看程序的性能瓶颈。
(3)使用的测试工具是perf,perf是linux内核自带的工具,支持CPU PMU事件与软件事件计数,用于找到程序热点,找到程序性能瓶颈(CPU计算能力,cache利用率,内存访问,硬盘访问)
(4)Perf的使用:
"perf top":实时动态查看系统热点,函数热点,汇编热点
"perf stat":统计单个应用程序整个生命周期的硬软件事件数目
"perf record & perf record":统计程序各个模块、函数在整个生命周期中的性能数据
(5)perf的安装命令:
  
(6)输入sudo perf top查看整个系统:

a.从执行命令开始有6k个事件发生,下方是函数占用CPU的情况列表

b.第一列:函数占用CPU的比例

c.函数所属共享模块的名称

d.函数名称

 

(7)输入sudo perf top --call-graph graph查看单个应用程序:

a.第一列:该函数与子函数共同占用CPU的比例

b.第二列:只有该函数,不包括子函数的比例

c.函数所属共享模块的名称

d.函数名称

(8)输入回车键:

a.Annotate--查看函数的反汇编,及在汇编级的热点

b.Zoom into perf DSO查看当前DSO热点情况

c.Expand callchain展开一级调用关系

d.函数符号的内存映射情况

(9)输入sudo perf stat:统计单个应用程序整个生命周期的软硬件的事件数目 sudo perf stat dd if=/dev/zero of=/dev/null count=1000000 做的是硬盘复制的操作,将空符号复制到空文件一百万次。

 

(10)分析

上面4个是软件事件:占用CPU时间、上下文的切换、CPU迁移的次数、缺页次数

下面4个是硬件事件:cycle时钟周期、指令数、遇到的分支指令数、预测错误的分支指令数

#后面的是根据前面的计数得到的一些信息,如CPU利用率=占用CPU时间/消耗时间 IPC(每个周期执行的指令数目)=执行的指令数目 / cycle时钟周期数

最后是给出用户级与系统占用CPU的时间

 

 (11)perf record & perf report的使用的测试代码

 

 

 

(12)输入sudo perf record&report

a、编译程序(加-g) gcc -g -O0 mytest.c -o mytest

b、perf record perf record -a -g ./mytest 生成perf.data

 (13)perf report来查看结果(e展开看结果,c关闭)

 

 (14)perf report来查看结果(e展开看结果,c关闭) 发现hi占用CPU时间最多,其次是high\\medium\\little

 

(15)perf report来查看结果(e展开看结果,c关闭) 查看hi函数汇编级的代码

 

 八、总结

本学期上了孟老师与李老师的Linux操作系统课程,收益颇丰,对Linux操作系统的系统调用、中断处理、进程管理、进程切换、文件系统等知识,在系统内部是如何实现的有了更为深刻的理解。尤其是在课程中的一些实验课,每次都有认真做了,中间碰到一些问题并解决问题的过程都让我更深一步认识Linux系统。
感谢二位老师!

 

以上是关于从系统的角度分析影响程序执行性能的因素的主要内容,如果未能解决你的问题,请参考以下文章

从系统的角度分析影响程序执行性能的因素

实验总结分析报告:从系统的角度分析影响程序执行性能的因素

实验总结分析报告:从系统的角度分析影响程序执行性能的因素

从系统的角度分析影响程序执行性能的因素

精简的Linux以及从系统的角度分析影响程序执行性能的因素

从系统的角度分析影响程序执行性能的因素