课程学习总结报告

目录

一、结构基础

    • linux结构
    • 进程地址空间结构

二、中断处理

    • 引入中断
    • 中断和异常
    • 中断产生
    • 中断描述符表
    • CPU运行
    • 中断/异常返回
    • 中断处理
    • 系统调用

三、进程管理

    • 进程概念
    • 进程状态
    • 进程调度

四、文件系统

    • 文件打开和关闭
    • 虚拟文件系统
    • 文件描述符

 

一、结构基础

1. linux结构

Linux系统一般有4个主要部分:

内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。

2. 进程地址空间结构

代码段 (text):程序代码在内存中的映射,存放函数体的二进制代码;

初始化过的数据 (Data):在程序运行初已经对变量进行初始化的数据;

未初始化过的数据 (BSS):在程序运行初未对变量进行初始化的数据;

栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈;

堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。

 

二、中断处理

1. 引入中断

中断是系统自我bai保护的一种机制du。为了防止程序运行出现错zhi误运行状况而导致的电脑dao处理死循环而当机,特有的保护措施,当程序运行时检测程序检测出该程序运行超出正常值范围或长时间处于同一字段内运行,启动中断机制。

2. 中断和异常

外中断——中断:指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;

内中断——异常:指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。

异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。中断则是由于系统中某事件引起的,该事件与现行指令无关。

3. 中断产生

1. 中断控制器监视IRQ线,对引发信号检查。

2. 如果出现信号,把信号转换成对应的中断向量。

3. 将向量存放在中断控制器的一个I/O端口,允许CPU通过数据总线读取这个向量。

4. 把信号发送到处理器的INTR引脚,即产生一个中断。

5. 等待CPU处理。

4. 中断描述符表

中断描述符表(IDT)是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断和异常处理程序的入口地址。

表中的每一项对应一个中断或异常向量,每个向量由8个字节组成。因此,最多需要256*8=2048字节来存放IDT。

idtr CPU寄存器使IDT可以位于内存的任何地方,它指定IDT的线性基址及其限制,在允许中断之前,必须用lidt汇编指令初始化idtr。

5. CPU运行

1. 执行指令, cs,eip记录下一条要执行的指令的逻辑地;

2. 执行指令之前,CPU控制单元会检查前一条指令运行时是否发生了中断或异常;

3. 如果发生了中断或异常:

a. 确定中断或异常的向量i
b. 从idtr寄存器中找到IDT的地址,从IDT中找到第i项
c. 从gdtr寄存器中找到GDT的地址,从GDT找到IDT项中的段选择符所标识的段描述符
d. 确定中断是由授权的发生源发出

4.检查是否发生了特权级变化,一般指是否由用户态变为内核态:

a. ss、esp、eflags、cs、eip依次入栈
b. 硬件出错码入栈

5. 如果发生的是故障,在异常处理后再次执行。

6. 中断/异常返回

在中断/异常处理完成后,会执行iret指令:

  1. 将保存在栈中的值装在cs、eip和eflags寄存器,由出错码就弹出
  2. 检查处理程序的特权等级,判断是否运行在内核态。如果是,就进行下一步
  3. 从栈中装载ss和esp,返回原来的栈空间
  4. 检查段寄存器

7. 中断处理

当中断发生时,Linux系统会跳转到asm_do_IRQ()函数(所有中断程序的总入口函数),并且把中断号irq传进来。根据中断号,找到中断号对应的irq_desc结构(irq_desc结构为内核中中断的描述结构,内核中有一个irq_desc结构的数组irq_desc_ptrs[NR_IRQS]),然后调用irq_desc中的handle_irq函数,即中断入口函数。我们编写中断的驱动,即填充并注册irq_desc结构。

8. 系统调用

流程:

 system_call()中断处理过程:

system_call是Linux中所有系统调用的入口点,每个系统调用都至少需要有一个参数,即由eax传递进入的系统调用号。call *sys_call_table(,%eax,4)函数,就是通过eax传递进来的系统调用号来寻找相信的系统调用处理函数。系统调用本质上是一种特殊的中断,所以它也需要进行现场的保存和结束调用后的恢复。

 

三、进程管理

1. 进程概念

进程是资源分配的基本单位。

进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。

下图显示了 4 个程序创建了 4 个进程,这 4 个进程可以并发地执行。

 2. 进程状态

  • 就绪状态(ready):等待被调度
  • 运行状态(running)
  • 阻塞状态(waiting):等待资源

应该注意以下内容:

  • 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
  • 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。

3. 进程调度

批处理系统:

1. 先来先服务(FCFS):非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业。

2. 短作业优先(SJF):非抢占式的调度算法,按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。

3. 最短剩余时间优先(SRTN):最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。

交互式系统:

1. 时间片轮转:将进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。时间片用完时,调度程序便停止该进程的执行,并将它送往就绪队列的末尾。

2. 优先级调度:为每个进程分配一个优先级,按优先级进行调度。

3. 多级反馈队列:可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

Linux进程调度策略

  • linux的进程调度是基于优先级的调度。进程的优先级是动态的,避免了进程饥饿。
  • linux进程分为普通进程和实时进程,实时进程的优先级高于普通进程。实时进程的优先级范围为1~99
  • 普通进程采用普通进程的时间片轮转算法
  • 实时进程采用实时进程的先进先出或实时进程的时间片轮转算法

 

四、文件系统

1. 文件的打开与关闭

2. 虚拟文件系统

虚拟文件系统也称虚拟文件交换(Virual Filesystem Switch),通过对文件系统操作创建抽象层来让程序与各类的文件系统打交道。

说他虚拟是因为他所有的护具结构都是在运行以后才建立的,而在磁盘上并没有真实的存储这些数据结构,他的数据结构只有与实际的文件系统结合起来才能开始工作,所以VFS不是一个真正的文件系统。

VFS针对文件系统定义了一套通用接口,所有与文件交互的程序都通过这一接口来进程操作,每种文件系统都会提供VFS接口的实现。

这样程序只需理解VFS提供的接口,而无需过问具体文件系统的实现细节。

3. 文件描述符

简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。

文件描述符的操作(如open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表,所有打开的文件都将通过此表中的文件描述符来引用(fd1,fd2,fd3...)。

每个进程在PCB(Process Control Block)即进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指针。

建议

1. 教学活动要注重课程目标的整体实现;

2. 重视学生在学习活动中的主体地位;

3. 注重学生对基础知识、基本技能的理解和掌握;

4. 引导学生积累数学活动经验、感悟数学思想;

5. 关注学生情感态度的发展。

 

 

posted @ 2020-07-09 10:53  真理长眠  阅读(139)  评论(0编辑  收藏  举报