实验总结分析报告:从系统的角度分析影响程序执行性能的因素
Posted go程序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验总结分析报告:从系统的角度分析影响程序执行性能的因素相关的知识,希望对你有一定的参考价值。
linux系统模型
首先,从功能上,我们将linux内核划分为五个不同的部分,分别是
(1)进程管理:主要负载CPU的访问控制,对CPU进行调度管理;
(2)内存管理:主要提供对内存资源的访问控制;
(3)文件系统:将硬盘的扇区组织成文件系统,实现文件读写等操作;
(4)设备管理:用于控制所有的外部设备及控制器;
(5)网洛:主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能;
每个部分分别处理一项明确的功能,又向其它各个部分提供自己所完成的功能,相互协调,共同完成操作系统的任务。
Linux内核架构如下图所示:
我们不妨就进程管理来观察linux系统是如何自洽高效的运行的:
进程的运行与管理
一个进程区别于程序的显著区别就是进程控制块,进程控制块是操作系统中最重要的数据结构之一,linux中定义为task_struct结构体,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,包括进程标识,进程状态,程序计数器(PC),以及进程的资源清单等信息(包括所需的以及以分配的),操作系统借助PCB(进程控制块)来完成进程的并发与调度处理。
Linux中我们通常通过进程状态来描述整个进程的生命周期,同时方便对进程进行调度和管理。
首先,当我们通过fork创建一个新进程时,我们需要分配进程的id,进程控制块及其所需要的运行资源包括堆栈等,此时我们置进程为就绪状态(一但获得CPU就可立即运行),当我们的就绪进程通过schedule()函数获得CPU的调度时,执行进程的计算任务,一旦发生等待事件的到来,或者其它进程抢占,CPU时间片耗尽,前者我们使进程进入睡眠状态,睡眠状态包括TASK_UNINTERRUPTIBLE(深度睡眠),该状态不能被singal信号唤醒,只能等待所需要的资源准备好由wake_up()函数唤醒,而TASK_INTERRUPTIBLE(浅度睡眠)可以被singal信号唤醒,设置为TASK_INTERRUPTIBLE的进程醒来的第一时间会检测是否由singal信号的到来,而不必等待I/O事件的完成,转而去处理singal信号,大多数情况下我们只需要使用TASK_INTERRUPTIBLE状态即可,但是在NFS服务器或者磁盘读的情况下,我们就需要TASK_UNINTERRUPTIBLE(深度睡眠),否则会导致application break(用于缺页等情况嵌套读盘导致)。后者会使正在运行的进程继续转为TASK_RUNNING就绪状态,等待CPU的调度。同时进程还可进入TASK_STOPPED暂停状态和TASK_TRACED追踪状态,前者调用操作系统SIGSTOP信号,后者如我们追踪程序时使用的断点即是TASK_TRACED状态。当我们进程正常退出后会释放所占用的资源与进程控制块,进入EXIT_DEAD状态,立即将该进程彻底释放。一但我们不能正常释放进程的task_struct(进程控制块),此时进程进入EXID_ZOMBIE状态,如果此时该进程的父进程还未退出,此时该进程称为僵尸进程,我们可以通过父进程调用wait或者waitpid释放子进程task_struct,完成子进程的彻底释放,而如果子进程的进程控制块还未释放,而父进程已经退出,此时,被称为孤儿进程,我们只能通过init(1号进程,第一个用户进程,是所有进程的父进程)调用waitid完成子进程task_struct的释放。
进程间通过信号量,管道,操作系统信号等方式来完成进程的异步和同步,同时运用中断和定义各种调度算法来保证进程有序公平的运行和切换。
系统调用提供linux各个模块对进程管理的支持
一个进程的创建及运行不可能只涉及自身,他还需要操作系统提供的内存,文件,设备管理和网络功能,当进程需要这些模块进行支持时,我们就要进行系统调用,通过系统调用来利用相应模块为我们创建文件,申请内存或者设备,网络收发等功能。
首先,linux操作系统为了保护硬件资源和保证系统正常稳定及有序的工作,将进程分为用户态和内核态,用户态进程无法访问操作系统的数据结构,程序与硬件资源,必须通过系统调用切换至内核态,才能获得访问的权力。例如我们fork()进程时,我们会由用户态切换至内核态,调用sys_fork()来为我们申请id和进程控制块。
当进程需要使用操作系统其他模块的功能时,我们都必须转为内核态,通过系统调用来获得其他模块的支持,如创建文件,读写文件,网络报文收发等,同时其他模块又能通过中断和操作系统信号来通知进程所需要的资源已经准备完毕,从而保证了进程的正常有序的运行,使操作系统成为一个有效自洽的管理者。
如何提供linux进程的运行效率
(1)进程管理方面
尽量减少CPU的抢占与调度,避免进程切换时上下文的开销。避免其他进程因为资源竞争而导致的阻塞问题。
(2)内存管理方面
提高程序访问资源的时间局部性和空间局部性,例如数组的行优先和列优先存储,减少缺页中断带来的磁盘开销。
(3)文件管理方面
优化文件管理,使用写时复制技术(适用于多读少写),使用写缓冲,减少磁盘访问次数,选用合适的磁盘调度算法,减少寻道时间等。
(4)设备管理方面
使用缓冲技术,减少CPU与I/O设备速度不匹配的问题,使用虚拟设备技术,SPOLLING(假脱机技术),将低速I/O设备上的数据传送到高速磁盘上,使CPU与I/O设备能同时运行,提高效率。
(5)网络管理方面
优先使用epoll的I/O多路复用方式,减少select与poll的轮询时间与拷贝fd的时间,使用零拷贝技术,当用户进程不需要访问报文数据时,减少不必要的用户和内核之间的数据拷贝,提高效率。
以上是关于实验总结分析报告:从系统的角度分析影响程序执行性能的因素的主要内容,如果未能解决你的问题,请参考以下文章