课程学习总结报告
一、报告要求
请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。谈谈您对课程的心得体会,改进建议等。出要求是发表一篇博客文章,长度不限,只谈自己的思考,严禁引用任何资料造成文章虚长。
二、Linux系统概念模型
首先要明确的是操作系统的定义:是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
Linux内核实现了操作系统的三大核心功能,即进程管理、内存管理和文件系统,对应操作系统原理课程中最重要的3个抽象概念是进程、 虚拟地址和文件。实现了三个核心功能就实现了操作系统最基本的功能,本文将从这三个核心功能的角度剖析LInux操作系统。
三、进程管理
在系统运行的过程中,我们会创建新的进程去执行新的任务。为了提高CPU的利用率(有些进程等待IO资源,CPU无事可做),设计了各种进程调度算法。
为了实现进程的切换,引入中断的概念。在中断的过程中,保存下当前进程运行所需要的信息,然后将下一个进程的信息加载到当前的寄存器和内存中,开始执行新的进程。
这样就使得多任务能同时在系统内执行,而且合适的进程调度算法使得不会有进程得不到执行。
四、内存管理
进程(执行的程序)占用的用户空间按照「 访问属性一致的地址空间存放在一起 」的原则,划分成 5个不同的内存区域。 访问属性指的是“可读、可写、可执行等 。
代码段代码段是用来存放可执行文件的操作指令,可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,它是不可写的。数据段数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。BSS段BSS段包含了程序中未初始化的全局变量,在内存中 bss 段全部置零。堆 heap堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)栈 stack栈是用户存放程序临时创建的局部变量,也就是函数中定义的变量(但不包括 static 声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。上述几种内存区域中数据段、BSS段、堆通常是被连续存储在内存中,在位置上是连续的,而代码段和栈往往会被独立存放。堆和栈两个区域在i386体系结构中栈向下扩展、堆向上扩展,相对而生。
五、文件系统
在Linux中,一切都是文件,通过对文件的定义和操作来控制设备的执行和数据的存储。并且使用VFS虚拟文件系统,实现对多种文件系统的兼容。
要实现操作系统对其它各种不同文件系统的支持,就要将对各种不同文件系统的操作和管理纳入到一个统一的框架中。 对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这就是所谓的虚拟文件系统(VFS)。
六、小结
通过这门课的理论与实验,我对Linux操作系统有了一个更为直观、更为底层的认知,如果可以的话,希望以后的课程在加个实验,把文件操作系统或者内存管理系统的某个模块的源码给讲一下,因为我们在学的时候用的很多都是伪码表示,自己看的时候存在一定困难,如果老师可以带着看一下并分析一下,可以让我们更好地自行阅读源码,触类旁通,非常感谢老师的指导。