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

一、Linux系统模型

Linux是一个类Unix的操作系统,它是连接了软件和硬件的一种系统软件,用来管理软硬件资源,与硬件交互,并且能给用户提供一个良好的执行环境。Linux系统有四个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了最基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。

其核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
由以上梳理出来的Linux系统概念模型如下:

可以看出,linux系统主要包括进程控制子系统、文件子系统、设备驱动程序、存储管理等模块,分别对应linux的进程管理、文件系统管理、设备驱动管理、内存管理功能。
对于进程管理
进程控制块PCB中容纳了一个进程的所有信息,是系统对进程进行管理和控制的有效手段,是系统实现进程调度的主要依据。
状态转化图如下所示:

除了进程调度,进程管理还包括进程通信、进程控制等。
对于内存管理,包括内存分配和虚拟内存管理:
当应用进程(如c语言使用malloc)申请内存时,调用系统API,系统从用户态进入内核态,在Linux系统上,程序被载入内存时,内核为用户进程地址空间建立了代码段、数据段和堆栈段,在数据段与堆栈段之间的空闲区域用于动态内存分配。 进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。brk()是一个非常简单的系统调用,只是简单地改变mm_struct结构的成员变量brk的值。 mmap系统调用实现了更有用的动态内存分配功能,可以将一个磁盘文件的全部或部分内容映射到用户空间中,进程读写文件的操作变成了读写内存的操作。
当内存分配完成,系统从内核态返回用户态。
对于文件系统管理

第一层为C标准库,包含open、write、close等系统调用接口。
第二层为VFS接口层。该层有两个接口:一个是与用户的接口,一个是与特定文件系统的接口。VFS与用户的接口将所有对文件的操作定向到相应的特定文件系统函数上。VFS与特定文件系统的接口主要是通过vfs-operations来实现的。
第三层是具体文件层,提供具体文件系统的结构和实现,包括网络文件系统,如NFS。
对于设备驱动管理,设备驱动程序是操作系统最基本的组成部分,是linux内核的一部分,一般情况下可以将驱动程序设计为一个模块,在需要时动态加载到内核中。 Linux将硬件设备看作一个特殊的文件来操作,该文件被称为设备文件;系统通过对设备文件的读写等操作,实现对外设的读写等操作驱动是应用软件和硬件的桥梁,它使得应用软件只需要调用系统软件的应用 编程接口(API)就可让硬件去完成要求的工作。

二、举例验证模型

以读写文件为例,其中读文件分为如下几个步骤:
用户程序调用库函数read向内核发起读文件请求。
触发系统调用接口sys_read(),获得当前进程的控制块。
系统调用read()会触发相应的文件子系统的read()函数。
然后找到file结构,再找到fd数组,以fd为索引找到对应项,然后找到系统打开文件表。
执行系统打开文件表里面的file_operation里面的read函数来读文件。

三、影响应用程序执行性能的因素

1. CPU

CPU是操作系统稳定运行的根本,CPU的速度与性能在很大程度上决定了系统整体的性能,因此,CPU数量越多、主频越高,应用程序得到调度的可能性就越大,执行效率也越高。

2. 内存

内存的大小也是影响Linux性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,还会导致资源浪费。Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,也会造成内存资源浪费。
由于处理器寻址范围的限制,在32位Linux操作系统上,应用程序单个进程最大只能使用4GB的内存,这样以来,即使系统有更大的内存,应用程序也无法“享”用,解决的办法就是使用64位处理器,安装64位操作系统。在64位操作系统下,可以满足所有应用程序对内存的使用需求 ,几乎没有限制。
可能出现内存性能瓶颈的应用有NOSQL服务器、数据库服务器、缓存服务器等,对于这类应用要把内存大小放在主要位置。

3. 磁盘I/O性能

磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能,比如常见的磁盘RAID技术。
通过RAID技术组成的磁盘组,就相当于一个大硬盘,用户可以对它进行分区格式化、建立文件系统等操作,跟单个物理硬盘一模一样,唯一不同的是RAID磁盘组的I/O性能比单个硬盘要高很多,同时在数据的安全性也有很大提升。
通过了解各个RAID级别的性能,可以根据应用的不同特性,选择适合自身的RAID级别,可以保证应用程序在磁盘方面达到最优性能。

4. 网络宽带

Linux下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。

5. 应用程序本身

如果一个应用程序存在bug,即使所有其他方面都达到了最优状态,整个应用系统还是性能低下,所以应用程序本身代码的不合理也会影响它的性能表现。比如,for循环次数过多、作了很多无谓的条件判断,相同逻辑重复多次等。

posted @ 2021-05-11 10:02  zxw600  阅读(204)  评论(0)    收藏  举报