
如果你正在准备408考研看到“DMA方式”这几个字大概率会有点头疼。计算机组成原理里I/O设备与主机之间的信息传送控制方式一共就四种程序查询、程序中断、DMA、通道前两个还算好理解一到DMA就容易绕进去。尤其是DMA和中断的区别、三种访存冲突处理方式、数据传送的基本单位到底是字还是块这些点在408里反反复复出现每年都有不少人在这里翻车。这篇就把DMA方式掰开揉碎讲清楚它到底解决了什么问题、一次完整的DMA传送分几步、三种主存访问冲突处理方式怎么区分、DMA控制器内部有哪些组成部分、和中断的区别怎么答不丢分最后再结合真题套路和嵌入式开发的真实场景帮你把理论和实际串起来。不管你是刚开始复习计组的萌新还是二刷准备冲刺的考生这篇都能给你点实在的东西。1. 先搞懂背景为什么前面的控制方式不够用了1.1 程序查询方式CPU成了“盯梢的”程序查询方式是最原始、最容易理解的I/O控制方式。它的工作逻辑非常简单粗暴CPU不断读取I/O设备的状态寄存器看看设备准备好了没有。设备准备好数据CPU就把数据读走设备没准备好CPU就继续查一直查到准备好为止。这个过程你可以理解成在食堂等饭你站在出餐窗口前面每隔几秒就问一次“好了没好了没”直到阿姨把饭递给你。这个过程中你什么都干不了全部精力都花在“问”这件事上。CPU也是一样从发出查询指令到数据传送结束CPU全程被这个设备“绑架”别的任务一概不处理。这种方式的致命问题就是CPU利用率太低。查询期间CPU不能执行用户程序而I/O设备的速度通常比CPU慢好几个数量级比如磁盘机械臂寻道可能要几毫秒而CPU执行一条指令才几纳秒。这一毫秒的等待时间相当于CPU跑空了几十万个指令周期。所以程序查询方式只适用于非常简单的低速设备比如单板机上读取一个按键状态、读取一个拨码开关值。1.2 程序中断方式CPU被频繁打断搬运效率还是低程序中断方式比查询方式进了一大步。它的核心思路是设备准备数据的时候CPU先去干别的事等设备数据就绪后向CPU发出中断请求CPU暂停当前程序去执行中断服务程序在中断服务程序里完成数据传送传送完再返回原来的程序继续执行。还是拿食堂类比阿姨开始炒你的菜时告诉你“炒好了我叫你”你就可以先去打个汤、拿个餐具等阿姨喊你的时候再过去端菜。CPU利用等待时间去执行其他程序这本质上就是“异步通知机制”比“轮询”聪明得多。但中断方式也有明显的局限性。一是每次数据传送都以字或字节为单位设备每准备好一个字就要打断CPU一次。假设一个磁盘扇区有512字节用中断方式接收这512字节CPU要被中断512次。二是中断响应本身有开销保护现场、识别中断源、跳转到中断服务程序、恢复现场这一套流程少说也要几十个指令周期。如果每次传送的数据量很小、传送频率很高那中断开销甚至可能比实际搬运数据的时间还大。所以程序中断方式虽然在CPU利用率上优于查询方式但它只适合传送频率不太高、数据量比较小的场合比如键盘输入、打印机输出。对于磁盘、网卡、显卡这类高速块设备中断方式根本扛不住。1.3 DMA的定位找了一个“专职搬运工”DMADirect Memory Access直接存储器存取方式完全换了一种思路数据传送不再经由CPU中转而是由DMA控制器DMAC这个专门的硬件来负责。CPU要做的只是在传送开始前把参数告诉DMAC然后在传送结束后处理一下结果中间所有的数据搬运全由DMAC自己完成。你可以把DMAC理解成仓库里的自动搬运机器人。老板CPU只需要告诉机器人“把那批货从1号库房搬到2号库房共500箱”然后就可以去接别的客户了。机器人自己认路、自己搬货、自己清点数量搬完了按铃通知老板“搬完了你来验收一下”。搬货的全过程老板完全不参与。这正是DMA方式的核心价值把CPU从繁琐的数据搬运工作中彻底解放出来让数据在I/O设备和主存之间直接传送大大提升了系统效率。这也是408考试中反复考察DMA的原因——它代表了高性能I/O控制的核心思想。2. 一次完整的DMA传送CPU只在两头出现2.1 预处理CPU给DMAC“交代任务”DMA传送的第一步是预处理这个阶段的主角是CPU。CPU需要向DMA控制器写入以下几类信息传送方向数据是从I/O设备读到主存还是从主存写到I/O设备。方向写错整个传送就全乱套了。主存起始地址数据要写到内存的哪个位置或者从内存的哪个位置开始读。这个地址会被放入DMAC内部的主存地址寄存器中。传送字字节数本次一共要搬多少数据放入字计数器中。设备地址告诉DMAC是哪个I/O设备参与传送相当于现场指明“货从哪个仓库出”。预处理阶段结束后CPU就可以回到原来的程序继续执行了。也就是说CPU在DMA传送过程中只出现了一“头”——开头下指令。剩下的事情全部交给DMAC。这里有个容易忽略的点预处理虽然由CPU完成但CPU写入的是DMAC的寄存器不是直接读写I/O设备的数据寄存器。在408题目里如果问“DMA传送前由谁完成初始化工作”答案一定是CPU而不是设备或DMAC自己。有些同学概念一混看到“DMA”就以为整个过程都是硬件自动完成的连初始化也选错这就很可惜了。2.2 数据传送DMAC接管总线以块为单位搬运数据传送阶段是DMA方式最核心的部分也是和中断方式差异最明显的地方。DMAC获得总线控制权后数据直接在I/O设备和主存之间传送每传送一个字或字节需要经历以下几步I/O设备准备好一个数据向DMAC发送DMA请求信号DRQDMA Request。DMAC收到请求后向CPU发送总线请求信号HRQHold Request。CPU在当前总线周期结束后响应总线请求发出总线允许信号HLDAHold Acknowledge并让出总线控制权。DMAC接管总线把I/O设备送来的数据先暂存到自己的数据缓冲寄存器中然后再写入主存地址寄存器所指向的主存单元。主存地址寄存器的值自动加1指向下一个要写入的地址。字计数器的值自动减1表示还剩多少数据没传完。然后重复上述过程直到字计数器减到0说明整个数据块传送完毕。这个过程中最值得注意的细节是DMA传送的基本单位是数据块这是408选择题的高频考点。程序中断方式传送的基本单位是字或字节DMA方式传送的则是连续的数据块。所以考题里如果说“DMA方式以字为单位传送数据”这一定是错的。另外还有一个细节值得思考既然数据是I/O设备和主存之间直接传送的为什么DMA控制器内部还需要一个数据缓冲寄存器原因在于速度匹配。I/O设备的数据宽度和主存的数据宽度未必一致设备送出数据的速率和主存接收数据的速率也可能存在差异。举个简单例子某设备一次输出8位数据而主存总线宽度是32位这时就需要缓冲寄存器把4个8位数据拼成一个32位数据再写入主存。数据缓冲寄存器在这里起到的是“中转站”和“速度适配器”的作用没有它设备和主存之间就谈不上“直接”传送。2.3 后处理传送完成DMAC用中断向CPU汇报当字计数器减到0整个数据块传送完毕DMAC会向CPU发出中断请求这就是后处理阶段。CPU响应这个中断后进入中断服务程序做的事情包括检查传送过程是否有错误比如校验出错、对传送结果进行处理比如把缓冲区交给用户程序、回收系统资源等。这里有一个很多初学者都会掉进去的坑DMA传送结束之后要发中断那DMA方式到底算不算中断方式不算。DMA方式的后处理阶段虽然用了中断机制但这个中断只是“通知CPU来收尾”的一种手段真正搬运数据的过程完全由硬件完成CPU没有参与。而程序中断方式里的中断恰恰是CPU进行数据搬运的“入场券”——CPU必须在中断服务程序里一个一个地搬数据。两者有本质区别。408真题经常在选项里混淆这一点比如写“DMA方式与中断方式一样都是通过执行中断服务程序来完成数据传送”这种说法看着像对的实际上是错的。后处理阶段的另一个考点是DMA中断请求和普通中断请求同时到达时谁优先答案通常是DMA请求优先。因为DMA处理的往往是高速设备的数据流如果DMA请求得不到及时响应I/O设备内部的数据缓冲可能溢出数据就丢了。而普通中断慢一点响应最多就是系统响应变慢不会造成数据损坏。这个优先级顺序在周期挪用的场景下显得尤其重要下面细说。3. DMA和CPU抢主存三种访存冲突解决办法DMA方式下数据传送不经过CPU内部寄存器但数据终究要写入主存或从主存读出而CPU执行指令时也要访问主存。两个设备都想用同一扇“门”这就产生了访存冲突。408大纲要求掌握的解决冲突方案一共有三种停止CPU访存、周期挪用周期窃取、交替访存。3.1 停止CPU访存简单粗暴但CPU“躺平”停止CPU访存方式下当DMAC需要传送一个数据块时它会向CPU发出总线请求CPU在现行机器周期结束后让出总线控制权并且在传送期间的连续若干个存取周期内都不再访存直到整个数据块传送完毕后DMAC才把总线控制权还给CPU。这种方式的特点是控制逻辑最简单DMAC只要获得总线控制权就能“一口气”传完整个数据块传送效率高。缺点也很明显在传送期间CPU完全无法访问主存相当于整个系统都在等DMA搬完货。如果数据块很大、DMA传送又很频繁CPU的执行效率会被严重拉低。用食堂来类比DMA开始端菜之后整个窗口都被占了CPU连从窗口拿调料都没办法只能干等着。这种方式适合大批量高速数据传送比如磁盘数据读入内存系统本身可以容忍CPU短暂“暂停”。3.2 周期挪用用时间碎片交数据周期挪用也叫周期窃取思路和停止访存完全不同DMAC并不是一次性占用总线传完整个数据块而是每当I/O设备准备好一个数据DMAC就向CPU申请一个存取周期利用这个周期把数据传走然后立刻释放总线让CPU继续访存。这里有两种具体情况。一种情况是CPU正在访存DMAC请求到达CPU会在本周期结束后暂停一个周期把总线让给DMA另一种情况是CPU暂时不在访存比如正在执行不需要访问存储器的内部操作像某些算术逻辑运算、寄存器操作此时总线上没有数据传送活动DMAC拿一个存取周期来传数据CPU完全感觉不到被“打断”。周期挪用的优点是对CPU的影响小DMA只是“偷走”了一个个零散的存取周期CPU绝大部分时间仍然在正常执行程序。缺点是因为每次只能传一个字或字节而且DMA的申请时机要取决于设备的数据准备情况和CPU的访存状态如果DMA请求总是碰不到可用的空闲周期传送效率就会受影响。这里有一个408常考的概念必须记住在周期挪用的机制下如果DMA和CPU同时请求访存主存通常优先响应DMA。因为DMA传送的数据来自于高速I/O设备如果数据已经准备好而DMA不能马上取走设备缓冲区就可能溢出而CPU少访存一个周期影响的最多是执行速度不会造成系统错误。这个优先级设计原则在判断题里经常出现要特别注意。3.3 交替访存一人一个周期互不打扰交替访存方式把时间分成一个个等长的存取周期CPU和DMAC轮流使用主存。也就是说在每个存取周期结束后总线控制权自动切换一次归属方——这个周期归CPU访存下个周期归DMAC访存再下一个周期又归CPU。这种方式其实已经不是“争夺”总线了而是“分时共享”。这种方式最大的好处是CPU和DMA都不需要等待也不存在“请求—响应”的握手过程因此硬件设计上省去了总线请求/允许的交互环节。但代价是硬件逻辑更复杂从外部来看访存频率被强制减半CPU在每个存储周期只能使用一次主存要求CPU的访存频率不能太高或者说CPU内部最好有足够多的缓存降低对主存的依赖。408考试中三种方式的对比题属于“送分题”级别但从历年情况看失分率并不低。我总结过一个记忆方法停止访存是“包场”周期挪用是“插队”交替访存是“排班”。“包场”效率高但耽误事“插队”灵活但不稳定“排班”公平但要硬件配合。答题时先看题目问的是“哪个CPU利用率最高”通常答周期挪用或交替访存视题目描述而定还是“哪个控制最简单”停止访存基本就八九不离十。4. 拆解DMA控制器408喜欢问“它由哪几部分组成”4.1 五大组成部分与对应寄存器如果你看过王道或者唐朔飞的教材会发现DMA控制器的结构图几乎长一个样。408偶尔会出题考察DMA控制器的功能组成这些内容不算难但比较零散需要真正理解每个部件的职责而不是死记名词。主存地址寄存器MAR存放DMA传送过程中要访问的主存地址。每传送一个字地址自动加1保证数据按顺序写入或读出。它对应的是传送过程中的“搬到哪里”。字计数器WC记录剩余待传送的字数。每传送一个字计数器减1减到0表示传送完毕同时向中断机构发出信号。它对应的是“搬多少”。数据缓冲寄存器DBR用于暂存I/O设备与主存之间传送的数据发挥缓冲和速度匹配作用。它对应的是“货从哪里卸到哪里”的临时中转区。DMA控制逻辑负责管理DMA的传送过程包括向CPU发出总线请求、接收总线允许信号、控制地址修改和计数递减、发出读写命令等。它是整个DMAC的“指挥中枢”。中断机构在字计数器归零时发出中断请求通知CPU进行后处理。有时候教材还会提到设备地址寄存器存放I/O设备的编号或寻址信息其实质是告诉DMAC本次传送对接哪个设备。在408选择题中常见的考察方式是给你一个描述让你判断它是哪一部分的职责。比如“自动修改地址以便访问下一存储单元的是”答案就是主存地址寄存器“传送结束时向CPU发出中断请求的是”答案是中断机构。这类题目不绕弯子只要把部件的职责记清楚就能拿分。4.2 从DMA硬件结构看“为什么数据不经过CPU”很多同学不理解DMA“直接”二字到底体现在什么地方。对比程序中断方式就能看清中断方式下数据流动路径是“I/O设备 → CPU寄存器 → 主存”每一步都要在CPU的运算器、寄存器里过一遍而DMA方式下数据流动路径是“I/O设备 → DMAC数据缓冲寄存器 → 主存”CPU只是在外围“看着”数据根本没进过CPU的通用寄存器。这一点用硬件结构图看特别直观。DMAC内部有一根专门的数据通路连接I/O接口和主存传送数据时由DMAC自己发出读写控制信号而不是CPU发出。CPU的作用仅限于在预处理时写几个寄存器的值以及在后处理时响应一次中断。在408厂商题里偶尔会出现“DMA方式传送数据时数据流经CPU”这种干扰选项。如果你理解了硬件结构就会明白这说法是有问题的——数据从设备到DMAC再到主存全程绕开CPU运算器。当然这里说的是数据本身不经过CPU不是说CPU完全不用管预处理和后处理仍然需要CPU参与这两件事要分开理解。5. DMA和中断的区别每年必考的对比题5.1 一张表搞定核心区别DMA和中断是I/O控制方式中对比最频繁的一对概念。408里常以选择题形式让你找出“关于DMA方式描述错误的是哪项”也以简答题形式让你“说明DMA与中断方式的主要区别”。下面这张表建议直接背下来答题时按表内要点展开就不容易漏。对比维度程序中断方式DMA方式数据传送单位字或字节数据块数据传送路径I/O设备 → CPU寄存器 → 主存I/O设备 ↔ DMAC ↔ 主存CPU在传送中的角色必须执行中断服务程序逐字搬运预处理和后处理参与传送过程不参与响应方式指令执行周期结束后响应中断请求总线存取周期结束后响应总线请求中断/请求频率每传一个字字节中断一次一个数据块传送结束后中断一次应用场景低速设备如键盘、打印机高速块设备如磁盘、网卡、显卡数据处理优先级相对较低相对较高数据不及时处理可能丢失这张表背熟之后绝大部分选择题都能直接“对号入座”。比如题目说“DMA方式也要通过中断服务程序完成数据传送”对照表格就知道后半句是错的题目说“DMA方式和中断方式一样以字节为单位传送”对照表格也能秒选正确项。5.2 答题模板简答题这样写不丢分408计组简答题里如果考“简述DMA方式和程序中断方式的区别”不要只写一两句话尽量按三个层面展开。我当年考试总结的答题框架是这样的第一点说中断和DMA的触发机制不同。中断是I/O设备主动向CPU请求CPU暂停当前程序去执行中断服务程序DMA则是由DMAC向CPU请求总线控制权获得总线后直接在主存和设备之间传送数据。第二点说传送方式和数据通路不同。中断方式以字或字节为单位数据经CPU寄存器中转DMA方式以数据块为单位数据直接在设备与主存之间传送不经过CPU。第三点说CPU开销不同。中断方式每传送一个数据单位都要打断CPU一次CPU需要反复进行保护和恢复现场DMA方式只在预处理和后处理阶段打扰CPU大量数据传送期间CPU可以继续执行其他程序。按照这个框架结合表格里的细节展开简答题基本能拿满踩分点。别小看这种“套路化”的答题结构438考试踩点给分你把关键术语“数据块”“不经过CPU”“仅预处理和后处理参与”全写到老师想扣分都难。6. 大题怎么答从DMA传送计算到真题套路6.1 选择题的经典陷阱盘点我把这些年408考过的DMA选择题陷阱大概归了归类几乎年年都是这几个坑在翻新第一个坑传送单位。DMA以“数据块”为单位传送不是“字”也不是“字节”。选项一旦出现“字为单位”直接排除。第二个坑中断次数。DMA一个数据块传送完才发一次中断不是每个字都中断。如果选项写“DMA每传送一个字需要CPU中断一次”这是在混淆中断方式和DMA方式要排除。第三个坑CPU的参与程度。DMA传送期间CPU不是完全不能执行程序得看访存冲突处理方式。停止CPU访存方式下CPU确实不能访存但周期挪用和交替访存方式下CPU基本可以正常执行程序。所以遇到“DMA工作期间CPU一定停止工作”这种绝对化表述要谨慎判断。第四个坑初始化职责。DMA传送前由CPU对DMAC进行初始化配置包括方向、地址、字计数等。有些选项把这部分说成“DMAC自动完成”或者“I/O设备完成”都是错的。第五个坑优先级问题。DMA请求的优先级通常高于普通中断请求因为DMA数据来自高速设备不及时处理会丢数据。这在前文已经说过了不能再栽在同样位置。6.2 大题的计算套路一行一行拆时间408计组大题不会让你设计一个DMA控制器最常考的还是结合磁盘、内存的时序或速率计算。基本的解题思路是抓住一条主线DMA真正传送数据所花的时间往往比设备本身的机械动作时间短得多你要把这两段时间区分开。举个例子说明。假设某磁盘转速为7200rpm平均寻道时间为4ms每扇区512字节磁盘控制器与主存之间的数据传输率为10MB/s现要读取一个扇区的数据。先算磁盘把数据准备好要花多长时间。寻道4ms旋转延迟按半圈算7200rpm即7200转每分钟一转是60/7200≈8.33ms半圈约4.17ms。再加上读取一个扇区的时间512B÷10MB/s51.2us约0.05ms。所以从CPU发起读请求到磁盘数据准备好大约要8.22ms左右。这段时间CPU可以完全干别的跟DMA一点关系都没有。再算DMA搬运这些数据要多久。设一个存取周期为400nsDMA每传一个字节占用一个存取周期那么传送512字节需要512×400ns≈204.8us约0.2ms。这里的关键结论是一次完整读扇区操作中真正的DMA搬运时间占的比例很小绝大部分时间是寻道、旋转延迟等机械动作。所以DMA方式下CPU的等待时间是极短的系统有大量时间处理其他任务。反过来说如果用程序查询方式CPU要在这8.22ms里反复查询磁盘状态整段时间都搭进去了性能差距一目了然。2024年408第45题也考了类似方向的内容涉及DMA读取磁盘数据的分析和计算。网上很多回忆帖都提到这道题把DMA过程和磁盘转速、扇区读取结合起来考本质上就是我上面这个套路先把准备数据的时间算出来再把DMA传送的时间算出来最后讨论CPU在哪个时间段可以干别的、在哪个时间段会受到影响。掌握了这个主线不管题目怎么变参数都能从容应对。6.3 实实在在的答题步骤建议碰到DMA计算大题我建议按下面四步走从题干中提取所有时间参数转速、寻道时间、扇区大小、数据传输率、存取周期、每次DMA请求占用的周期数等。区分“设备准备时间”和“DMA传送时间”分别计算。设备准备时间一般包括寻道、旋转延迟、读写扇区时间DMA传送时间等于数据量除以每单位数据所需的存取时间。判断采用哪种访存冲突处理方式这是最重要的得分点。停止访存方式下CPU在DMA传送期间无法访存周期挪用方式下只有DMA实际占用总线的那些存取周期会影响到CPU。最后把计算结果代入题目问题求总耗时就用设备准备时间加DMA传送时间求CPU受影响比例就用DMA占用周期数除以总周期数。最后一步尤其容易出错很多人把磁盘寻道时间也当成CPU被占用的时间这是不对的。寻道期间DMA根本没在工作CPU完全可以执行程序只有真正的数据搬运阶段才存在总线竞争问题。7. 从408考场到STM32开发板DMA理论的真实落地7.1 寄存器/结构体对应关系如果你用过STM32并且配置过DMA会发现嵌入式里的DMA外设和计算机组成原理课本上的DMAC几乎一一对应。这一节算是对理论知识的“落地验证”也顺带帮那些既考研又做开发的同学把两套知识打通。STM32的DMA控制器里几个核心配置项和教材上的部件对照起来看非常清晰外设地址寄存器CPAR和存储器地址寄存器CMAR对应教材里的设备地址和主存地址寄存器。传输数量寄存器CNDTR对应教材里的字计数器每传一个数据单元减1减到0触发传输完成事件。数据宽度设置PSIZE/MSIZE对应教材里数据缓冲寄存器的宽度匹配问题。外设8位、存储器32位时DMA会按最小粒度逐次搬运。增量模式PINC/MINC对应教材里主存地址寄存器每传一次自动加1的行为。如果你接收串口数据到一个数组存储器地址增量必须打开否则每次写入同一个地址。循环模式CIRC相当于让DMA持续传送多个数据块不需要CPU反复重新启动对应“批量连续传送”的场景。传输完成中断TC和半传输中断HT对应教材里DMA中断机构的后处理通知机制。我之前做一个串口接收项目的时候用“UART空闲中断 DMA接收”的方式处理不定长数据包思路就是DMA负责把串口数据寄存器里的字节自动搬到内存缓冲区CPU完全不用管每个字节的接收等到串口空闲了一帧数据结束触发空闲中断CPU再从缓冲区里把完整的一帧数据取走处理。这个方案的技术内核就是DMA方式中“预处理—硬件自动搬运—中断后处理”的完整流程只是嵌入式里给它换了个名字叫“DMA空闲中断”。7.2 工程上踩过的坑配置STM32的DMA时最容易踩的坑有三个我印象特别深。第一个坑是CNDTR不能在DMA使能状态下修改。ST官方手册明确要求要修改传输数量必须先关闭DMA传输使能位把CNDTR写好后重新使能否则写入无效。这和教材里“字计数器在传送过程中由硬件自动修改CPU不应干预”的逻辑是一脉相承的。你要是没关DMA就试图重设CNDTR跑起来就会发现数据数量根本不是你设的值。第二个坑是缓冲区大小和传输数量要精确匹配。DMA本身没有“边界感知能力”它只按CNDTR设定的数量搬数据搬完就触发完成事件。如果你给DMA设的传输数量大于缓冲区剩余空间它就会把数据写穿破坏相邻内存。这和DMA方式“以块为单位传送一旦开始就要传完整块”的特性直接相关。第三个坑是中断优先级。DMA传输完成中断要尽量配置成比普通外设中断更高的优先级尤其在多路DMA同时工作时要按数据实时性排序。否则高频率的数据流DMA传输完成中断被低优先级拖住数据处理不及时缓冲区就可能被覆盖。这个道理和408里“DMA请求优先级高于普通中断请求”完全一致课本上的优先级原则在真实芯片中是实打实存在的。把这些落地经验串起来看408考DMA不是单纯的“死记硬背考点”它背后是一个极其经典且至今仍在广泛使用的硬件机制。学的时候觉得抽象进了嵌入式、操作系统这些领域回头再看当初那些“为什么要有地址寄存器”“为什么字计数器减到零要发中断”的问题答案全在实际硬件上写着。我个人复习计组时最大的体会是DMA这个知识点不要把它当成一个孤立的题目考点去背而是当成一条线索从“CPU太忙”这个问题出发顺着查询→中断→DMA这条演进路线捋下来每一步都是为了解决上一步的某个痛点。捋完之后再去答题选择题的陷阱一眼就能看穿大题的参数怎么换都逃不出“预处理—硬件搬运—后处理”这个框架。408也好以后的工程实践也好这套思维方式比单纯记住结论有用得多。