linux操作系统分析-课程学习报告总结

作业要求:

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

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

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

 

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

Linux系统主要包含4个主要部分:内核、shell、文件系统和应用程序。其中内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。Linux操作系统相对于其他操作系统的特点是万物皆可看做文件,无论是软件资源还是硬件资源都看做文件进行操作。其中linux操作系统的核心就是进程管理。

 

二、计算机与操作系统的工作原理

计算机有“三大法宝“:存储程序计算机、函数调用堆栈机制、中断;

操作系统有”两把宝剑“:中断上下文、进程上下文。

1、三大法宝

(1)、存储程序计算机:将编写好的程序和数据先写入存储器中,然后启动计算机工作。内存中保存指令和数据,CPU从内存中取执行执行、从内存中读取数据。二者通过总线连接起来。

(2)、函数调用堆栈机制:记录函数调用框架、传递函数参数、保存返回值的地址、提供函数内部局部变量的存储空间。

(3)、中断:中断处理是从用户态进入内核态的主要方式。

2、两把宝剑

(1)、中断上下文:保存中断发生时的状态信息用于之后中断返回恢复现场。

(2)、进程上下文:用于进程切换。

 

三、系统调用

触发系统调用时,用户态有一个int $0x80或syscall指令触发系统调用,跳转到系统调用入口的汇编代码。int $0x80或syscall触发中断机制,陷入内核态,CPU自动保存与转换堆栈,从用户态堆栈转换到内核态堆栈,把当前进程用户态的堆栈SS:ESP、EFLAGS、CS:EIP都压栈到当前进程的内核堆栈中;执行系统调用内核处理函数(根据系统调用号,查询系统调用表得到对应的函数入口);系统调用处理完之后的返回、恢复现场,iret将CPU关键现场SS:ESP、EFLAGS、CS:EIP从当前进程的内核堆栈中恢复到对应寄存器中,并回到用户态int $0x80或syscall指令之后的下一条指令的位置继续执行。

 

四、进程

1、进程的描述
操作系统原理中使用进程控制块PCB来标记一个进程,Linux系统中则使用进程描述符 struct task_struct的数据结构来表示进程。
2、进程的创建

通过fork()系统调用来创建子线程。

3、进程的切换

进程调度时机、调度策略与算法、进程上下文的切换等。

 

五、中断

中断分为内部中断和外部中断,外部中断是指来自cpu外部的中断,内部中断是由软件主动发起的中断,具体可分为外部中断和异常。

中断过程:中断发生后,由用户态切换到内核态,首先将当前进程的CPU上下文压入进程的内核态堆栈,然后加载当前进程内核堆栈相关信息,跳转到中断处理程序,开始处理中断,中断完成后返回。其中中断返回之前是可以进行进程调度判断的,如果需要进行进程调度就调用schedule函数来实现。

 

六、影响应用程序性能表现的因素

首先应用程序经过预处理、编译、汇编和链接最终成为一个单一可执行文件

程序在系统中以进程的形式执行,可执行文件首先被装载到内存中,然后分配内存资源完成进程的创建,这个过程中影响性能表现的因素有:

应用程序本身的规模大小,这直接影响到程序装载的速度
进程创建的方式,写时复制(cow)技术在 fork 子进程的时候不直接复制父进程的所有资源,而是允许其读相同的物理页,只有一个进程写物理页时才拷贝内容并分配给子进程,大大提高了效率
进程创建后处于就绪状态,等待分配 CPU 资源后才能执行,这里影响性能表现的因素是:

进程管理,进程调度策略,直接影响到处于就绪状态的进程何时以及如何拥有 CPU 资源,Linux 的进程调度策略进过一系列演变, 目前采用 CFS(完全公平调度)算法
进程成功获得执行后,接下来的性能表现则更多地与应用程序本身的代码和它要完成的任务有关:

如果应用程序需要频繁的访问系统资源,就需要通过系统调用进入内核态,内核态和用户态的切换对性能表现有很大影响
如果是一个 I/O 密集型程序,进行 I/O 操作时系统会挂起当前进程,等待 I/O 操作完成后再调度执行,频繁的进程调度、上下文切换也会影响程序的性能表现
有时需要处理外设发来的 I/O 请求,如网络程序,如何响应也会影响性能表现,从一般的操作系统角度来说,有轮询、中断和DMA三种 I/O 方式。在 Linux 中,用得较多的还是中断方式,并且将中断分为了上半部和下半部,上半部处理紧急的事件,比如接收外设传来的数据;而下半部则是可延迟处理的部分,如内核对接收到的外设数据的处理。将下半部从中断处理例程中抽取出来,可以保证较短的中断响应时间
程序中是否进行了大量的函数调用,当发生函数调用时,系统要维护每个函数的函数调用堆栈,这也需要性能开销,所以大量的函数调用以及太深的函数嵌套都会影响程序性能
程序是否很好的利用了局部性原理来更多地访问高速硬件,在计算机中,访问速度来说 CPU 高速缓存远大于内存远大于外存,而这些设备之间的数据也都是整块交换,应用程序需要很好的利用局部性原理来避免过多的 cache 缺失和缺页异常来提高性能表现
以上是从软件系统角度分析影响应用程序性能表现的因素,除此之外,硬件能力也是影响性能的直接因素,不过这些因素只能通过升级硬件解决:

CPU 性能,包括核心数、主频、cache 大小等
内存性能,包括内存频率、容量大小等
外存性能,包括外存类型、传输速率、容量大小等
网络性能,包括网络带宽、网卡性能等

 

七、心得体会

通过对本门课程的学习,我对Linux内核的工作机制和工作原理有了更加深入的理解,原来只是对一般操作系统中进程、中断、文件系统等概念有所了解,现在更是将Linux操作系统与一般操作系统中相关的知识点进行了比较和融合。尤其是通过前面几次的作业和实验,在自己动手操作配置一个虚拟的Linux内核、并且在这个内核上进行系统调用,跟踪中断上下文和进程上下文,体会Linux的一般执行过程之后,我对Linux平台产生了浓厚的兴趣,希望在课程结束之后我还依然能对Linux内核、操作系统和Linux平台上的编程技术做深入的研究。

posted @ 2021-05-16 18:07  ustcyyds  阅读(131)  评论(0)    收藏  举报