深入理解计算机系统
深入理解计算机系统
缓存
数据对象来自其他存储结构。
命中与不命中
就是缓存的数据中没有所需要的
虚拟地址
虚拟地址空间大小为2的N次方,N为位数。
其由cpu发出,经mmu(memory management unit)翻译,然后到主存中取数据。
一个对象有一个物理地址和一个虚拟地址。
分割为虚拟页。
页表在物理地址中,页表中有页表条目pte,其含有效位。
cpu引用换存在主存中的虚拟页时,会查看页表中的有效位,进而判断是否缺页。
文件只读的作用
保护文件不被修改。
堆栈
堆栈空间会有预留部分。
ebp寄存器和esp寄存器划分区域。
返回值一般在eax和edx中。编写程序尽量不返回大于4字节的数据。
栈上的数据在函数返回时会被释放掉。
堆的空闲链表分配法。
虚拟存储器理解
为了使分布在磁盘上不同地址的数据,使用同一块地址空间,即主存。
使用虚拟存储器,进程不会与物理内存接触。
每一页的首地址为页表条目?
页表,PTE,物理存储器位于主存中。
虚拟页在磁盘中。
好处:
- 共享问题,多个进程可映射同一个地址。
- PTE可标记SUP,READ,WRITE位。违反此类常见报错“segment fault”
PTE中含有物理页的起始位置,物理页中缓存有虚拟页。因此,虚拟页的位置就是物理页的起始位置+虚拟页面的偏移位置PPO。
物理页一般大于虚拟页,毕竟要缓存虚拟页。
虚拟页偏移量VPO等于物理页偏移量PPO。
物理内存(这里指磁盘上的内存)+交换内存(这里指主存)=虚拟内存
但是虚拟存储器在磁盘上,物理存储器在主存上。
- 虚拟内存就是磁盘上的存储空间被当作内存使用,磁盘不属于内存,所以是虚拟内存。
- 实际内存—-物理内存,虚拟内存—-磁盘上的空间。
- 置换(swap),把内存上的内容和磁盘上的虚拟内存中的内容进行部分交换。
- 动态链接库—-实现文件共享。
- 32位系统对应4G进程,64位系统对应8G进程。
虚拟内存的实现
由物理内存和磁盘上的交换空间组成虚拟内存。
只要Linux系统在运行,交换就一直在进行。
虚拟内存再理解
虚拟页缓存在物理页中,若不命中,则发生页牺牲,替换进需要的虚拟页,命中发生时,cpu发出虚拟地址,经mmu地址翻译后为物理地址,这个物理地址是物理页的地址。
每一个进程都会被分配大小一定的虚拟内存,但实际消耗的大小不同。
虚拟页一般很大,4KB~2MB。
页表存储地址翻译的信息,页表是页表条目的数组,虚拟空间中的每个页都有一个页表条目。
从这里可以看出,cpu要找一个虚拟页,就得查看页表中的页表条目。PTE表明了是哪个虚拟页,缓存在哪个物理页及物理页的位置。
PTE中的地址字段有三种情况:
- 物理页的起始地址(有效位被设置)
- 空白(有效位没被设置,虚拟页未分配)
- 虚拟页的起始位置(有效位没被设置)
总的说,程序都会从磁盘输送到主存中。
每个进程有单独的页表。
虚拟地址的组成
虚拟地址偏移量vpo和虚拟页表号vpn。页面大小决定偏移量大小。
物理地址同样包含ppo和ppn。
使用虚拟地址的好处
简化内存管理,提供自然的保护内存的方法。
多级页表
用于压缩页表,一级页表是最内层的页表
进程
磁盘上的程序,当被系统执行时,被加载进内存,然后放入寄存器,最后让cpu执行,就变成了进程
progress。也就是运行中的程序。
- 进程运行时,会得到4G的虚拟内存,最高的一个G为内核内存,剩下三个G为用户内存。
映射
把一个地址连接到另一个地址。如,内存单元A的地址为X,把它映射到地址Y,这样访问Y时,就可以访问到A了。