计算机组成结构—IO方式

        目录

一、程序查询方式

1. 程序查询基本流程

2. 接口电路

3. 接口工作过程

二、程序中断方式

1. 程序中断基本流程

2. 接口电路

3. I/O 中断处理过程

三、DMA 方式

1. DMA 的概念和特点

2. DMA 与 CPU 的访存冲突

3. DMA 接口的功能

4. DMA 接口的组成

5. DMA 的工作过程

6. DMA 方式和程序中断方式的对比


        I/O 设备与主机交换信息时,对信息传送的控制方式一共有五种:程序查询方式程序中断方式直接存储器存取方式(DMA)、I/O 通道方式、I/O 处理机方式。

        其中,前两种方式都是通过 CPU 中程序指令的执行来控制的。

一、程序查询方式

        程序查询方式是由 CPU 通过程序不断查询 I/O 设备是否已做好准备,从而控制 I/O 设备与主机交换信息。

1. 程序查询基本流程

        采用这种方式实现主机和 I/O 设备交换信息,要求 I/O 接口内设置一个 状态标记,用来反映 I/O 设备是否准备就绪。CPU 通过检测这个标记,就可以了解 I/O 设备的准备情况。

        当 I/O 设备较多时,CPU 就需要按 I/O 设备在系统中的 优先级 进行逐级查询。

        为了完成这个查询的流程,CPU 通常需要执行以下 3 条指令:

  • 测试指令:用来查询 I/O 设备是否准备就绪;

  • 传送指令:当 I/O 设备准备就绪时,执行数据的传送指令;

  • 转移指令:如果 I/O 设备未准备就绪,应执行转移指令;转至测试指令,继续测试 I/O 设备的状态。

        当执行一段程序,需要启动某个 I/O 设备进行数据交互时,就把查询流程插入到运行的程序中。具体的查询流程如下:

① 这种方式传送数据时要占用 CPU 中的寄存器,所以首先要将寄存器原内容保护起来;

② 传送的往往是一批数据,所以需要设置 I/O 设备与主机交换数据的计数值,用来控制数据量;

③ 设置要传送的数据在主存缓冲区的首地址;

④ CPU 启动 I/O 设备;

⑤ 将 I/O 接口中的设备状态标志取至 CPU 并测试 I/O 设备是否准备就绪。如果未准备就绪,则等待,直到准备就绪为止;当准备就绪时,接着可实现传送。

        对输入而言,准备就绪意味着接口电路中的数据缓冲寄存器已装满欲传送的数据,称为 输入缓冲满,CPU 可以取走数据;对输出而言,准备就绪意味着接口电路中的数据已被设备取走,称为 输出缓冲空,这样 CPU 可以再次将数据送到接口,设备则可以再次从接口接收数据。

⑥ CPU 执行 I/O 指令,从 I/O 接口的数据缓冲寄存器中读出一个数据(输入),或者把一个数据写入 I/O 接口中的数据缓冲寄存器内(输出),同时将接口中的状态标志复位;

⑦ 修改主存地址;

⑧ 修改计数值,若原设置计数值为原码,则依次减 1;若原设置计数值为负数的补码,则依次加 1;

⑨ 判断计数值。若计数值不为 0,表示一批数据尚未传送完,重新启动外设继续传送;若计数值为 0,则表示一批数据已传送完毕;

⑩ 结束 I/O 传送,继续执行原程序。


        只要一启动 I/O 设备,CPU 就不断地查询 I/O 设备的准备情况,这就会暂停原程序的执行。当 I/O 设备准备就绪后,就将数据逐个传送;直到数据全部传送结束,CPU 才重新回到原程序继续执行。

        所以在程序查询方式下,CPU 和 I/O 设备是串行工作的,效率不高。

2. 接口电路

        程序查询方式对应的接口电路基本组成如下:

        图中的数据缓冲寄存器用来存放要传送的数据;D 是完成触发器,B 是工作触发器。

3. 接口工作过程

        以输入设备为例,数据应该从 I/O 设备传送至主机。I/O 接口的具体工作过程为:

① CPU 执行 I/O 指令启动输入设备;指令中的设备码字段,通过地址线(设备选择线)送至设备选择电路;

② 如果接口的设备码与地址线上信号相同,设备被选中,输出 SEL 有效;

③ I/O 指令中的启动命令输入,通过与非门将完成触发器 D 置 0(复位),将工作触发器 B 置1(置 位);

④ 工作触发器 B 输出启动信号,启动设备开始工作;

⑤ 输入设备将数据送至数据缓冲寄存器;

⑥ 输入缓冲满,由设备发出工作结束信号,将完成触发器 D 置 1,工作触发器 B 置 0;

⑦ 完成触发器 D 输出 1,通知 CPU “准备就绪”;

⑧ CPU 执行输入指令,将数据缓冲寄存器中的数据取出,送至通用寄存器,再存入主存。

二、程序中断方式

        程序查询方式效率较低,主要原因就是 I/O 设备工作速度较慢,CPU 启动设备后,需要等待一段时间 I/O 设备才能准备就绪、开始信息交换;而 CPU 则耗费了大量时间进行状态查询。

        如果 CPU 在启动 I/O 设备后,继续执行自身的原程序;等到 I/O 设备准备就绪后,主动向 CPU 发出请求再予以响应,就可以大大提升工作效率。这个请求就可以以 I/O 中断 的形式出现。

1. 程序中断基本流程

        上图中,CPU 在执行 I/O 指令启动 I/O 设备之后,继续执行原程序;在执行第 M 条指令时,I/O 设备准备就绪,发来了中断请求,于是 CPU 在第 M 条指令执行结束后进入中断周期,转而执行中断服务程序;等到中断服务程序执行完毕,再返回到程序断点处,继续执行第 M + 1 条指令。

        这种利用 I/O 中断,暂时中断 CPU 现行程序、转入 I/O 服务程序的方式,就称为 程序中断方式

        采用程序中断方式,CPU 就可以不必等待 I/O 设备的准备过程,工作效率得到了明显的提升。不过 CPU 和 I/O 接口需要增加响应的硬件电路,还要编制对应的中断服务程序。

2. 接口电路

        很明显,采用程序中断方式,必须在接口电路中增加中断处理相应的硬件,比如中断请求触发器 INTR、中断屏蔽触发器 MASK、排队器、中断向量地址形成部件等。

        上图中,完成触发器 D 和 屏蔽触发器 MASK 的输出通过与非门连接,产生中断请求信号;并通过排队器判优,交给设备编码器(中断向量地址形成部件)产生向量地址。

3. I/O 中断处理过程

        同样,CPU 响应 I/O 设备提出中断请求的条件,是允许中断触发器 EINT = 1;CPU 响应 I/O 中断请求的时间,是在某条指令执行阶段的结束时刻。

        以输入设备为例,I/O 中断处理的过程为:

① CPU 发出 I/O 设备启动命令,将完成触发器 D 置 0,将完成触发器 B 置 1;

② 工作触发器 B 启动设备,开始工作;

③ 输入设备将数据送至数据缓冲寄存器;

④ 输入缓冲满,设备发出工作结束信号,将完成触发器 D 置 1,完成触发器 B 置 0;

⑤ 指令执行阶段的结束时刻,CPU 发出中断查询信号;

⑥ 当设备准备就绪(D = 1),且未被屏蔽(MASK = 0)时,中断请求触发器 INTR 被置 1,向 CPU 发出 中断请求;同时 INTR 信号送至排队器,进行 中断判优

⑦ 当 EINT = 1(允许中断),而设备又被排队器选中时,进入 中断响应 阶段;CPU 发来的中断响应信号 INTA 将排队器的输出送至编码器,形成向量地址;

⑧ 向量地址送至 PC,作为下一条指令的地址;随后跳转至中断服务程序入口地址,进入 中断服务 阶段;

⑨ 执行中断服务程序,通过输入指令将数据缓冲寄存器的数据取出,送至通用寄存器,再存入主存。

⑩ 中断服务程序最后一条指令是 中断返回 指令,执行结束后返回原程序的断点处。

        这里也可以看出,一次中断处理的过程可以简单分为 中断请求中断判优中断响应中断服务中断返回 5 个阶段。

三、DMA 方式

1. DMA 的概念和特点

        如果 I/O 设备能直接与主存交换信息而不占用 CPU,那么 CPU 的资源利用率就可以进一步提高,这种方式就被称为 直接存储器存取(Direct Memory Access,DMA)。

        DMA 方式的特点是,I/O 设备与主存之间有一条直接数据通路。因此,I/O 设备可以与主存直接交换信息,而不需要调用中断服务程序。这样 ,CPU 就不必暂停现行程序、专门去为设备服务,省去了保护现场和恢复线程的过程;所以工作效率比程序中断方式更高。

        对于 高速 I/O 设备 或者 辅存,如果采用程序中断方式,那么每次与主机进行数据交互时都要等待 CPU 做出中断响应,很可能会造成数据丢失;因此更适合采用 DMA 方式

2. DMA 与 CPU 的访存冲突

        在 DMA 方式中,由于 DMA 接口与 CPU 都可以访问主存,这就有可能出现两者争用主存的冲突。

        I/O 设备请求进行 DMA 传送时,会遇到三种情况:

  • CPU 此时不需要访问主存:这时 I/O 设备与 CPU 不发生冲突;

  • CPU 正在访问主存:这时必须等存取周期结束,CPU 才会将总线占有权让出;

  • CPU 也同时要求访问主存:这就出现了访存冲突。

        发生访存冲突时,I/O 访存要优先于 CPU 的访存,因为 I/O 设备不立即访问主存的话就可能丢失数据。所以一般这时需要 CPU 进行 “让步”。

        为了有效地分时使用主存,通常采用以下三种方法来解决访存冲突:

(1)停止 CPU 访问主存

        这种方法就是 CPU 彻底停止访存、等 I/O 访存结束之后再继续进行。

        当外设要求传送一批数据时,由 DMA 接口向 CPU 发一个停止信号,要求 CPU 放弃地址线、数据线和有关控制线的使用权。DMA 接口获得总线控制权后,开始进行数据传送;数据传送结束后,DMA 接口通知 CPU 可以使用主存,并把总线控制权交回给 CPU。

        这种方式的优缺点如下:

  • 优点:控制简单,适用于数据传输率很高的 I/O 设备,进行成组数据的传送。

  • 缺点:DMA 接口在访问主存时,CPU 基本上处于不工作状态或保持原状态。

        所以这种方式下,CPU 对主存的利用率不高。

(2)周期挪用(或周期窃取)

        如果 I/O设备 发出 DMA 请求时,CPU 并不是完全放弃总线的使用权,而是允许 I/O 设备 “挪用” 或 “窃取” 总线使用权一个或几个主存周期;这种方式就被称为 周期挪用,或 周期窃取。当 DMA 不请求时,CPU 仍可以继续访问主存。

        这就意味着,CPU 在执行访问主存指令过程中,插入了 DMA 请求,那么就会被窃取了若干个存取周期,使CPU 延缓若干存取周期后再访问主存。

        与 CPU 暂停访存的方式相比,这种方式既实现了 I/O 传送,又较好地发挥了主存与 CPU 的效率,是一种广泛采用的方法。

(3)DMA 与 CPU 交替访问

        这种方法就是 DMA 与 CPU 轮流进行访存,平均分配主存的使用时间。

        交替访问的方法适合于 CPU 的工作周期比主存存取周期长的情况。

        例如,CPU 的工作周期是主存存取周期的 2 倍以上,那么可以将一个 CPU 周期分为 C~1~ 和 C~2~ 两个子周期,

        其中 C~1~ 专门进行 CPU 访存,而 C~2~ 专门进行 DMA 访存。

        这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过 C~1~ 和 C~2~ 分别控制的。CPU 与 DMA 接口各自有独立的访存地址寄存器、数据寄存器和读/写信号。

        在这种工作方式下,CPU 既不停止主程序的运行,也不会进入等待状态。当然,其相应的硬件逻辑也会变得更为复杂。

3. DMA 接口的功能

        采用 DMA 方式进行数据传送时,数据的传输过程完全由 DMA 接口电路控制;因此 DMA 接口也被称为 DMA 控制器

        DMA 接口应该具有以下功能:

  • 向 CPU 申请 DMA 传送;

  • 在 CPU 允许 DMA 工作时,处理总线控制权的转交;

  • 在 DMA 期间管理系统总线,控制数据传输;

  • 确定数据传送的起始地址和数据长度,并在传送过程中进行修正;

  • 数据块传送结束时,向 CPU 提交 DMA 操作完成的信号。

4. DMA 接口的组成

        最简单的 DMA 接口组成如下图所示:

        接口中的主要部件有:

  • 主存地址寄存器(AR):用于存放主存中需要交换的数据的地址。DMA 传送数据前,应该将数据在主存中的首地址送至 AR;DMA 传送过程中,每交换一次数据,就将 AR 的内容加 1,直到一批数据传送完毕。

  • 字计数器(WC):用来记录传送数据的总字数。DMA 传送过程中,每传送一个数据字,WC 就减 1(若是补码则 加 1),直到计数器为 0(溢出),就表示这批数据传送完毕;DMA 接口就可以向 CPU 发出中断请求信号了。

  • 设备地址寄存器(DAR):存放 I/O 设备的设备码,或者辅存中的寻址信息。

  • 数据缓冲寄存器(BR):用来暂存每次要传送的数据。

  • DMA 控制逻辑:由控制电路、时序电路、命令状态控制寄存器等组成,负责管理 DMA 的传送过程。每当设备准备好一个数据字,就向 DMA 接口提出请求(DREQ),DMA 控制逻辑就向 CPU 请求 DMA 服务,发出总线使用权的请求信号 HRQ;CPU 发出响应信号 HLDA 后,DMA 控制逻辑就开始负责管理 DMA 传送的全过程,并通知设备已经被授权了一个 DMA 周期(DACK)。

  • 中断机构:用来提出中断请求。当字计数器 WC 溢出(全 0)时,一批数据传送完毕,这个 “溢出信号” 就通过中断机构向 CPU 提出中断请求,由 CPU 做 DMA 操作的后处理。

        需要注意的是,这里和程序中断方式中的中断,都属于 I/O 中断;但中断的目的不同:程序中断方式的中断是为了传送数据,而 DMA 中的中断只是为了报告一批数据传送结束。

5. DMA 的工作过程

        DMA 的数据传送过程可以分为 预处理数据传送后处理 三个阶段。

(1)预处理

        在 DMA 接口开始工作之前,需要先做一些准备工作,由 CPU 给它预置一些信息;这就是 “预处理” 阶段。

  • 告诉 DMA 控制逻辑数据传送的方向,是输入(写主存)还是输出(读主存);

  • 将设备码写入 DMA 设备地址寄存器 DAR,并启动设备;

  • 将交换数据的主存起始地址,写入 DMA 主存地址寄存器 AR;

  • 将交换数据的个数,写入字计数器 WC

        这些准备工作由 CPU 执行几条 I/O 指令完成,也就是程序的初始化阶段。这些工作完成后,CPU 可以继续执行原来的程序。

        当 I/O 设备准备就绪时,就通过 DMA 接口向 CPU 提出占用总线的请求;若有多个 DMA 接口同时申请,就按优先级由 硬件排队判优逻辑 决定响应顺序。

        I/O 设备得到主存总线的控制权后,数据的传送就全部由 DMA 接口进行管理。

(2)数据传送

        DMA 方式是以 数据块 为单位进行数据传送的。

        这里以周期挪用的 DMA 方式为例,对于数据输入的场景,数据传送的流程如下:

① 当设备准备好一个数据字时,发出选通信号,将该字读到数据缓冲寄存器(BR)中,表示数据缓冲寄存器 “满”;

② 与此同时,设备向 DMA 接口发出请求(DREQ);

③ DMA 接口向 CPU 申请总线控制权(HRQ);

④ CPU 发回应答信号 HLDA,表示允许将总线控制权交给 DMA 接口;

⑤ 将主存地址寄存器 AR 中的主存地址,送至地址总线,并向主存发出写命令;

⑥ 通知设备已被授予一个 DMA 周期(DACK),并为交换下一个字做准备;

⑦ 将数据缓冲寄存器 DAR 的内容,送至数据总线;

⑧ 主存将数据总线上的信息,写至地址总线指定的存储单元中;

⑨ 修改 AR 中的主存地址和字计数值 WC。

⑩ 判断数据块是否传送结束,如果没有结束则继续传送;如果已结束(字计数器溢出),则向 CPU 发出程序中断请求,标志数据块传送结束。

        若为输出数据,整体步骤类似,主要的不同就是:

  • 第 ① 步需要将 BR 中的数据送至 I/O 设备,表示 BR 已 “空”;

  • 第 ⑤ 步需要向主存发出读命令;

  • 第 ⑦ ⑧ 步,是将主存相应存储单元的内容,通过数据总线写入 BR,并送至输出设备;

(3)后处理

        当 DMA 的中断请求得到响应后,CPU 停止原程序的执行,转而去执行中断服务程序,做一些 DMA 的结束工作,这就是 “后处理” 阶段。

        DMA 的结束阶段工作主要包括:

  • 校验送入主存的数据是否正确;

  • 决定是否继续用 DMA 传送其他数据块。若继续传送,则又要对 DMA 接口进行初始化;若不需要传送,则停止外设;

  • 测试在传送过程中是否发生错误;如果出错,则转错误诊断及处理程序。

6. DMA 方式和程序中断方式的对比

        DMA 方式和程序中断方式是 I/O 设备最为常见的信息传送控制方式。两者都用到了中断,但中断的目的不同:程序中断方式的中断是为了传送数据,而 DMA 中的中断只是为了报告一批数据传送结束;而且中断的优先级上,DMA 中断的优先级更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件架构初探

MVC架构软件层次结构是面向实体的,他最底层是实体类,实体类中封装了对象的抽象数据类型(数据结构和对数据结构的基本操作)。然后向上一层数据处理层提供接口,数据处理层利用模型层提供的对象和基本操作进一步进行算法的…

Elasticsearch 认证模拟题 - 15

一、题目 原索引 task1 的字段 title 字段包含单词 The,查询 the 可以查出 1200 篇文档。重建 task1 索引为 task1_new,重建后的索引, title 字段查询 the 单词,不能匹配到任何文档。 PUT task1 {"mappings": {"…

Linux学习之查找文件

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

机器学习----奥卡姆剃刀定律

奥卡姆剃刀定律(Occam’s Razor)是一条哲学原则,通常表述为“如无必要,勿增实体”(Entities should not be multiplied beyond necessity)或“在其他条件相同的情况下,最简单的解释往往是最好的…

Qt基于SQLite数据库的增删查改demo

一、效果展示 在Qt创建如图UI界面,主要包括“查询”、“添加”、“删除”、“更新”,四个功能模块。 查询:从数据库中查找所有数据的所有内容,并显示在左边的QListWidget控件上。 添加:在右边的QLineEdit标签上输入需…

pc之间的相互通信详解

如图,实现两台pc之间的相互通信 1.pc1和pc2之间如何进行通讯。 2.pc有mac和ip,首先pc1需要向sw1发送广播,sw1查询mac地址表,向router发送广播,router不接受广播,router的每个接口都有ip和mac,…

深入了解 Linux 命令 `db_stat`:数据库统计信息的获取

深入了解 Linux 命令 db_stat:数据库统计信息的获取 在 Linux 系统中,虽然没有一个标准的、内建的 db_stat 命令(因为 db_stat 通常与特定的数据库系统相关),但我们可以假设这是一个用于查询数据库统计信息的命令。本…

【名词解释】Unity中的Toggle组件及其使用示例

Unity中的Toggle组件是一个UI控件,它允许用户切换一个选项的开或关状态。Toggle通常用于创建复选框(checkbox)和开关(switch)等UI元素,用户可以通过点击或触摸来改变其状态。 Toggle组件的主要特性包括&am…

【Vue】Vue路由-404

作用 当路径找不到匹配时,给个提示页面 位置 404的路由,虽然配置在任何一个位置都可以,但一般都配置在其他路由规则的最后面 语法 path: “*” (任意路径) – 前面都不匹配就命中最后这个 import NotFind from /views/NotFindconst rout…

Jupyter | 如何在Jupyter应用中添加、删除虚拟环境

Jupyter中添加虚拟环境步骤: 打开Anaconda Prompt,用conda创建虚拟环境,可指定Python版本: conda create -n myenv python3.6进入创建的虚拟环境: activate myenv安装ipykernel包: pip install --user …

阿里云隐私计算二期ECS云上资源配置

资源申请 感谢阿里云“云工开物”高校用云支持计划,我们可以获得一定额度的云资源,用于实现作业。具体申请流程参考 云工开物优惠券领取流程。 注意申请时需要勾选使用公网 IP 选项,方便我们使用 Web Client 研发。 环境准备 SSH 连接到 …

使用 Scapy 库编写 TCP SYN 洪水攻击脚本

一、介绍 TCP SYN 洪水攻击是一种拒绝服务攻击(Denial-of-Service, DoS)类型,攻击者通过向目标服务器发送大量的伪造TCP连接请求(SYN包),消耗目标服务器的资源,导致其无法处理合法用户的请求。…

13. ESP32-HTTPClient(Arduino)

使用ESP32 Arduino框架的HTTPClient库进行HTTP请求 在ESP32开发里,网络通信是挺重要的一部分,你可能需要从服务器拿数据啊,或者把传感器数据发到云端什么的。不过别担心,ESP32 Arduino框架给我们提供了HTTPClient库,让…

力扣 有效的括号 栈

Problem: 20. 有效的括号 文章目录 思路复杂度&#x1f49d; Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f49d; Code class Solution {static Map<Character, Character> m…

Vue进阶(八十八)前端测试工具介绍

文章目录 一、前言1.1 引入1.2 基础语法1.2.1 全局函数 describe 和 it1.2.2 断言 expect1.2.3 匹配器1.2.4 snapshot 快照1.2.5 测试用例覆盖率报告1.2.6 React Testing Library render1.2.7 screen1.2.8 查询函数1.2.9 waitFor1.2.10 fireEvent 和 userEvent 二、Jest 基本用…

【启明智显分享】基于工业级芯片Model3A的7寸彩色触摸屏应用于智慧电子桌牌方案

一场大型会议的布置&#xff0c;往往少不了制作安放参会人物的桌牌。制作、打印、裁剪&#xff0c;若有临时参与人员变更&#xff0c;会务方免不了手忙脚乱更新桌牌。由此&#xff0c;智能电子桌牌应运而生&#xff0c;工作人员通过系统操作更新桌牌信息&#xff0c;解决了传统…

电脑提示msvcp140.dll丢失的解决方法(附带详细msvcp140.dll文件分析)

msvcp140.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于Microsoft Visual C 2015 Redistributable的一部分。它全称为 "Microsoft C Runtime Library" 或 "Microsoft C Runtime Library"&#xff0c;表明该文件是微软C运行时库的一…

uniapp录音播放功能

ui效果如上。 播放就开始倒计时&#xff0c;并且改变播放icon&#xff0c;另外录音则停止上一次录音。 播放按钮&#xff08;三角形&#xff09;是播放功能&#xff0c;两竖是暂停播放功能。 const innerAudioContext wx.createInnerAudioContext();export default{data(){ret…

nacos新版踩坑

背景 官方软件更新的背景 2.2.2版本之前的Nacos默认控制台&#xff0c;无论服务端是否开启鉴权&#xff0c;都会存在一个登录页&#xff0c;需要登录成功才能操作&#xff1b;这导致很多用户被误导认为Nacos默认是存在鉴权的。在社区安全工程师的建议下&#xff0c;Nacos自2.…

【设计模式深度剖析】【2】【行为型】【命令模式】| 以打开文件按钮、宏命令、图形移动与撤销为例加深理解

&#x1f448;️上一篇:模板方法模式 | 下一篇:职责链模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 命令模式定义英文原话直译如何理解呢&#xff1f; 四个角色1. Command&#xff08;命令接口&#xff09;2. ConcreteCommand&#xff08;具体命令类&…