首页 > 其他 > 详细

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

时间:2021-05-15 20:27:45      阅读:38      评论:0      收藏:0      [点我收藏+]

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

一、Linux系统概念模型

Linux系统概念模型主要由:进程管理、内存管理、中断和异常、文件系统等几部分组成。

技术分享图片

1.1 进程管理

? 进程的定义:程序运行的一个实例

? 进程的特征:一方面竞争并占用系统资源(比如设备和内存),向系统提出各种请求服务;进程另一方面是基本的调度单位,任何时刻只有一个进程在CPU上运行。

? 进程实体的组成:① 进程描述符;② 进程专用的系统堆栈空间; ③ 供进程执行的程序段; ④进程专用的数据段和用户堆栈空间。

? 进程状态主要分为可运行状态、可中断的等待状态、不可中断的等待状态、暂停状态、跟踪状态、僵死状态和僵死撤销状态。

? 进程管理主要负责管理进程的创建、销毁以及状态变换。

? Linux通过保存和恢复进程/线程运行中的上下文,使进程/线程可以暂停,切换,恢复,从而实现了它们对CPU资源的共享,Linux目前默认使用CFS调度器。

1.2 内存管理

? Linux 采用了“虚拟内存”的内存管理方式。Linux 将内存划分为的“内存页”。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制:

  • 虚拟内存:Linux把应用程序实际使用的虚拟地址以页为单位映射到物理地址,从而提高了内存资源的利用率;每个应用程序只能看到属于自己的统一的,连续的虚拟地址空间,从而保证了不同应用程序的隔离性,也降低了编程复杂度。同时,虚拟内存机制可以实现共享内存、写时拷贝、内存压缩、大页等等一系列优化。
  • 页表与TLB:Linux中,每个进程都拥有一个页表,用于记录本进程的虚拟地址到物理地址的映射关系,为了减少页表的占用空间,Linux通常会使用多级页表,由此实现了页表项按需分配;为了加速虚拟地址到物理地址翻译的速度,MMU中包含了一个特殊的TLB缓存,缓存了虚拟页号到物理页号的映射关系,如果能在此缓存中找到所需要的映射,就免去了从内存读取所需页表项的代价。
  • 页替换策略:常见的策略有FIFO,Second Chance,LRU,Clock,它们各有优缺点,目前衍生出了LRU-K,LIRS等更优化的策略。
  • 物理内存分配:Linux内核本身的数据结构,如页表,task_struct等都需要物理内存分配器来为其分配内存。物理内存分配器的优劣的重要评价维度是内存碎片和分配速度,对于大块内存,Linux使用伙伴系统;对于小内存,Linux使用SLAB分配器。

1.3 中断和异常

? 中断:中断是指 CPU 对系统发生某事件时的这样一种响应。CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序,执行完后,再返回到原程序的断点处继续执行。中断根据来源,可进一步分为外中断和内中断:

  • 外中断:由于外部设备事件所引起的中断,如IO中断。
  • 内中断:由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。

? 中断和异常的区别:

  • 异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
  • 中断则是由于系统中某事件引起的,该事件与现行指令无关。

1.4 文件系统

? Linux 系统下的各种事物都可看作是文件,比如说文档、目录、键盘、打印机以及 IPC 等输入/输出资源都是定义在文件系统空间下的字节流。Linux 以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。

? 这些种类繁多的文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。一切皆文件和文件目录树的资源管理方式一起构成了Linux的文件体系,让Linux操作系统可以方便使用系统资源。

? Linux文件体系主要在于把操作系统相关的东西用文件这个载体实现:文件系统挂载在操作系统上,操作系统整个系统又放在文件系统里。

? Linux 的文件系统是两层结构,虚拟文件系统负责对多种文件系统进行管理和协调,允许它们在同一操作系统上共同工作;其下面是各种特异化的文件系统。

二、运行过程举例

这里以读文件为例。

  1. 进程调用库函数向内核发起读文件请求;

  2. 内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;

  3. 调用该文件可用的系统调用函数read();

  4. read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;

  5. 在inode中,通过文件内容偏移量计算出要读取的页;

  6. 通过inode找到文件对应的address_space;

  7. 在address_space中访问该文件的页缓存树,查找对应的页缓存结点:

    • 如果页缓存命中,那么直接返回文件内容;

    • 如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;

  8. 文件内容读取成功。

三、应用程序性能分析

? 应用程序的性能很大程度上跟存储方式和系统中断有着密切的关系,不同的存储方式可能有着不同的性能开销,例如对于一个二维数组,有两种方式进行数据保存,一种是行优先存储,一种是列优先存储:

package main

import (
	"fmt"
	"time"
)

//第一种代码
func First() {
	test := [1000][1000]int{}
	for i := 0 ; i < 1000; i++{
		for j := 0 ; j < 1000 ; j++{
			test[i][j] = 1;
		}
	}
}
// 第二种代码
func Second() {
	test := [1000][1000]int{}
	for j := 0 ; j < 1000; j++{
		for i := 0 ; i < 1000 ; i++ {
			test[i][j] = 1;
		}
	}
}
// 测试
func test(a func()) {
	start := time.Now()
	a()
	end := time.Now()
	fmt.Println(time.Duration(end.Sub(start)) * time.Millisecond)
}

func main() {
	test(First)
	test(Second)
}

? 测试结果:

技术分享图片

? 由以上结果可以发现:方法一比方法二快。

? 原因:由于数组是连续存储的,且根据Linux的内存管理机制,可以得到,第一种以行优先为主的存储方式相对第二种以列优先的存储方式拥有更少的缺页中断,从而拥有更少的开销,从而性能更好。

四、影响Linux系统性能的因素

4.1 硬件因素

4.1.1 CPU

? CPU 的速度与性能很大一部分决定了系统整体的性能,因此 CPU 数量越多、主频越高,服务器性能也就相对越好。但事实也并非完全如此,目前大部分 CPU 在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因而可以利用处理器的超线程特性提髙系统性能。

4.1.2 内存

? 内存的大小也是影响 Linux 性能的一个重要的因素。内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,会导致资源浪费。

4.1.3 磁盘读写(I/O能力)

? 磁盘的 I/O 能力会直接影响应用程序的性能。比如说,在一个需要频繁读写的应用中,如果磁盘 I/O 性能得不到满足,就会导致应用的停滞。

4.1.4 网络带宽

? Linux 下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞;而稳定、高速的带宽,可以保证应用程序在网络上畅通无阻地运行。

4.2 软件因素

? 软件因素重多,比如说:操作系统的进程调度算法、程序自身的算法以及所使用的数据结构、应用程序的链接方式等等都会对程序的运行效率造成影响。

总结

? 本文总结了Linux操作系统的概念模型,并针对此概念模型的正确性、自洽性做了例子的分析。

? 通过一学期的学习,使我初步了解了Linux系统,激发了我对Linux系统学习的兴趣。今后会更加深入了解Linux系统。

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

原文:https://www.cnblogs.com/mazijie666/p/14772082.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!