课程学习总结报告

一:Linux内核整体架构

 

上图给出了Linux内核的整体架构。共5个子系统,分别负责如下的功能:

 

1. 进程调度:这个本课程的核心,负责管理CPU资源,采用动态的优先级调度算法来调度cpu,既考虑了任务的紧急性,也不至于产生“饥饿”的现象。

 

2. 内存管理:这个部分在两位老师的课程中涉及的并不多,它负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存。

 

3. VFS(Virtual File System):虚拟文件系统,Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现。

 

4. 网络子系统:这个部分本课程并未涉及,所以在博客后面的部分也不会涉及到,它主要负责管理系统的网络设备,并实现多种多样的网络标准,我们常见的TCP/IP协议其实已经封装在Linux内核里面了。

 

5. IPC(Inter-Process Communication):进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信,本课程也未涉及。

 

二:进程管理

1:进程的定义:

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

2:进程的状态:

 

 

 

3:进程的调度策略

 

 

 

 

 

可运行队列分为活动进程队列和过期进程队列,如果是普通进程,时间片用完了进入过期队列(但是如果这个普通进程是交互进程,并且要么过期队列里面的进程优先级都比这个进程低,要么过期队列里面的线程存在的时间不长,那么也会放入活动队列),实时则还是进入活动队列,为何引入活动和过期,就是为了让每个进程都能得到运行。因为调度永远是从活动队列里面选进程,随着时间推移,活动队列越来越小,直到为0,过期队列原来越大,此时过期队列的进程全部拷贝到活动队列,继续进行调度。

 

4:进程切换分析

把复杂的代码分析过程抽象出来,可以说从一个进程切换到另一个进程,其实就是保存当前的进程上下⽂环境,下次进程被调度执⾏时,需要恢复进程上下⽂环境,就这样通过虚拟化的进程概念实现了多道程序在同⼀个物理CPU上并发执⾏。

 

二:中断和异常

1:为什么要有中断?

因为I/O速度慢,如果在进行I/O的时候一直让cpu等是一件很低效的事情,所以I/O准备好再通知(中断)cpu是一个比较好的方法,在那之前cpu可以做自己的事情

 

2:定义

中断——异步的(如敲键盘):

由硬件随机产生,在程序执行的任何时候可能出现

 

异常——同步的(如1/0,int指令,缺页,系统调用之类的):

在(特殊的或出错的)指令执行时由CPU控制单元产生

我们用“中断信号”来通称这两种类型的中断

 

3:中断处理过程

用大白话说中断处理过程的核心原理就是:找对应的中断向量,通过中断向量找到对应的中断处理程序,保存现场,然后执行中断处理程序,中断处理程序会进一步保存现场(一般是保存通用寄存器的值),然后处理中断,最后执行中断返回程序,中断返回程序主要就是恢复现场,接着中断之前的指令执行。中断处理示意图如下:

 

 

 

4:系统调用过程

整个过程就是这样的:用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态,然后接着运行。

 

 

 三:设备管理

在计算机系统中,CPU 并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit)的组件,例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘、鼠标、键盘、显示器的行为。

 

 

 四:文件管理

这一节,在李春节老师的讲解下,我主要对于文件系统的主要功能有了一个总体的印象,但是深入的细节并没有掌握的很好,我学到了以下知识:

  • 每一个硬盘上保存的文件都要有一个索引,来维护这个文件上的数据块都保存在哪里。

  • 文件通过文件夹组织起来,可以方便用户使用。

  • 为了能够更快读取文件,内存里会分配一块空间作为缓存,让一些数据块放在缓存里面。

  • 在内核中,要有一整套的数据结构来表示打开的文件。

  • 在用户态,每个打开的文件都有一个文件描述符,可以通过各种文件相关的系统调用,操作这个文件描述符。

 

 

 

五:总结

通过这门课我对Linux的原理有了更深入的了解,以前完全是雾里看花,现在总算拨开了一点云雾。

从孟老师的课程我学到了:

 1:应该如何分析一段代码对应的汇编程序,寄存器值得变化,栈帧的变化等

 2:进程之间的切换原理

 3:如何编译和调试Linux内核

 4:系统调用的层次结构和原理

 5:可执行程序的工作原理

 

从李老师的课程我学到了:

1:系统调用过程的内核源码分析

2:文件系统的总体结构和相关的数据结构

3:进程的调度方法和原理

4:CPU是如何管理和访问I/O设备的

5:Linux时钟系统的作用原理

 

孟老师理论和实验结合,李老师着重源码分析,都给我带来了极大的启发,但是时间仓促,很多东西无法及时消化,我会在后面继续进行巩固和学习。

 

posted @ 2020-07-09 21:28  lambdoor  阅读(180)  评论(0编辑  收藏  举报