开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情 这也是第26篇文章
Q:为什么要管理内存?
A:因为资源有限,只能省着用,只要还达不到“私有、无限容量、速度无限快、永久”的条件,无论存储器多大,若不加以管理,程序都能将它填满。
Q:同一块存储区域可以同时运行多个程序吗?
A:早在学计导时就知道,若程序2覆盖了程序1的代码,这两个程序都会立即崩溃。
那么如何解决?
无存储器抽象时的方案:
- 多线程
- 缺点:多个线程对同一内存映像可见,但人们更希望同一时间运行没有关联的程序。
- 交换技术:
- 特殊硬件支持
注意:不要使用绝对物理地址。可通过静态重定位技术解决这个问题
存储器抽象————地址空间
是什么
一个进程用于寻址内存的一套地址集合。 每个进程都有一个自己的、独立于其他进程的地址空间。
如何保证地址空间不重复
(现已不使用)动态重定位
将每个进程的地址空间映射到内存的不同部分。 (如基址寄存器和界限寄存器)
内存管理
空闲内存管理
位图
一个位对应于一个分配单元的状态(0/1)
链表内存管理
算法:
- FF(first-fit):沿着链表找,直到找到足够大的空闲区
- NF(next-fit):从上次找到合适时的位置开始找
- BF(best-fit):满足条件中的最小的
- WF(worse-fit):满足条件中的最大的
- QF(quick-fit):为常用大小的空闲区维护单独的链表
解决内存超载问题——交换技术、虚拟内存
交换技术
A的地址改变是通过前述的硬件支持的重定位方案
几点补充:
- 有一种叫“内存紧缩”的技术
- 解决进程长度动态增长的一种可能方案:
(原因? 进程 的data segment增长,而这又是因为程序语言层面允许从堆中动态分配内存)
A:当换入或移动进程时分配额外内存给它;换出时只换实际内容
有关虚拟内存的内容,请待下回分解~