96SEO 2026-02-19 10:04 6
。

内存需要被分成固定大小的页#xff08;Page#xff09;#xff0c;再通过虚拟内存地址#xff08;Virtu…
课程链接深入浅出计算机组成原理_组成原理_计算机基础-极客时间
日常使用的操作系统下程序不能直接访问物理内存。
内存需要被分成固定大小的页Page再通过虚拟内存地址Virtual
Translation才能到达实际存放数据的物理内存位置。
而程序看到的内存地址都是虚拟内存地址。
想要把虚拟内存地址映射到物理内存地址最直观的办法就是来建一张映射表。
这个映射表能够实现虚拟内存里面的页到物理内存里面的页的一
Table。
页表会把一个内存地址分成页号Directory和偏移量Offset两个部分。
做地址转换的页表只需要保留虚拟内存地址的页号和物理内存地址的页号之间的映射关系就可以了。
同一个页里面的内存在物理层面是连续的。
把虚拟内存地址切分成页号和偏移量的组合从页表里查询出虚拟页号对应的物理页号拿物理页号加上前面的偏移量得到物理内存地址。
每一个进程都有属于自己独立的虚拟内存地址空间也就意味着每一个进程都需要这样一个页表。
在整个进程的内存地址空间通常是“两头实、中间空”。
在程序运行的时候内存地址从顶部往下不断分配占用的栈的空间。
而堆的空间内存地址则是从底部往上是不断分配占用的。
所以在一个实际的程序进程里面虚拟内存占用的地址空间通常是两段连续的空间。
而不是完全散落的随机的内存地址。
而多级页表就特别适合这样的内存地址分布。
级的多级页表为例同样一个虚拟内存地址偏移量的部分和简单页表一样不变但是页号部分拆成四段从高到低分成
级页表。
但是因为实际的虚拟内存空间通常是连续的所以可能只需要很少的
事实上多级页表就像一个多叉树的数据结构所以我们常常称它为页表树Page
Tree。
因为虚拟内存地址分布的连续性树的第一层节点的指针很多就是空的也就不需要有对应的子树了。
所谓不需要子树其实就是不需要对应的
级的页表。
找到最终的物理页号就好像通过一个特定的访问路径走到树最底层的叶子节点。
大部分进程所占用的内存是有限的需要的页也自然是很有限的只需要去存那些用到的页之间的映射关系就好了。
多级页表虽然节约了存储空间却带来了时间上的开销所以它其实是一个“以时间换空间”的策略。
原本进行一次地址转换只需要访问一次内存就能找到物理页号算出物理内存地址。
但是用了
机器指令里面的内存地址都是虚拟内存地址。
程序里面的每一个进程都有一个属于自己的虚拟内存地址空间。
可以通过地址转换来获得最终的实际物理地址。
每一个指令和数据都存放在内存里面因此“地址转换”是一个非常高频的动作“地址转换”的性能至关重要。
从虚拟内存地址到物理内存地址的转换通过页表来处理。
为了节约页表的内存存储空间我们会使用多级页表数据结构。
这就需要多次访问内存然而内存访问比
程序使用的指令存放和执行都是顺序进行的。
也就是说对于指令地址的访问存在“空间局部性”和“时间局部性”而需要访问的数据也是一样的。
连续执行的几条指令通常存放在同一个虚拟页里转换的结果自然也就是同一个物理页号。
那就可以用“加个缓存”的办法把之前的内存转换地址缓存下来。
这样就不用反复去访问内存来进行内存地址转换了。
TLB全称是地址变换高速缓冲Translation-Lookaside
Buffer。
这块缓存存放了之前已经进行过地址转换的查询结果。
这样当同样的虚拟地址需要进行地址转换的时候就可以直接在
里的高速缓存一样它也需要用脏标记这样的标记位来实现“写回”缓存管理策略。
就可能会去执行计划之外的指令。
这个指令可能是破坏服务器里面的数据也可能是被人获取到服务器里面的敏感信息。
CPU已经做了各种权限的管控。
正常情况下已经通过虚拟内存地址和物理内存地址的区分隔离了各个进程。
但是难免还是存在一些漏洞。
在对于内存的管理里面计算机有一些最底层的安全保护机制。
这些机制统称为内存保护Memory
内存层面的安全保护核心策略是在可能有漏洞的情况下进行安全预防。
Protection是说对于一个进程使用的内存只把其中指令部分设置成“可执行”的对于其他部分比如数据部分不给予“可执行”的权限。
因为无论是指令还是数据在
CPU如果这些数据解码后也能变成一条合理的指令那也是可执行的。
只能执行指令区域的代码。
对于数据区域的内容即使找到了其他漏洞想要加载成指令来执行也会因为没有权限而被阻挡掉。
Randomization。
原先一个进程的内存布局空间是固定的所以第三方很容易知道指令在哪里程序栈在哪里数据在哪里堆又在哪里。
而地址空间布局随机化这个机制就是让这些区域的位置不再固定在内存空间随机去分配这些进程里不同部分所在的内存空间地址让破坏者猜不出来。
猜不出来呢就没法找到想要修改的内容的位置。
如果只是随便做点修改程序只会
和内存之外还有大量的输入输出设备。
可以说计算机上的每一个接口键盘、鼠标、显示器、硬盘乃至通过
如果各个设备间的通信都是单独进行的每一个设备或者功能电路模块都要和其他
对应的设计思路在软件开发中也是非常常见的譬如事件总线Event
在事件总线这个设计模式里各个模块触发对应的事件并把事件对象发送到总线上。
也就是说每个模块都是一个发布者Publisher。
而各个模块也会把自己注册到总线上去监听总线上的事件并根据事件的对象类型或者是对象内容来决定自己是否要进行特定的处理或者响应。
这样的设计下注册在总线上的各个模块就是松耦合的。
模块互相之间并没有依赖关系。
无论代码的维护还是未来的扩展都会很方便。
和内存以及高速缓存通信的总线这里面通常有两种总线。
这种方式叫作双独立总线Dual
Bus是用来和高速缓存通信的还有一个速度相对较慢的前端总线Front-side
在物理层面其实完全可以把总线看作一组“电线”。
这些电线之间是有分工的通常有三类线路
Bus用来确定到底把数据传输到哪里去是内存的某个位置还是某一个
总线减少了设备之间的耦合也降低了系统设计的复杂度但同时也带来了一个新问题那就是总线不能同时给多个设备提供通信功能。
课程链接深入浅出计算机组成原理_组成原理_计算机基础-极客时间
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback