Linux实验总结分析报告

2021/5/18 7:28:20

本文主要是介绍Linux实验总结分析报告,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

SA20225405  苏俊杰

作业要求:

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

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

3、产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理。

 

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

       Linux操作系统:通俗的操作系统主要是包含软件和硬件两部分统一运行的,并由操作系统来统一管理硬件的软件系统,而linux是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux系统主要包含4个主要部分:内核、shell、文件系统和应用程序。其中内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。Linux操作系统相对于其他操作系统的特点是万物皆可看做文件,无论是软件资源还是硬件资源都看做文件进行操作。Linux操作系统被抽象为不同的层级和模块,如下图所示。

               

      如果让我们把Linux系统再精简些,就是下图所示的模样:                                                         

         如图中所示,我们可以看到,内核直接与硬件打交道,并给上层应用提供系统调用,让他们间接的使用硬件资源。shell似乎Linux系统中方便人机交互的界面软件,库函数不属于Linux内核,但是它封装了基本的功能供人使用,提高了编程效率。

 

2.进程管理

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

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

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

3.中断管理

      中断有很多种,都是程序执行过程中的强制性转移,转移到操作系统内核相应的处理程序。中断在本质上都是软件或者硬件发生了某种情形而通知处理器的行为,处理器进而停止正在运行的当前进程,对这些通知做出相应反应,即转去执行预定义的中断处理程序(内核代码入口),这就需要从进程的指令流里切换出来。

      中断能起到暂停当前进程指令流(Linux内核中称为thread)转去执行中断处理程序的作用,中断处理程序是与当前进程指令流独立的内核代码指令流。从用户程序的角度看进程调度的时机一般都是中断处理后和中断返回前的时机点进行,只有内核线程可以直接调用schedule函数主动发起进程调度和进程切换。

中断处理后,会检查一下是否需要进程调度。需要则切换进程(本质上是切换两个进程的内核堆栈和thread),不需要则一路顺着函数调用堆栈正常中断返回iret,这样就自然回到原进程继续运行了。

      硬件中断(Interrupt),也称为外部中断,就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)的电平信号。CPU在执行每条指令后检测这两根引脚的电平,如果是高电平,说明有中断请求,CPU就会中断当前程序的执行去处理中断。一般外设都是以这种方式通知CPU的,如时钟、键盘、硬盘等。

      软件中断/异常(Exception),也称为内部中断,包括除零错误、系统调用、调试断点等,在CPU执行指令过程中发生的各种特殊情况统称为异常。异常会导致程序无法继续执行,而跳转到CPU预设的处理函数。异常分为如下3种:

      故障(Fault):故障就是有问题了,但可以恢复到当前指令。例如除0错误、缺页异常等。

      退出(Abort):简单说是不可恢复的严重故障,导致程序无法继续运行,只能退出了。例如连续发生故障(double fault)。

      陷阱(Trap):程序主动产生的异常,在执行当前指令后发生。前面研究的系统调用(int 0x80)以及调试程序时设置断点的指令(int 3)都属于这类。简单说就是程序自己要借用中断这种机制进行跳转,所以在有些书中也称为“自陷”。从CPU的视角看,其处理机制与其他中断处理方式并无区别,我们可以以系统调用为例以此类推到一般的中断机制。

                                    

 

4.文件管理

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

       文件是具有符号名的、在逻辑上具有完整意义的一组相关信息项的有序序列。文件系统,就是操作系统中实现文件统一管理的一组软件、被管理的文件以及为实施文件管理所需要的一些数据结构的总称。要实现操作系统对其他各种不同文件系统的支持,就要将对各种不同文件系统的操作和管理纳入到一个统一的框架中。对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这就是所谓的虚拟文件系统VFS。为各类文件系统提供了一个统一的操作界面和应用编程接口。

      原理也很简单,用户态下有几个系统调用函数,包括read()、write()、open()、close()等,作用类似于字面意义,就是读写打开关闭文件。 然后调用内核中sys_open()、sys_read()等函数,对包括FAT、设备文件等在内的文件系统操作。可以说VFS是一个软件层,用来处理与Unix标准文件系统相关的所有系统调用。

      通常,虚拟文件系统分为三个层次:

第一层为文件系统接口层,如open/write/close等系统调用接口。

第二层为VFS接口层。该层有两个接口:一个是与用户的接口;一个是与特定文件系统的接口。VFS与用户的接口将所有对文件的操作定向到相应的特定文件系统函数上。VFS与特定文件系统的接口主要是通过VFS-operations实现。

第三层是具体文件系统层,提供具体文件系统的结构和实现,包括网络文件系统,如NFS。

 

5.实例说明

 

     这里以打开文件说明。打开文件即使用 open 函数,它首先通过按名查找,看在高速缓存中有没有查找的 inode,如果有那么对其进行引用并加 1。如果没有将创建新的 vfs的 inode 对象和目录项对象等。 Open 函数调用的系统服务例程是 sys_open 函数,其接受的参数为文件目录和访问的模式。如果文件存在则返回一个文件描述符fd,如果不存在则返回-1. Read 函数调用的服务例程是 sys_read ,接受三个参数。分别是一个文件描述符 fd,一个对数据缓存的地方buf,和需要传输的数据的多少 count。Read 对将文件读入缓存区。

 影响性能的因素:

 1.硬件的速度:程序的运行需要将磁盘中静态的程序加载到CPU中,而硬盘的速度相对CPU是程序运行的下限。同样Cpu性能至关重要。

 2.缓存的命中:现代计算机的构造中,有多级缓存,在缓存都命中的情况下,程序的运行速度是更快的。但是相反就会影响速度,如矩阵幂,利用缓存命中的特性写程序会使程序性能更优化。

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

 4.内存限制:Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,要保证足够的物理内存,避免占用虚拟内存过多的情况。

 5.文件系统性能:Linux标准文件系统呈现出多种风格。如果我们没有特殊的需要,就可以直接使用普通的Ext2文件系统。如果我们想避免系统崩溃后冗长的文件系统检测,就可以切换到Ext3文件系统。如果我们不得不处理许多的小文件,ReiserFS是最好的选择。不同的文件系统同样会影响程序的性能。

 

6.心得与致谢

      结果这段时间的学习,我对Linux内核的工作机制和工作原理有了更加深入的理解,原来只是简单学习了《操作系统》,对一般操作系统中进程、中断、文件系统等概念了解皮毛,而现在经过了老师的谆谆教导,我初步将Linux操作系统与一般操作系统中相关的知识点进行了比较和融合。老师们对我们的动手实践能力也十分重视,为同学们量身打造了数个实验,让我们把所学与所做真正的融为一体。

    最后,万分感谢孟宁老师和李春杰老师这一学期的辛勤教学。

 

 

 



这篇关于Linux实验总结分析报告的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程