<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[静听冷雨声]]></title>
        <description><![CDATA[谈谈我的人生，我的理想]]></description>
        <link>https://rain.notegardens.cn</link>
        <image>
            <url>https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/7H6-zog0O.jpeg</url>
            <title>静听冷雨声</title>
            <link>https://rain.notegardens.cn</link>
        </image>
        <generator>RSS for Node</generator>
        <lastBuildDate>Thu, 14 May 2026 13:33:09 GMT</lastBuildDate>
        <atom:link href="https://rain.notegardens.cn/atom" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[信号与系统笔记]]></title>
            <description><![CDATA[<p><a href="https://github.com/MichaelYeung2004/signals-and-systems">https://github.com/MichaelYeung2004/signals-and-systems</a></p>
]]></description>
            <link>https://rain.notegardens.cn/signals-and-systems</link>
            <guid isPermaLink="false">c4c4f878-ae31-4d54-b23c-540eb30430f6</guid>
            <pubDate>Sun, 04 May 2025 15:24:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[存储系统]]></title>
            <description><![CDATA[<h2><strong>存储系统基本概念</strong></h2>
<h3><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/U4SUF9Ryx.png" alt="">存储器的层次结构</h3>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/WIGn4R32d.png" alt="">比如，运行手机app时，必须先将app的数据从辅存读入到主存。</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/nBsBKdUSZ.png" alt="">注：有的教材把安装在电脑内部的磁盘称为“辅存”，把U盘、光盘等称为“外存”。也有的教材把磁盘、U盘、光盘等统称为“辅存”或“外存</p>
<blockquote>
<p><strong>主存—辅存</strong>：实现虚拟存储系统，解决了主存容量不够的问题<br>
<strong>Cache—主存</strong>：解决了主存与CPU速度不匹配的问题</p>
</blockquote>
<h3>存储器的分类</h3>
<ul>
<li>
<p>按层次分类<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/L5_Jkfsxj.png" alt=""></p>
</li>
<li>
<p>按存储介质分类：<br>
1. <strong>半导体存储器</strong>（主存、Cache）<br>
2. <strong>磁表面存储器</strong> 磁盘、磁带<br>
3. <strong>光存储器</strong></p>
</li>
<li>
<p>按存取方式分类<br>
<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/OpXlvjXsm.png" alt=""></p>
</li>
<li>
<p>按信息的可更改性分类<br>
1. <strong>读写存储器</strong>（Read/Write Memory）——即可读、也可写（如：磁盘、内存、Cache）<br>
2. <strong>只读存储器</strong>（Read Only Memory）——只能读，不能写（如：实体音乐专辑通常采用 CD-ROM，实体电影采用蓝光光碟，BIOS通常写在ROM中）</p>
</li>
<li>
<p>按信息的可保存性分类<br>
1. 断电后，存储信息消失的存储器——易失性存储器（主存、Cache）<br>
2. 断电后，存储信息依然保持的存储器——非易失性存储器（磁盘、光盘）<br>
3. 信息读出后，原存储信息被破坏——破坏性读出（如DRAM芯片，读出数据后要进行重写）<br>
4. 信息读出后，原存储信息不被破坏——非破坏性读出（如SRAM芯片、磁盘、光盘）</p>
</li>
</ul>
<h3>存储器的性能指标</h3>
<p>1. <strong>存储容量</strong>：存储字数×字长（如1M×8位）。</p>
<blockquote>
<p>MDR位数反映存储字长</p>
</blockquote>
<p>2. <strong>单位成本</strong>：每位价格=总成本/总容量。</p>
<p>3. 存储速度：<strong>数据传输率</strong>=数据的宽度/存储周期。</p>
<blockquote>
<p>数据的宽度即存储字长</p>
</blockquote>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/WkB7GH7-t.png" alt="">① <strong>存取时间（Ta）</strong>：存取时间是指从启动一次存储器操作到完成该操作所经历的时间，分为读出时间和写入时间。</p>
<p>② <strong>存取周期（Tm）</strong>：存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间，即连续两次独立地访问存储器操作（读或写操作）之间所需的最小时间间隔。</p>
<p><strong>主存带宽（Bm）</strong>：主存带宽又称数据传输率，表示每秒从主存进出信息的最大数量，单位为字/秒、字节/秒（B/s）或位/秒（b/s）。</p>
<h2><strong>主存储器的基本组成</strong></h2>
<p>MOS管可理解为一种电控开关，输入电压达到某个阈值时，MOS管就可以接通</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/PXUmM527-.png" alt="">充电：写入数据；放电：读出数据</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/IHaDHdfA6.png" alt="">封装后的效果：</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/c0hS-X63I.png" alt=""><strong>片选线</strong>作用：选择内存条中特定的存储芯片</p>
<h2><strong>SRAM和DRAM</strong></h2>
<h3>SRAM VS DRAM</h3>
<p>Dynamic Random Access Memory，即动态RAM<br>
Static Random Access Memory，即静态RAM</p>
<p>DRAM用于主存，SRAM用于Cache</p>
<p>DRAM芯片：使用<strong>栅极电容</strong>存储信息<br>
SRAM芯片：使用<strong>双稳态触发器</strong>存储信息</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/AGNBeL5ix.png" alt=""><strong>栅极电容</strong>每个存储元制造成本更低，集成度高，功耗低，每隔2ms需要刷新一次<br>
<strong>双稳态触发器</strong>每个存储元制造成本更高，集成度低，功耗大，只要不断电，状态就不会改变</p>
<h3><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/di3WE6-ph.png" alt="">DRAM的刷新</h3>
<p>1. 多久需要刷新一次？ 刷新周期：一般为2ms<br>
2. 每次刷新多少存储单元？以行为单位，每次刷新一行存储单元</p>
<p>存储单元排列成2^{n/2} × 2^{n/2}的矩阵（为了减少选通线）</p>
<p>3. 如何刷新？有硬件支持，读出一行的信息后重新写入，占用1个读/写周期<br>
4. 在什么时刻刷新？假设DRAM内部结构排列成128×128的形式，读/写周期0.5us，2ms共 2ms/0.5us = 4000 个周期</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/ObF51yjpb.png" alt="">行、列地址分两次送，可使地址线更少，芯片引脚更少</p>
<h2><strong>只读存储器ROM</strong></h2>
<p>RAM芯片——易失性，断电后数据消失<br>
ROM芯片——非易失性，断电后数据不会丢失</p>
<p><strong>MROM</strong>（Mask Read-Only Memory）——掩模式只读存储器<br>
厂家按照客户需求，在芯片生产过程中直接写入信息，之后任何人不可重写（只能读出）<br>
可靠性高、灵活性差、生产周期长、只适合批量定制</p>
<p><strong>PROM</strong>（Programmable Read-Only Memory）——可编程只读存储器<br>
用户可用专门的PROM写入器写入信息，写一次之后就不可更改</p>
<p><strong>EPROM</strong>（Erasable Programmable Read-Only Memory）——可擦除可编程只读存储器<br>
允许用户写入信息，之后用某种方法擦除数据，可进行多次重写<br>
<strong>UVEPROM</strong>（ultraviolet rays）——用紫外线照射8~20分钟，擦除所有信息<br>
<strong>EEPROM</strong>（也常记为E2PROM，第一个E是Electrically）——可用“电擦除”的方式，擦除特定的字</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/fghipwwod.png" alt="">主板上的<strong>BIOS芯片</strong>（ROM），存储了“自举装入程序”，负责引导装入操作系统（开机）</p>
<p>注：我们常说“内存条”就是“主存”，但事实上，主板上的ROM芯片也是“主存”的一部分。逻辑上，主存由<br>
RAM+ROM组成，且二者常统一编址</p>
<h2><strong>双口RAM&amp;多模块存储器</strong></h2>
<h3>双端口RAM</h3>
<p>作用：优化多核CPU访问一根内存条的速度</p>
<p>两个端口对同一主存操作有以下4种情况：<br>
1. 两个端口同时对不同的地址单元存取数据。<br>
2. 两个端口同时对同一地址单元读出数据。<br>
3. 两个端口同时对同一地址单元写入数据。<br>
4. 两个端口同时对同一地址单元，一个写入数据，另一个读出数据。</p>
<h3>多体并行存储器</h3>
<ol>
<li>
<p>高位交叉编址</p>
</li>
<li>
<p>低位交叉编址</p>
</li>
</ol>
<p><strong>低位交叉编址效率更高</strong><br>
例：每个存储体存取周期为T，存取时间为r，假设 T=4r</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/IcsMLM0Md.png" alt="">采用“流水线”的方式并行存取（宏观上并行，微观上串行）<br>
宏观上，一个存储周期内，m体交叉存储器可以提供的数据量为单个模块的m倍。</p>
<p>存取周期为T，存取时间为r，为了使流水线不间断，应该使模块数&gt;=T/r<br>
存取周期为T，总线传输周期为r，为了使流水线不间断，应该使模块数&gt;=T/r</p>
<h2><strong>主存储器与CPU的连接</strong></h2>
<blockquote>
<p>现在的计算机MAR、MDR通常集成在CPU内部。存储芯片内只需一个普通的寄存器（暂存输入、输出数据）</p>
</blockquote>
<h3><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/Zz38fObT8.png" alt="">位扩展</h3>
<h3><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/IEQORjqiV.png" alt="">字扩展</h3>
<ol>
<li>
<p>线选法：<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/sc49CN0iU.png" alt=""></p>
</li>
<li>
<p>译码片选法：<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/KNnwCz_VO.png" alt=""></p>
</li>
</ol>
<p>综上，我们对比<strong>线选法</strong>和<strong>译码片选法</strong><br>
<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/WVZ-N_f7h.png" alt="">字位同时扩展<br>
<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/ypoT8PawU.png" alt=""></p>
<h2><strong>外部存储器</strong></h2>
<h3>磁盘存储器</h3>
<ol>
<li>
<p>磁盘设备的组成：<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/u1p4E40XP.png" alt=""></p>
</li>
<li>
<p>磁盘的性能指标：<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/LR-tRI9me.png" alt=""></p>
</li>
<li>
<p>磁盘地址：<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/aiC5ojk29.png" alt=""></p>
</li>
<li>
<p>硬盘的工作过程：<br>
硬盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字，硬盘工作时，第一步是取控制字，第二步是执行控制字。<br>
硬盘属于机械式部件，其读写操作是串行的，不可能在同一时刻既读又写，也不可能在同一时刻读两组数据或写两组数据。<br>
必须加入并串变换电路</p>
</li>
</ol>
<h3>磁盘阵列</h3>
<blockquote>
<p>RAID（ Redundant Array of Inexpensive Disks，廉价冗余磁盘阵列）是将多个独立的物理磁盘组成一个独<br>
立的逻辑盘，数据在多个物理盘上分割交叉存储、并行访问，具有更好的存储性能、可靠性和安全性。</p>
</blockquote>
<p>RAID0没有容错能力，RAID1容量减少一半。</p>
<h3>固态硬盘SSD</h3>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/J8Zs-2Izl.png" alt=""></p>
<h2><strong>高速缓冲存储器</strong></h2>
<h3><strong>Cache</strong>工作原理</h3>
<blockquote>
<p>实际上，Cache 被集成在CPU内部<br>
Cache用SRAM实现，速度快，成本高</p>
</blockquote>
<h3>局部性原理</h3>
<ul>
<li>
<p><strong>空间局部性</strong>：在最近的未来要用到的信息（指令和数据），很可能与现在正在使用的信息在存储空间上是临近的</p>
</li>
<li>
<p><strong>时间局部性</strong>：在最近的未来要用到的信息，很可能是现在正在使用的信息</p>
</li>
</ul>
<p>根据局部性原理，可以把CPU目前访问的地址“周围”的部分数据放到Cache中</p>
<h3>性能分析</h3>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/WsKOuLdjc.png" alt=""></p>
<blockquote>
<p>例：设Cache的速度是主存的5倍，且Cache的命中率为95%，则采用Cache后，<br>
存储器性能提高多少（设Cache和主存同时被访问，若Cache命中则中断访问主存）？</p>
</blockquote>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/q_BVD2ZO5.png" alt="">Q：基于局部性原理，不难想到，可以把CPU目前访问的地址“周围”的部分数据放到Cache中。如何界定“周围”？</p>
<p>A：将主存的 存储空间“分块”，如：每 1KB 为 一块。主存与Cache之间以“块”为单位进行数据交换</p>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/B-lDIhM8N.png" alt=""></p>
<ul>
<li>
<p>如何区分 Cache 与 主存 的数据块对应关系？ ——Cache和主存的映射方式</p>
</li>
<li>
<p>Cache 很小，主存很大。如果Cache满了怎么办？ ——替换算法</p>
</li>
<li>
<p>CPU修改了Cache中的数据副本，如何确保主存中数据母本的一致性？ ——Cache写策略</p>
</li>
</ul>
<h3>Cache-主存映射方式</h3>
<ol>
<li>
<p><img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/OyF2DBmeb.png" alt="">全相联映射（随意放）<br>
<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/OwajmWnju.png" alt=""></p>
</li>
<li>
<p>直接映射（只能放固定位置）<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/fIlfJoUTh.png" alt=""></p>
</li>
<li>
<p>组相联映射（可放到特定分组）<img src="https://static.gridea.dev/78475350-b48b-4f74-a545-b9049b69e67a/0OFyuOVw-.png" alt=""></p>
</li>
</ol>
<h3>Cache替换算法</h3>
<blockquote>
<p>全相联映射：Cache完全满了才需要替换需要在全局选择替换哪一块<br>
直接映射：如果对应位置非空，则毫无选择地直接替换<br>
组相联映射：分组内满了才需要替换需要在分组内选择替换哪一块</p>
</blockquote>
<ol>
<li>
<p><strong>随机算法（RAND）</strong>：若Cache已满，则随机选择一块替换。<br>
实现简单，但完全没考虑局部性原理，命中率低，实际效果很不稳定</p>
</li>
<li>
<p><strong>先进先出算法（FIFO）</strong>:若Cache已满，则替换最先被调入Cache 的块<br>
实现简单，最开始按#0#1#2#3放入Cache，之后轮流替换 #0#1#2#3<br>
FIFO依然没考虑局部性原理，最先被调入Cache的块也有可能是被频繁访<br>
<strong>抖动现象</strong>：频繁的换入换出现象（刚被替换的块很快又被调入）</p>
</li>
<li>
<p><strong>近期最少使用算法（LRU）</strong>：为每一个Cache块设置一个“计数器”，用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的<br>
<strong>计数器</strong>设置：<br>
①命中时，所命中的行的计数器清零，<strong>比其低的计数器加1，其余不变</strong>；（Cache块的总数=2^n，则计数器只需n位。）<br>
②未命中且还有空闲行时，新装入的行的计数器置0，其余非空闲行全加1；<br>
③未命中且无空闲行时，计数值最大的行的信息块被淘汰，新装行的块的计数器置0，其余全加1。<br>
基于“局部性原理”，近期被访问过的主存块，在不久的将来也很有可能被再次访问，因<br>
此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀，Cache命中率高。<br>
若被频繁访问的主存块数量 &gt; Cache行的数量，则有可能发生“抖动”，如：{1,2,3,4,5,1,2,3,4,5,1,2...}</p>
</li>
<li>
<p><strong>最不经常使用算法（LFU）</strong>:为每一个Cache块设置一个“计数器”，用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的<br>
曾经被经常访问的主存块在未来不一定会用到（如：微信视频聊天相关的块），,并没有很好地遵循局部性原理，因此实际运行效果不如 LRU</p>
</li>
</ol>
<p><strong>近期最少使用算法（LRU）最优秀</strong></p>
<h3>Cache写策略</h3>
<ol>
<li>
<p>写命中<br>
<strong>写回法</strong>(write-back) —— 当CPU对Cache写命中时，只修改Cache的内容，而不立即写入主存，只有当此块被换出时才写回主存。(减少了访存次数，但存在数据不一致的隐患)<br>
<strong>全写法</strong>(写直通法，write-through) —— 当CPU对Cache写命中时，必须把数据同时写入Cache和主存，一般使用写缓冲(write buffer)。（访存次数增加，速度变慢，但更能保证数据一致性）<br>
注：使用写缓冲，CPU写的速度很快，若写操作不频繁，则效果很好。若写操作很频繁，可能会因为写缓冲饱和而发生阻塞</p>
</li>
<li>
<p>写不命中<br>
<strong>写分配法(write-allocate)</strong>——当CPU对Cache写不命中时，把主存中的块调入Cache，在Cache中修改。通常搭配写回法使用。<br>
<strong>非写分配法(not-write-allocate)</strong>——当CPU对Cache写不命中时只写入主存，不调入Cache。搭配全写法使用。</p>
</li>
</ol>
]]></description>
            <link>https://rain.notegardens.cn/storage-system</link>
            <guid isPermaLink="false">0588e6a6-b152-4bc2-91c7-a552d77abd4f</guid>
            <pubDate>Mon, 23 Dec 2024 21:24:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[廿载韶华正芬芳,收拾行装再启航]]></title>
            <description><![CDATA[<p>二十岁生日了,晨曦微露，睡眼惺忪地起来，就看到朋友给我发来的生日祝福。仔细想一想，哦，原来我已经二十岁了啊。00后，这些曾经祖国的花朵们，已然成为了社会的中流砥柱。二十年，回首一瞬间，其实我并没有过生日的习惯，生日蛋糕自然免了，但朋友们的祝福，却让我感受到了满满的温暖。</p>
<p>适才翻阅博客，“2024已过去95.81%”的字样映入眼帘，正好借着这个机会，做一个简短的年终总结岂不美哉。</p>
<p>这一年，有欢笑，有泪水，有苦尽甘来的喜悦，也有功亏一篑的不甘。但如果用一个词来概括，我想那一定是“忙碌”。天下熙熙皆为利来，天下攘攘皆为利往。人生有安逸摆烂的权利，也有奋力打拼的选项。这个学期就有八门专业课需要学习，大量的实验报告、浩如烟海的定理公式...不过倒也是无怨无悔。毕竟，选择了远方，便只顾风雨兼程。</p>
<p>有人常说，00后是迷茫的一代。有些许道理，我们拥有长辈们不曾享受的美好童年，我们和国家一起成长，看到大楼拔地而起，高架纵横交错，沙尘暴治理卓有成效。毫无疑问，二十一世纪前二十年是中国经济腾飞、科技发展的二十年，我们享受到了时代的红利，不用担心吃不饱，穿不暖。但随之而来的，是愈发激烈的学习压力、竞争压力，儒家思想的耳濡目染下，是整个社会“万般皆下品，惟有读书高”的价值观。Fight,fight,fight,多考一分,超过千人,多数人按照规划读研读博,然后呢?</p>
<p>有时我常常思考，人生的意义到底是什么，就像小时候百无聊赖，躺在床上想着各种奇怪问题：时间有没有开始与尽头、可不可以把人分成粒子运输，想着想着就睡着了。曾经以为，人生的意义是追求成功，是在茫茫人海中留下独特的印记。但随着年岁渐长，经历了一些人和事，我渐渐明白，旁人的评价并没有什么意义。桓温有言，既不能流芳百世，亦不足复遗臭万载邪。但实际上，对大多数人来说，在历史上留下一笔已是奢望，如若没有互联网加持，可能几百年后所有的足迹都将被抹去。</p>
<p>根据马斯洛的需求层次理论，人的需求由低到高，分别为生理需求、安全需求、社会需求、尊严需求、自我实现需求。我以为，人生的意义就在于自我实现。但这种自我实现，不必是惊天动地的伟业，也不必是名垂青史的功绩。它可以是在专业领域的精进，是对知识的不懈追求，是在平凡岗位上的尽职尽责。我有爱我的爸爸妈妈，有乐于助人的同学朋友，有微小感人的生活瞬间，尽力争取每一天的学习都有进步，足矣。</p>
<p>凡是过往，皆为序章。站在二十岁的节点上，和过去的自己说声再见，也别忘了对未来的自己说声你好。最后，以一段诗歌结尾吧。</p>
<p>不知几多春秋交替的年华</p>
<p>惟愿携手勇敢绽放于天涯</p>
<p>这一世 天空海阔地厚</p>
<p>那一生 山清月明水秀</p>
<p>撑起时代的肩膀</p>
<p>追寻心中的伊甸</p>
<p>有你我共同排忧解困</p>
<p>谁天黑会抱憾 天光太敏感</p>
<p>跨过绵延的山 潜入蔚蓝的海</p>
<p>无论风偌大 阮心袂振动</p>
<p>待明日晨曦破晓</p>
<p>守护璀璨的未来</p>
]]></description>
            <link>https://rain.notegardens.cn/2024review</link>
            <guid isPermaLink="false">380fbfd3-cb01-4eda-a6b8-6054a69a0fd1</guid>
            <pubDate>Sun, 22 Dec 2024 17:44:00 GMT</pubDate>
        </item>
    </channel>
</rss>