SmallMemorySoftwarePatternsForSystemWithLimitedMemory 2018 程序啪啪啪
SmallMemorySoftwarePatternsForSystemWithLimitedMemory
tags: System Memory GC
SmallArchitecture(小容量体系结构)
- Problem
- Questions
- 如何管理整个系统使用的内存
- Environment
- 肉眼数据如果受到限制,会束缚整个系统
- 组件的内存需求量会动态改变
- 各个组件可由开发团队完成
- 系统由多个组件构成
- Way
- 让每个组件管理自己的内存运用状态
- Idea
- 明确组件内存规格、作为一个标准
- Consequences(結果)
- 可以降低程序的内存需求
- 提高程序的内存用量可预测性
- Maybe 使程序的伸缩性更好、可用性更强
- But
- 需要程序员更高的素养
- Implementation(实现)
- Methods
- 理念
- 一致性
- 责任
- 将系统分解为独立的组件,开发时可以一块一块的设计、构造系统;借助统一的内存策略,开发时可以确保发展出来的各部分能够高效率的协同工作
- 理念
- 关键
- 可剪裁性(Tailorability)
- Different context, Different memory using
- 让客户负责管理组件的内存分配
- Programming
- 利用Callbacks管理内存
- 利用统一接口进行内存使用的封装(Memory Strategy)
- Programming
- 可剪裁性(Tailorability)
- Methods
- Questions
- Specialzation Patterns (特化模式)
- Memory Limit(内存限额)
- Question
- 如何在多个相互竞争的组件间分配内存
- Environemnt
- 系统中包含多个组件,每个组件有各自的内存需求
- 组件的内存需求随着系统的运行而动态变化
- 一个组件使用内存过多会影响到其他组件
- 你可以为每个任务设置一个合理的内存上限
- Way
- 为每个组件设置限额,对于超出限额的分配請求,应予以拒绝
- Steps
- 记录当前每个组件分配的内存数量
- 确保组件分配的内存数量不超过分配限额
- 理想状态下应当通过“试验、检视内存用量”的方式为每个组件设定限额
- Implementation
- 在内存管理操作前后注入
- 各组件管理各自的heap
- 分享进程
- Question
- Small Interfaces
- Question
- 如何减少组件接口带来的内存额外开销
- Environment
- 各个组件管理各自的内存
- 组件间通过显式的接口相互通信
- 组件间通信需要额外内存
- 可复用接口需要泛化接口
- Way
- 设计出让客户可以控制数据传输的接口
- Steps
- 将接口间的数据传输量最小化
- 决定数据传输的质量程度
- Implementation
- 传值vs传地址
- 注意组件间交換内存
- 策略
- 出借
- 客户调用“提供服务的组件”期間,由客户出借一些内存给服务提供者
- 借入
- 客户获得服务供应者拥有对象的访问权
- 窃取
- 客户接收服务供应者分配的对象,并负责归还该对象
- 出借
- 策略
- 步进式接口
- 客户进行多次调用
- 通过iterator传送数据
- 通过writable iterator返回数据
- 通过return iterator返回数据
- Question
- Partial Failure(局部Crash,降格求全)
- Question
- 如何处理不可预见的内存需求
- Environment
- No enough memory for running system
- 宁可在非关键任务中fail,也不要简单放弃关键任务
- 持续不断的运行
- 比始终完善地运行重要
- 比系统crash重要
- Way
- 请确保内存用完,也要让系统处于安全状态
- Implementation
- 侦测内存耗尽
- 到达安全状态
- 释放资源
- 降级模式
- 未雨绸缪
- Question
- Captain Oates(牺牲小我)
- Question
- 如何满足对内存的最重要需求
- Environment
- 许多系统都有运行在后台的组件
- 许多系统为了提高性能,会以高速缓冲的方式存放数据
- 与后台活动相比,用户更关心自己的工作
- Way
- 应该牺牲非绝对必要的组件使用的内存,以免抗拒重要的任务
- Implementation
- 侦测内存耗尽
- 处理内存不足
- 良民
- Question
- Read-Only Memory
- Question
- 如何处置只读的代码和数据
- Environment
- 系统提供只读内存与可写内存
- 只读内存成本更低
- 程序通常并不修改executable code
- 程序不修改资源文件、查找表、以及其他预初始化的数据
- Way
- 最好将只读的代码与数据存储在只读内存
- Implementation
- 存储代码
- 在代码中包含数据
- 将静态数据结构放入ROM
- DES相关数据
- sin,cos
- 只读文件系统
- 版本控制
- Question
- Hooks(挂钩)
- Question
- 如何更改只读存储器内在信息
- Environment
- 正在使用ROM
- 无法修改ROM
- ROM中的数据需要维护与升级
- 进行较小的修改
- Way
- 在RAM中,通过hooks访问只读信息,通过更改hook,以产生信息更改的假象
- Implementation
- 从ROM中,调用RAM
- Extand
- ROM objects
- ROM Datas
- Question
- Memory Limit(内存限额)
Secondary Storage(辅助存储设备)
- Problem
- Question
- 一旦你用光主内存,接下来如何处理
- Environment
- primary storage无法满足内存需求
- 无法降低系统的内存需求
- 可以将辅助存储设备添加到“running system”设备上
- Way
- 把辅助存储设备当作运行时间的额外内存
- Implementation
- 高效使用辅助内存
- 设计时需要分割什么?
- Execute code
- data
- configuration information
- Or other mix-parts
- 哪个层次进行分割
- Coder
- System
- User
- Who do loading and unloading
- Coder
- System
- User
- When do loading/unloading
- 设计时需要分割什么?
- 高效使用辅助内存
- Question
- Specialzation Patterns
- Application Switching(任务转换)
- Question
- 面对提供许多不同功能的系统,如何降低其内存需求
- Environment
- 系统太庞大,主内存无法容纳全部代码与数据
- 用户经常一次只需要运行一项任务
- 单一任务只需要自己的代码和数据就能运行,其他代码和数据可以存放在辅助存储设备内
- 一次只编写一组相关任务更容易
- Way
- 把系统分割成独立模块,每次只运行一个
- Implementation
- 关键问题
- 进程间的通信
- Rules
- 进程间的控制流必须简单
- 进程间尽量不传递短暂性数据
- 分割必须对用户有意义
- Methods
- 程序链(Program chaining)
- 程序间转换方便
- Master Program(主控程序)
- 进程间通信(InterProcess Communication, IPC)
- 管理数据
- 程序链(Program chaining)
- 关键问题
- Question
- Data Files(纯数据文件)
- Question
- 主内存无法容纳全部数据
- Way
- 一次只处理一部分数据
- Implementation
- 主要操作
- 简单循序输入(依次读取各章)
- 简单循序输出(依次写入文件)
- 随机访问(读取交叉参考文件)
- 循序输出至数个文件(利用临时文件)
- Methods
- 增量式处理
- 子文件处理
- 随机访问
- 利用索引
- 主要操作
- Question
- Resource Files(纯资源文件)
- Question
- 如何管理为数众多的配置数据
- Environment
- 很多程序数据是一些只读配置信息,程序不可更改
- 配置数据通常比代码变化频繁
- 数据可能被程序的不同phases取用
- 任何时候你都只需要少数数据
- 文件系统支持随机访问
- Way
- 在辅助存储设备内保存配置数据,必要时才load/unload其中一项
- Implementation
- 必须让程序员得以轻松运用
- 运用资源文件,节约内存
- 字体文件
- 实现一个资源文件系统
- Question
- Packages(封包)
- Question
- 如何管理有许多可选组件的大型程序
- Environment
- 内存有限
- 功能不会全部用到
- 不同功能组合使用
- 组件相互有分隔,发展更顺利
- Way
- 把程序分解为多个packages,只在系统需要具体的package时才装载
- Implementation
- Need
- 需要一个能够装载组件的系统
- 系统可以分割成模块,分别运行
- 可动态装载
- Methods
- 把进程视为packages
- 利用动态链接库
- 功能代码分块
- Need
- Question
- Paging(分页)
- Question
- 如何制造出内存数量无限的幻象
- Way
- 分页内存
- Implementation
- 在内存操作处拦截
- MMU
- Interpreter
- Process Swap
- Data Manager
- 页面替换
- 工作集大小
- 分页控制
- 在内存操作处拦截
- Question
- Application Switching(任务转换)
Compression(压缩)
- Implementation
- 机械冗余
- 语义冗余
- 有损压缩
- Method
- 表格压缩
- Simple Coding
- Huffman coding
- Other coding
- 差分编码
- 根据相临两个数据间的差异来表现序列
- Delta coding
- Run-length coding
- 根据相临两个数据间的差异来表现序列
- 自省式压缩
- MTF
- LZ
- zlib
- 表格压缩
SmallDataStructures小型数据结构
- PackedData
- Union
- Bit Packing
- Sharing
- Copy OnWrite
- EmbeddedPointers
- Mix
MemoryAllocation
- Fixed Allocation
- StaticAlloc
- PreAlloc
- Variable Allocation
- DynamicAlloc
- Heap
- Memory Discard
- Stack Alloc
- Pooled Alloc
- Compaction
- Reference Counting
- GC
文章目录 |
创建@
2013-02-23
最后修改@
2014-05-08