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

作业要求

1、请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。

2、然后将一个应用程序放入该系统模型中系统性的梳理影响应用程序性能表现的因素,并说明原因。

3、产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理,严禁引用任何资料(包括本课程的资料)造成文章虚长。

 

1、精简的Linux系统概念模型

Linux操作系统主要涉及系统调用、文件管理、内存管理、进程管理、设备驱动程序以及网络管理等。

对于我们的课程,主要还是讲了进程管理、系统调用和文件管理等。对于模型我们也从这几个方面入手。

 

2、进程管理

1、进程的描述

进程管理是linux系统的核心部分,在Linux内核中⽤⼀个数据结构struct task_struct来描述进程,直接或间接提供了进程相关的所有信息。struct task_struct的结构包括了进程的状态、进程双向链表的管理,以及控制台tty、⽂件系统fs的描述、进程打开⽂件的⽂件描述符files、内存管理的描述mm,还有进程间通信的信号signal的描述等内容。

2、进程的创建

 init_task为第⼀个进程(0号进程)的进程描述符结构体变量,它的初始化是通过硬编码⽅式固定下来的。除此之外,所有其他进程的初始化都是通过do_fork复制⽗进程的⽅式初始化的。1号和2号进程的创建是start_kernel初始化到最后由rest_ init通kernel_thread创建了两个内核线程:⼀个是kernel_init,最终把⽤户态的进程init给启动起来,是所有⽤户进程的祖先;另⼀个是kthreadd内核线程,kthreadd内核线程是所有内核线程的祖先,负责管理所有内核线程。

3、进程的状态

操作系统原理中的进程有就绪态、运⾏态、阻塞态这3种基本状态,而实际的Linux内核管理的进程状态有些不同,就绪态和运行态,在linux中都是TASK_RUNNING态。

4、进程调度

包括先到先服务算法、最短作业优先调度、优先级调度、 轮转法调度、多级队列调度、多级队列反馈调度等。进程调度一般发生在中断返回前,其中进程上下文的切换是进程调度的必要步骤。一个进程的上下文包括进程的控制信息以及有关程序、数据等。进程切换主要有以下两步组成:切换页全局目录以安装一个新的地址空间;切换内核态堆栈和硬件上下文。硬件上下文提供了内核执行新进程所需要的所有信息,包括CPU寄存器。尽管每个进程可以有自己的地址空间,但所有的进程只能共享CPU的寄存器。 因此,在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。这样才能正确的恢复一个进程的执行硬件上下文:进程恢复执行前必须装入寄存器的一组数据,包括通用寄存器的值以及一些系统寄存器。我们通过switch_to宏执行进程切换,schedule()函数调用这个宏来调度一个新的进程在CPU上运行。

 

3、内存管理

Linux采用虚拟内存管理技术,每个进程都有独立的进程地址空间。虚拟内存技术是基于交换技术(swap)的,只不过交换的是页或者段。

当进程要求运行的时,不是将他的全部信息装入内存,而是将其一部分先装入内存,另一部分暂时留在外存,进程在运行过程中,要使用信息不在内存时,发生中断,由操作系统将他们调如内存,以保证进程的正常运行。内核使用一个内存管理程序来检测最近没有使用的内存块(内存页)。内存管理程序将这些相对不经常使用的内存页交换到硬盘上专门指定用于“分页”或交换的特殊分区。那些换出到硬盘的内存页面被内核的内存管理代码跟踪,如果需要,可以被分页回 RAM。

  • 物理地址:用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
  • 虚拟内存:这是对整个内存的抽像描述。
  • 逻辑地址:指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址。
  • 线性地址:跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址则对应了硬件页式内存的转换前地址。

在Linux内部的地址的映射过程为逻辑地址–>线性地址–>物理地址,逻辑地址经段机制转化成线性地址;线性地址又经过页机制转化为物理地址。

 

4、文件管理

Linux中一切都是文件,包括硬件设备,这样用户可以采用读写文件的方式实现访问硬件。

为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统,即VFS。为各类文件系统提供了一个统一的操作界面和应用编程接口。

原理也很简单,用户态下有几个系统调用函数,包括read()、write()、open()、close()等,作用类似于字面意义,就是读写打开关闭文件。

然后调用内核中的sys_open()、sys_read()等函数,对包括FAT、设备文件等在内的文件系统操作。可以说VFS是一个软件层,用来处理与Unix标准文件系统相关的所有系统调用。

 

5、中断

1、分类

中断可分为外部中断和内部中断,其中内部中断主要是在用户进程执行时,硬件中断信号到达,导致进入内核态,执行对应的中断服务程序,内部中断主要是包括故障和陷阱两部分。

2、中断过程

中断处理是从用户态进入内核态的主要方式。

中断发生后,从用户态切换到内核态:

在当前进程的内核态堆栈中保存:当前进程的用户态栈顶地址、当时的状态字、当时的寄存器的值

(1) 中断发生后的第一件事情就是保存现场

(2)将当前进程的内核态的栈顶地址、内核态的状态字放入CPU对应的寄存器中,并将寄存器的值指向中断处理函数的入口(对系统调用而言,是指向system_call)

(3)当中断处理结束后:

查看是否发生进程调度:

a. 如果没有发生进程调度:

恢复中断现场,返回到原来的状态

实际上就是将中断时保存在当前进程内核态中的信息进行出栈操作到当前CPU中

b.  如果发生进程调度:

当前的这些状态都会保存在系统内核堆栈里

 (4)恢复现场

将保存堆栈中的值,以及保存的程序计数器中的值,恢复到寄存器中。

 

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

1、CPU

目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。

2、内存

内存的大小也是影响Linux性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费,例如,在一个32位处理器的Linux操作系统上,超过8GB的物理内存都将被浪费。因此,要使用更大的内存,建议安装64位的操作系统,同时开启Linux的大内存内核支持。

3、磁盘I/O

磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能,比如常见的磁盘RAID技术。

4、文件系统优化

文件系统的优化是系统资源优化的一个重点,在Linux下可选的文件系统有ext2、ext3、ReiserFS、ext4、xfs,根据不同的应用,选择不同的文件系统。

 

7、思考与建议

谢谢孟老师和李老师的辛苦付出, 为我们带来这这么精品的课程。通过学习《Linux操作系统分析》,从对Linux操作系统的几乎一无所知,到学习了Linux操作系统从运行初始化到一个程序的真正运行过程,加深了对操作系统的了解。

posted @ 2021-05-18 20:09  taochun  阅读(134)  评论(0)    收藏  举报