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

1 linux的精简系统模型

  Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。

   Linux是操作系统的一类,而操作系统中最重要的一个功能就是系统调用,而系统调用会涉及到内核态和用户态,Linux将内存低地址部分设置为内核空间,高地址部分设置为用户空间,具体如下。

    

 

 

   有了用户空间和内核空间,整个linux内部结构可以分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间。

 

    

 

 

 

2 进程管理

    进程的特征

      动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
      并发性:任何进程都可以同其他进程一起并发执行
      独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
               异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
      结构特征:进程由程序、数据和进程控制块三部分组成。
    
    进程的状态
    

      创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。把此时进程所处状态称为创建状态。

      就绪状态:进程已经准备好,已分配到所需资源,只要得到CPU就能够运行。

      执行状态:进程被调度后,进程进入执行状态。

      阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用。

      终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。
      需要注意的是,在Linux中,进程的就绪态和运行态都用TASK_RUNNING来表示,具体区分他们的方法是看他们是否得到了CPU。

    进程调度算法:主要是用来从进程就绪队列中选择一个进程来分配CPU。

      1 先来先去服务 2.时间片轮转法 3.最短进程优先 4.最高响应比优先 5 多级反馈队列算法。

      在Linux中,对于实时进程和普通进程采用的算法一般不一样,对于前者常常采用先来先服务和时间片轮转算法;对于后者一般采用基于权重的优先级调度算法,且一般优先级为(100- 139 越高优先级越低)。

 

3 内存管理

    连续内存分配, 意思就是分配给程序的内存在物理上是连续的。

      连续内存分配算法有首次适配,最佳适配,最差适配。

    非连续内存分配, 分配给程序的内存在物理上可以不是连续的。 

      非连续内存分配主要是通过分段和分页来完成的。

    虚拟内存

      把程序中的一部分放入到内存中,对程序员透明。可以根据内存的使用情况,动态的对程序部分内容在内存与外存中进行交换。

      主要的原理是基于局部性原理,大致思想是1现在被访问的地址将来一段时间内还有可能再次被访问到 2 现在执行的指令将来一段时间还有可能再次执行。以上两点分别对应空间局部性和时间局部性。

    为了可以使用虚拟内存,需要进行内存和外存的交换,存在一些页面置换算法。

      最优页面置换算法(OPT) 先进先出算法(FIFO) 最近最久未使用(LRU) 时钟页面置换算法(Clock) 最不常用算法(LFU)

4 中断

  中断是计算机很重要的一个概念,有了中断极大的提高了系统的吞吐量和资源的利用率。

  中断主要分为外中断和内中断,外中断是发生在CPU外部的中断(比如I/O请求), 内部中断主要是CPU内部的中断(比如缺页中断), 同时内中断也叫做异常。

  内中断的例子 

    有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个内部中断信号。

     执行“陷入指令”,意味着应用程序主动地将CPU控制权还给操作系统内核。“系统调用”就是通过陷入指令完成的。

  在linux中,比较重要的一条指令是陷入指令 通过int $0x80或者syscall来调用,达到从用户态向内核态的转变。

 5 文件管理

  Linux中一切都是文件,包括硬件设备,可以通过管理文件来对计算机的各种资源进行管理。

  虚拟文件系统(Virtual File System,简称VFS)是Linux内核的子系统之一,它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()read()write()这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。

  举个例子,Linux用户程序可以通过read() 来读取ext3NFSXFS等文件系统的文件,也可以读取存储在SSDHDD等不同存储介质的文件,无须考虑不同文件系统或者不同存储介质的差异。

 6 影响应用程序表现性能的因素分析

   从以上几个操作系统的功能,我们可以得出影响应用程序表现性能的因素有以下几个。

    1 内存

      因为程序都是在内存中运行的,所以如果内存越大的话,能够运行的程序越多,发生内存交换的概率就越小,自然的程序的运行效率就越高。

    2 cpu

      CPU的个数也起到了很关键的作用,如果CPU的个数很少,那么在很多进的情况下,某些进程的等待时间就会变的很长。多核情况下可以减少进程的等待时间。

    3 磁盘I/O

      当发生了缺页中断需要进行外存和内存的交换的时候,磁盘I/O也会影响应用程序的表现性能。或者该应用程序需要进行很多的读写磁盘操作,磁盘I/O影响因素很大。

    4 网络带宽

      现在都是web应用,如果网络带宽不好,导致延迟较高,那么应用程序的性能也会变差。

    5 各种算法 

      对于不同的应用程序来说,如果选择了不合适的算法,比如页面置换算法,进程调度算法等等,也会影响应用程序的性能。

 7 总结 

  感谢李老师和孟老师对这门课程的付出,让我学到了很多,比如系统调用,以前仅仅是了解到系统调用这个层面上,现在知道了更加底层的原理,会执行syscall函数来进入内核态。Linux这门课程让我对操作系统有了更加清晰的理解,我以后会在编写代码的时候多思考,多考虑底层,编写出高质量的代码! 再次感谢老师们的付出!

  

posted @ 2021-05-18 13:28  游忍  阅读(451)  评论(0)    收藏  举报