当前课程知识点:操作系统 >  第五讲 物理内存管理: 连续内存分配 >  5.1 计算机体系结构和内存层次 >  5.1 计算机体系结构和内存层次

返回《操作系统》慕课在线视频课程列表

5.1 计算机体系结构和内存层次在线视频

5.1 计算机体系结构和内存层次

下一节:5.2 地址空间和地址生成

返回《操作系统》慕课在线视频列表

5.1 计算机体系结构和内存层次课程教案、知识点、字幕

各位同学大家好

今天我们开始介绍存储管理

计算机系统当中除了处理能力之外

还有存储能力 存储能力相当于

我们有一系列基本的存储介质

我们要在这些介质当中

来存我们的代码和数据

为此我们在这里具体的来说

对于计算机系统来讲

它的体系结构当中就约定了

我哪些地方可以来存数据

然后在存数据的这些地方

既包括CPU里的寄存器 也包括内存和外存

这几种不同的存储介质

它的容量 速度 价格都是不一样的

为了组织一个合理的系统

我们把计算机系统当中的存储

组织成了一个层次结构

针对这种层次结构下的存储单元

操作系统需要对它进行管理

操作系统当中的存储管理

实际上就是用来管理这些存储介质的

最基本的管理要求是说

我们一个进程需要使用存储单元的时候

需要从操作系统分一块给它

等它不用的时候还给操作系统

这是它最基本的分配和释放的管理要求

针对这种内存管理的要求

我们来看系统结构当中

有哪些因素对它有影响

这个图实际上是我们在前面

讲系统结构的时候就说过了

计算机系统包括CPU 内存和I/O设备

我们在上一次课里

也说到过CPU在加电的时候

我们关心各个寄存器的初始状态

那么在今天讲存储的时候

我们会更多关注与存储相关的内容

比如说在CPU里头

我们可以往寄存器存内容

寄存器可以存数据

但是寄存器它的容量是非常小的

通常是32位 64位的寄存器

能存的数据也就几十个字节

或者几百个字节这种尺度

然后我们说内存是更多的存数据的地方

我们在前面说到过它只是说能存就行了

在这我们需要更进一步去说

计算机系统当中内存

它的最小访问单位是字节 也就是8bit

而通常我们所说的计算机系统是32位的总线

那所谓32位总线也就相当于我一次读写

可以从内存当中读或者写32位

也就是4字节

这样以来我们读写的速度就会快了

如果针对这种特点

你在由于一次读写32位的有地址对齐的事

你在访问的时候就不能

从任意的地方开始一个四字节

有可能这个读写就会被分成两次

还有一个是说我们在CPU里头

你还会看到高速缓存

高速缓存是什么意思呢

在你进行读写指令

或者指令执行过程中

访问数据都需要从内存里读数据

这个时候如果说我有大量数据要读写

而且我会重复利用的话

我在CPU里加上高速缓存

那这样的话它的读写速度会更快

这个时候整个读写效率会提高

所以在CPU里加了高速缓存

这几个部分都对我们存储管理

有至关重要的影响

所以大家在实际做操作系统的

储存管理实现的时候

你必须很准确的了解对应的CPU的结构

那么对于我们操作系统课来讲

我们讲的是X86的系统

那这底下是英特尔的X86的手册

里头要想查最详细的内容

从这个手册里就可以查到

接下来我们更详细来看存储的层次结构

那么我们刚才已经说了

在CPU里头有两级缓存 这两级缓存

我们如果说你在读写数据或者指令的时候

在缓存里已经有相应的内容

事先已经读过

那这个时候我就直接可以从缓存里拿到

这个时候速度是最快的

然后说如果在这里头缓存不命中

那这个时候你就必须上内存里去读

而在上面这部分 我们在写程序的时候

你是感觉不到L1L2 hash的存在的 实际为啥呢

原因在于这部分完全是由硬件在做控制

你写的程序不能显示的使用到它们

而内存的访问就需要

使用到操作系统的控制

如果说你在内存里访问的时候仍然找不到

这个时候还有可能我是存到外存里头去

那么存到外存里头呢把它读进来

你再进行访问

这个时候就需要用到操作系统的控制

那在这个体系结构当中

我们可以看到从CPU内部

一直到硬盘的外部

这几个速度差的非常大的

具体差到什么程度 我们这里有一张表

最快的跟你CPU的主频是一样的

那就是几个纳秒我就能访问到

最慢是几个毫秒 这两者之间

毫秒 微妙 纳秒

差将近是百万倍的数量级

所以在这套体系当中

要想把它协调成一个有机的整体

实际上对于存储管理来讲

它的挑战性还是很大的

对于操作系统来说

我们存储管理最后想达到什么效果

我们在这给大家一个描述

首先我们看到系统当中的存储 内存

我们刚才说了是以字节为单位进行访问

每一个字节有自己的一个地址

这个地址是物理地址

然后说我如果数据存到外存里了

比如像磁盘 这是外存

磁盘的访问有扇区编号

每一个扇区是512个字节最小单位

那这是你能够读写存储的最基本的内容

而写程序的时候我们希望看到的情况是什么

是我有若干个进程 每一个进程

它们都有共同的一部分的地址空间

是操作系统的内核

然后每一个应用程序自己又是不一样的

它们各自有各自的内容

我希望在各自写这些内容的时候

它们的地址是可以重叠的

相互之间是不干扰的

这是我们希望见到的状态

把下面这种内存的状态

转变成我们上面逻辑的理想状态

我们在中间加了一层存储管理单元

存储管理单元就把逻辑地址空间

转变成物理地址空间 这个时候说

我实际操作系统代码存在哪呢 存在这头上

通常情况下是在内存里头的

而进程的地址空间

随着它们运行的转换

有些是在内存里头

有些是放在外存里头的

这个转换的过程

由中间的存储管理单元来完成

如果说我们能做到这样一步 实际就相当于

存储管理要达到效果是抽象

把线性的物理地址编号

转变成抽象的逻辑地址空间

然后我需要在这里头对地址空间进行保护

每一个进程只能访问自己的空间

尽管说在内存里它们是相邻存放的

与此同时我们还要方便共享

比如说在我们这里头大家可以看到的

操作系统的内核的代码

是各个进程都是一样的

或者说绝大部分是一样的 这种一致

如果说每个进程地址空间是相互保护的

不能访问 这段你就得存多份

这个效率是低的

我们希望能够很好地把保护和共享统一起来

这个目标是有一些矛盾的

与此同时我们还希望它实现更好的虚拟化

这说的是我们每个进程的

地址空间编号都是一样的

但是实际上每个进程

都有自己一段用户地址空间

到这里实际上物理地址空间

存的位置是不一样的

但是给每个进程看到的都是

一个区域一致的一个地址空间

甚至于说我们在逻辑地址空间里

看到的可以存数据的地方

它的大小是大于你的物理内存的总量的

我们看到实际上要想实现存储管理的

抽象 保护 共享和虚拟化

实际上这几个目标还是很有挑战的

具体说起来

我们在操作系统里

可能采用一些什么样办法

我们第一个办法就是重定位

实际上在最早的计算机系统当中

它是直接使用总线上的

物理地址来写你的程序

我要想读写某个内存单元 它在什么位置

我们在程序里见到的就是它的物理地址

但是这种做法实际上有很大局限

你写程序只能在指定类型的机器上运行

我们第一个可以让它做灵活

实际上相当于我可以整块的搬

就是我们这里说的重定位

如果说我们现在看到地址访问的时候

说每一个地址是用一个段地址

加一个偏移来表示

实际上就是从重定位这个地方来的

有了重定位之后我通过移

我只需要改我的段寄存器的地址

这个程序就能运行了

这是第一种做法 为了实现它

我在程序和操作系统里头

都需要有相应的支持

这些支持我后面会来说

接下来一个问题是说我们在这里头

在重定位的时候

我一个进程分的存储空间

是一个连续的空间

我不可以把两个交错起来

实际上这是一个很大的限制

我们希望它能够不连续

实际上我们在写程序的时候

它的逻辑结构

它并不是一个必须连成一片的区域

而是说我们把程序分成数据 代码 堆栈

这三个部分是相对独立的

它不会说我从堆栈里头

直接去访问代码段里的内容

也很少有这种情况

我从代码段里直接去访问数据段的内容

依据这种情况

我至少可以把代码 数据和堆栈分成三块

每一块我要的空间就会变少了

这就是我们这里的分段

分段仍然你是需要一段的内容

还是需要连续的

这个要求仍然足够高

接下来我们会说分页

分页实际上就是把内存分成最基本的单位

就好比说我们要盖一栋楼

盖一栋楼需要各种各样的建筑材料

但是我们用到的最基本的

就是一块一块的方砖

你可以把它加在一起之后

变成你需要的各种各样的形状

我们也希望是从最小的单位 一页

来构建你所需要存储区域

当然你说我们最小的单位

那就用一个字节不就挺好的吗

但是实际上这个时候你一个字节的话

你在访问的时候 它开销就力度太细

以至于管理的时候难度很高

所以我们在这要选一个合适的大小

这一块最基本的单位是一个连续区域

这就是我们这里的页 基于这个来构造

你所需要的存储空间的内容

在这个基础之上

我们希望把数据存到硬盘上

而硬盘外存上的数据和内存上的数据

它们俩之间的倒换是由操作系统内部来实现

这个时候就希望看到的是

程序是一个逻辑的地址空间

甚至这个逻辑地址空间

是大于物理内存的空间

那这就是我们的虚拟存储了

在我们实际上操作系统里

基本上就是这样几种方式来管理内存

当然我们说所有这些管理办法

它对硬件的依赖程度都是非常高的

比如说MMU

存储管理单元里的结构是什么样的

然后我们CPU能够识别的页表是什么样的

这些都直接影响到你存储管理方式的实现

到这我们对内存管理的基本情况有一个介绍

操作系统课程列表:

第零讲 在线教学环境准备

-0.1 Piazza讨论区

--piazza访问和使用

--html

-0.2 在线实验平台

--实验平台使用帮助

--平台使用帮助

--Gitlab使用帮助

--IBM内部账号初始化

-0.2在线实验平台

--Raw HTML

第一讲 操作系统概述

-1.1 课程概述

--视频

-第一讲 操作系统概述--练习

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

第二讲 实验零 操作系统实验环境准备

-2.1 前言和国内外现状

--2.1 前言和国内外现状

-2.2 OS实验目标

--2.2 OS实验目标

-2.3 8个OS实验概述

--2.3 8个OS实验概述

-2.4 实验环境搭建

--2.4 实验环境搭建

-2.5 x86-32硬件介绍

--2.5 x86-32硬件介绍

-2.6 ucore部分编程技巧

--2.6 ucore部分编程技巧

-2.7 演示实验操作过程

--2.7 演示实验操作过程

--Q6

--Q7

--Q10

第三讲 启动、中断、异常和系统调用

-3.1 BIOS

--3.1 BIOS

-3.2 系统启动流程

--3.2 系统启动流程

-3.3 中断、异常和系统调用比较

--3.3 中断、异常和系统调用比较

-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较

-3.4 系统调用

--3.4 系统调用

-第三讲 启动、中断、异常和系统调用--3.4 系统调用

-3.5 系统调用示例

--3.5 系统调用示例

-3.6 ucore+系统调用代码

--3.6 ucore+系统调用代码

第四讲 实验一 bootloader启动ucore os

-4.1 启动顺序

--4.1 启动顺序

-4.2 C函数调用的实现

--4.2 C函数调用的实现

-4.3 GCC内联汇编

--4.3 GCC内联汇编

-4.4 x86中断处理过程

--4.4 x86中断处理过程

-4.5 练习一

--4.5 练习一

-4.6 练习二

--4.6 练习二

-4.7 练习三

--4.7 练习三

-4.8 练习四 练习五

--4.8 练习四练习五

-4.9 练习六

--4.9 练习六

第五讲 物理内存管理: 连续内存分配

-5.1 计算机体系结构和内存层次

--5.1 计算机体系结构和内存层次

-5.2 地址空间和地址生成

--5.2 地址空间和地址生成

-5.3 连续内存分配

--5.3 连续内存分配

-5.4 碎片整理

--5.4 碎片整理

-5.5 伙伴系统

--5.5 伙伴系统

-第五讲 物理内存管理: 连续内存分配--5.6 练习

第六讲 物理内存管理: 非连续内存分配

-6.1 非连续内存分配的需求背景

--6.1 非连续内存分配的需求背景

-6.2 段式存储管理

-- 6.2 段式存储管理

-6.3 页式存储管理

--6.3 页式存储管理

-6.4 页表概述

--6.4 页表概述

-6.5 快表和多级页表

--6.5 快表和多级页表

-6.6 反置页表

--6.6 反置页表

-6.7 段页式存储管理

--6.7 段页式存储管理

-第六讲 物理内存管理: 非连续内存分配--6.8 练习

第七讲 实验二 物理内存管理

-7.1 了解x86保护模式中的特权级

--7.1 了解x86保护模式中的特权级

-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级

-7.2 了解特权级切换过程

--7.2 了解特权级切换过程

-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程

-7.3 了解段/页表

--7.3 了解段/页表

-第七讲 实验二 物理内存管理--7.3 了解段/页表

-7.4 了解UCORE建立段/页表

--7.4 了解ucore建立段/页表

-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表

-7.5 演示lab2实验环节

--7.5 演示lab2实验环节

第八讲 虚拟存储概念

-8.1 虚拟存储的需求背景

--8.1 虚拟存储的需求背景

-8.2 覆盖和交换

--8.2 覆盖和交换

-8.3 局部性原理

--8.3 局部性原理

-8.4 虚拟存储概念

--8.4 虚拟存储概念

-8.5 虚拟页式存储

--8.5 虚拟页式存储

-8.6 缺页异常

--8.6 缺页异常

第九讲 页面置换算法

-9.1 页面置换算法的概念

--9.1 页面置换算法的概念

-9.2 最优算法、先进先出算法和最近最久未使用算法

--9.2 最优算法、先进先出算法和最近最久未使用算法

-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法

-9.3 时钟置换算法和最不常用算法

--9.3 时钟置换算法和最不常用算法

-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法

-9.4 Belady现象和局部置换算法比较

--9.4 Belady现象和局部置换算法比较

-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较

-9.5 工作集置换算法

--9.5 工作集置换算法

-第九讲 页面置换算法--9.5 工作集置换算法

-9.6 缺页率置换算法

--9.6 缺页率置换算法

-第九讲 页面置换算法--9.6 缺页率置换算法

-9.7 抖动和负载控制

--9.7 抖动和负载控制

第十讲 实验三 虚拟内存管理

-10.1 实验目标:虚存管理

--10.1 实验目标:虚存管理

-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理

-10.2 回顾历史和了解当下

-- 10.2 回顾历史和了解当下

-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下

-10.3 处理流程、关键数据结构和功能

--10.3 处理流程、关键数据结构和功能

-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能

-10.4 页访问异常

--10.4 页访问异常

-第十讲 实验三 虚拟内存管理--10.4 页访问异常

-10.5 页换入换出机制

--10.5 页换入换出机制

-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制

第十一讲 进程和线程

-11.1 进程的概念

--11.1 进程的概念

-第十一讲 进程和线程--11.1 进程的概念

-11.2 进程控制块

--11.2 进程控制块

-第十一讲 进程和线程--11.2 进程控制块

-11.3 进程状态

--11.3 进程状态

-第十一讲 进程和线程--11.3 进程状态

-11.4 三状态进程模型

--11.4 三状态进程模型

-11.5 挂起进程模型

--11.5 挂起进程模型

-第十一讲 进程和线程--11.5 挂起进程模型

-11.6 线程的概念

--11.6 线程的概念

-第十一讲 进程和线程--11.6 线程的概念

-11.7 用户线程

--11.7 用户线程

-第十一讲 进程和线程--11.7 用户线程

-11.8 内核线程

--11.8 内核线程

-第十一讲 进程和线程--11.8 内核线程

第十二讲 进程控制

-12.1 进程切换

--12.1 进程切换

-第十二讲 进程控制--12.1 进程切换

-12.2 进程创建

--12.2 进程创建

-第十二讲 进程控制--12.2 进程创建

-12.3 进程加载

--12.3 进程加载

-第十二讲 进程控制--12.3 进程加载

-12.4 进程等待与退出

--12.4 进程等待与退出

-第十二讲 进程控制--12.4 进程等待与退出

第十三讲 实验四 内核线程管理

-13.1 总体介绍

--13.1 总体介绍

-13.2 关键数据结构

--13.2 关键数据结构

-13.3 执行流程

--13.3 执行流程

-13.4 实际操作

--13.4 实际操作

第十四讲 实验五 用户进程管理

-14.1 总体介绍

--14.1 总体介绍

-14.2 进程的内存布局

--14.2 进程的内存布局

-14.3 执行ELF格式的二进制代码-do_execve的实现

--14.3 执行ELF格式的二进制代码-do_execve的实现

-14.4 执行ELF格式的二进制代码-load_icode的实现

--14.4 执行ELF格式的二进制代码-load_icode的实现

-14.5 进程复制

--14.5 进程复制

-14.6 内存管理的copy-on-write机制

--14.6 内存管理的copy-on-write机制

第十五讲 处理机调度

-15.1 处理机调度概念

--15.1 处理机调度概念

-第十五讲 处理机调度--15.1 处理机调度概念

-15.2 调度准则

--15.2 调度准则

-15.3 先来先服务、短进程优先和最高响应比优先调度算法

--15.3 先来先服务、短进程优先和最高响应比优先调度算法

-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法

-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc

-15.5 实时调度和多处理器调度

--15.5 实时调度和多处理器调度

-第十五讲 处理机调度--15.5 实时调度和多处理器调度

-15.6 优先级反置

--15.6 优先级反置

-第十五讲 处理机调度--15.6 优先级反置

第十六讲 实验六 调度器

-16.1 总体介绍和调度过程

--16.1 总体介绍和调度过程

-16.2 调度算法支撑框架

--16.2 调度算法支撑框架

-16.3 时间片轮转调度算法

--16.3 时间片轮转调度算法

-16.4 Stride调度算法

--16.4 Stride调度算法

第十七讲 同步互斥

-17.1 背景

--17.1 背景

-17.2 现实生活中的同步问题

--17.2 现实生活中的同步问题

-第十七讲 同步互斥--17.2 现实生活中的同步问题

-17.3 临界区和禁用硬件中断同步方法

--17.3 临界区和禁用硬件中断同步方法

-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法

-17.4 基于软件的同步方法

--17.4 基于软件的同步方法

-第十七讲 同步互斥--17.4 基于软件的同步方法

-17.5 高级抽象的同步方法

--17.5 高级抽象的同步方法

-第十七讲 同步互斥--17.5 高级抽象的同步方法

第十八讲 信号量与管程

-18.1 信号量

--18.1 信号量

-第十八讲 信号量与管程--18.1 信号量

-18.2 信号量使用

--18.2 信号量使用

-第十八讲 信号量与管程--18.2 信号量使用

-18.3 管程

--18.3 管程

-第十八讲 信号量与管程--18.3 管程

-18.4 哲学家就餐问题

--18.4 哲学家就餐问题

-18.5 读者-写者问题

--18.5 读者-写者问题

第十九讲 实验七 同步互斥

-19.1 总体介绍

--19.1 总体介绍

-19.2 底层支撑

--19.2 底层支撑

-第十九讲 实验七 同步互斥--19.2 底层支撑

-19.3 信号量设计实现

--19.3 信号量设计实现

-第十九讲 实验七 同步互斥--19.3 信号量设计实现

-19.4 管程和条件变量设计实现

--19.4 管程和条件变量设计实现

-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现

-19.5 哲学家就餐问题

--19.5 哲学家就餐问题

第二十讲 死锁和进程通信

-20.1 死锁概念

--20.1 死锁概念

-第二十讲 死锁和进程通信--20.1 死锁概念

-20.2 死锁处理方法

--20.2 死锁处理方法

-第二十讲 死锁和进程通信--20.2 死锁处理方法

-20.3 银行家算法

--20.3 银行家算法

-第二十讲 死锁和进程通信--20.3 银行家算法

-20.4 死锁检测

--20.4 死锁检测

-第二十讲 死锁和进程通信--20.4 死锁检测

-20.5 进程通信概念

--20.5 进程通信概念

-第二十讲 死锁和进程通信--20.5 进程通信概念

-20.6 信号和管道

--20.6 信号和管道

-第二十讲 死锁和进程通信--20.6 信号和管道

-20.7 消息队列和共享内存

--20.7 消息队列和共享内存

-第二十讲 死锁和进程通信--20.7 消息队列和共享内存

第二十一讲 文件系统

-21.1 文件系统和文件

--21.1 文件系统和文件

-第二十一讲 文件系统--21.1 文件系统和文件

-21.2 文件描述符

--21.2 文件描述符

-第二十一讲 文件系统--21.2 文件描述符

-21.3 目录、文件别名和文件系统种类

--21.3 目录、文件别名和文件系统种类

-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类

-21.4 虚拟文件系统

--21.4 虚拟文件系统

-第二十一讲 文件系统--21.4 虚拟文件系统

-21.5 文件缓存和打开文件

--21.5 文件缓存和打开文件

-第二十一讲 文件系统--21.5 文件缓存和打开文件

-21.6 文件分配

--21.6 文件分配

-第二十一讲 文件系统--21.6 文件分配

-21.7 空闲空间管理和冗余磁盘阵列RAID

--21.7 空闲空间管理和冗余磁盘阵列RAID

-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID

第二十二讲 实验八 文件系统

-22.1 总体介绍

--22.1 总体介绍

-第二十二讲 实验八 文件系统--22.1 总体介绍

-22.2 ucore 文件系统架构

--22.2 ucore 文件系统架构

-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构

-22.3 Simple File System分析

--22.3 Simple File System分析

-第二十二讲 实验八 文件系统--22.3 Simple File System分析

-22.4 Virtual File System分析

--22.4 Virtual File System分析

-第二十二讲 实验八 文件系统--22.4 Virtual File System分

-22.5 I/O设备接口分析

--22.5 I/O设备接口分析

-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析

-22.6 执行流程分析

--22.6 执行流程分析

第二十三讲 I/O子系统

-23.1 I/O特点

--视频

-第二十三讲 I/O子系统--23.1 I/O特点

-23.2 I/O结构

--816C80A0F5E3B8809C33DC5901307461

-第二十三讲 I/O子系统--23.2 I/O结构

-23.3 I/O数据传输

--C58221E14388B9DB9C33DC5901307461

-第二十三讲 I/O子系统--23.3 I/O数据传输

-23.4 磁盘调度

--567A3F1FCBFB3F4C9C33DC5901307461

-第二十三讲 I/O子系统--23.4 磁盘调度

-23.5 磁盘缓存

--C327536B80D25CE79C33DC5901307461

-第二十三讲 I/O子系统--23.5 磁盘缓存

html

-html

--html

5.1 计算机体系结构和内存层次笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。