课程学习总结报告
一: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时钟系统的作用原理
孟老师理论和实验结合,李老师着重源码分析,都给我带来了极大的启发,但是时间仓促,很多东西无法及时消化,我会在后面继续进行巩固和学习。