课程学习总结报告

一、计算机系统的基本工作原理

1.1.存储程序计算机和冯诺依曼结构

  存储程序计算机的主要思想是将程序存放在计算机存储器中,然后按存储器中的存储程序的⾸地址执⾏程序的第⼀条指令,以后就按照该程序中编写好的指令执⾏,直⾄程序执⾏结束。它为现在的各种硬件、终端奠定了基调。冯诺依曼结构由运算器、存储器、控制器、输⼊设备和输出设备5⼤基本类型部件组成。它是现代计算机的原型。

1.2.函数调用堆栈 

  堆栈是C语⾔程序运⾏时必须的⼀个记录调⽤路径和参数的空间。cpu中的两个寄存器ebp和esp分别指向堆栈的栈底和栈顶。

  a)call指令

     cs : eip原来的值指向call下⼀条指令,该值被保存到栈顶,然后cs : eip的值指向xxx的⼊⼜地址

  b)进入被调函数后,通过:

     pushl %ebp

     pushl %esp, %ebp

    建立被调用函数的堆栈框架

  c)被调函数运行完毕后,通过:

     movl %ebp, %esp

     popl %ebp

     ret

     拆除被调用函数的堆栈框架

  d)ret指令

     从栈顶弹出原来保存在这⾥的cs : eip的值,放⼊cs :eip中

二、进程管理

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

• 已分配内存的地址空间;

• 安全属性,包括所有权凭据和特权;

• 程序代码的一个或多个执行线程;

• 进程状态。

程序: 二进制文件,静态 /usr/bin/passwd ,/usr/sbin/useradd

进程: 是程序运行的过程, 动态,有生命周期及运行状态。

进程的生命周期:

父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。

每个新进程分配一个,唯一的进程 ID (PID),满足跟踪安全性之需。

任何进程都可以创建子进程。

所有进程都是第一个系统进程的后代

进程状态

进程状态产生的原因:在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。

在进程运行时,它对CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。

三、中断机制

简介

中断控制是计算机发展中一种重要的技术。最初它是为克服对I/O接口控制采用程序查询所带来的处理器低效率而产生的。

中断控制的主要优点是只有在I/O需要服务时才能得到处理器的响应,而不需要处理器不断地进行查询。

由此,最初的中断全部是对外部设备而言的,即称为外部中断(或硬件中断)。
但随着计算机系统结构的不断改进以及应用技术的日益提高,中断的适用范围也随之扩大,出现了所谓的内部中断(或叫异常)。

它是为解决机器运行时所出现的某些随机事件及编程方便而出现的。因而形成了一个完整的中断系统。

 中断向量

中断可分为两大类:异常和中断
异常又分为 故障(Fault)
陷阱(Trap)
,它们的共同特点是既不使用中断控制器,又不能被屏蔽(异常其实是CPU发出的中断信号)。
中断又分为外部可屏蔽中断(INTR)外部非屏蔽中断(NMI),所有I/O设备产生的中断请求(IRQ)均引起屏蔽中断,而紧急的事件(如硬件故障)引起的故障产生非屏蔽中断。

 

 

非屏蔽中断的向量和异常的向量是固定的,而屏蔽中断的向量可以通过对中断控制器的编程来改变。

Linux对256个向量的分配如下:

  • 从0~31的向量对应于异常和非屏蔽中断。

  • 从32~47的向量(即由I/O设备引起的中断)分配给屏蔽中断。

  • 剩余的从48~255的向量用来标识软中断。Linux只用了其中的一个(即128或0x80向量)用来实现系统调用。

异常及非屏蔽中断

异常就是CPU内部出现的中断,也就是说,在CPU执行特定指令时出现的非法情况。非屏蔽中断就是计算机内部硬件出错时引起的异常情况。

Intel把非屏蔽中断作为异常的一种来处理,因此,后面所提到的异常也包括了非屏蔽中断。

在CPU执行一个异常处理程序时,就不再为其他异常或可屏蔽中断请求服务。

也就是说,当某个异常被响应后,CPU清除eflag的中IF位,禁止任何可屏蔽中断。

但如果又有异常产生,则由CPU锁存(CPU具有缓冲异常的能力),待这个异常处理完后,才响应被锁存的异常。

我们这里讨论的异常中断向量在0~31之间,不包括系统调用(中断向量为0x80)。

 

中断总结

硬件产生的中断可被称为硬中断(hardirp),执行中断指令(int)产生的中断为软中断。

Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。

软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。  
当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。硬中断是可屏蔽的,软中断不可屏蔽。

硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。

 

四、文件系统

先放上一张linus提出的linux的文件系统架构:

基本思路:

1、抽象vfs layer,成为io体系的controller,其中包含file(文件)、dentry(目录)、inode(索引)、mount point(安装点)四个entity。屏蔽了下层文件系统的差异,将下层能力封装成文件概念,使得应用层能通过操作文件,从而操作底层的块设备。

  • 应用层用户可以通过树型目录来存取文件,符合用户的思维习惯,方便管理和获取,如/home/xiaoju/work。
  • 通过开放file_operation、dentry_operation、inode_operation、address_space_operation接口,集成file system layer的能力,屏蔽底层的复杂性,使得底层file system的扩展和切换对于操作层无感。
  • 抽象block(块)作为操作的基本单位。硬盘操作的做小单位扇区,但扇区太小,只有512byte,块的大小=512byte * 2的n次方,一般为1k或4k,就好像RMB最小单位是分,但我们现在都用元。磁盘管理器负责逻辑块号到具体扇区的映射,所以kernal只存储逻辑块号。

2、抽象file system layer,是io体系的service层,实现了文件系统的核心逻辑,包括数据的索引、查询、存储、缓存。其可以支持接入多种file system以满足用户不同的存储诉求,比如nfs。每种file system提供多种io mode,方便用户在存储空间利用率、性能、可靠性方面做选择。

  • buffered io:普通文件操作,对性能、吞吐量没有特殊要求,由kernel通过page cache统一管理缓存,page cache的创建和回收由kernel控制。其默认是异步写,如果使用sync,则是同步写,保证该文件所有的脏页落盘后才返回(对于db transaction很重要,通过sync保证redo log落盘,从而保证一致性)。

  • mmap:对文件操作的吞吐量、性能有一定要求,且对内存使用不敏感,不要求实时落盘的情况下使用。mmap对比buffered io,可以减少一次从page cache -> user space的内存拷贝,大文件场景下能大幅度提升性能。同时mmap将把文件操作转换为内存操作,避免lseek。通过msync回写硬盘(此处只说IO相关的应用,抛开进程内存共享等应用)。

  • direct io:性能要求较高、内存使用率也要求较高的情况下使用。适合DB场景,DB会将数据缓存在自己的cache中,换入、换出算法由DB控制,因为DB比kernel更了解哪些数据应该换入换出,比如innodb的索引,要求常驻内存,对于redo log不需要重读读写,更不要page cache,直接写入磁盘就好。

  • 3、抽象generic block layer,类似于dao层,适配内存和硬盘之间存储数据的gap,包括存储单位和存储地址(ps:不包括存储速度的匹配)。

  • 4、抽象io scheduler layer,类似于dao层采用的写入方式是异步的,主要是解决io吞吐量的问题,提升整体数据处理(包括read和write)/ 寻道次数的占比,对于单次io延时略有提升,但从整体提升了磁盘的数据处理效率。也是在这一层调用块设备驱动(块设备在设备注册环节注册自己的request_fn)。

 

五、课程学习体会

        孟老师教学风格比较活泼开放,更注重实际的编码场景,在课上带着我们分析了一些linux内核的源码,对于身为码农的我来说很多课程内容还是比较好接受的。李老师主要带我们分析的偏向于硬件上linux内核的一些机制,印象深刻的内容就是中断的保存现场和找到中断处理程序的整个流程,讲的比较细致。

        我对于这门课的建议就是孟老师在带着我们看代码的时候能不能把一些代码片段放在PPT上,上课的时候就翻PPT就好了,带着我们翻VSCODE很多时候我们看着看着就晕了,条例还是不够清晰。

posted @ 2020-07-08 00:05  Benjamin&Annie  阅读(169)  评论(0编辑  收藏  举报