Comments (4)
首先我们需要明确使用arena设计一个新的sync.pool的使用场景——根据proposal说明,arena的设计初衷是,因为一个服务要在较短时间内开辟一大片内存,用于存储同一种数据,而在服务退出后这些内存不再需要,就应当迅速归还给操作系统。
- 先讨论最简单的情况,用户直接分配一块固定大小的空间,有明确的数据类型、要的数据个数,那么用户可以直接指定要的数据个数,我们通过arena直接分配。
- 用户自己不明确需要多少个数据,我们可以通过Option模式,指定要求动态扩容,但为了性能考量,还是要一次New一块数据而不是一个,而这个blockSize的大小由用户自己确定。
type ArenaFixPool[T any] struct {
blockSize int
arena []*arena
sliceT [][]T
isDynamicAlloc bool
// 可以用Option模式传入,若没用默认把整个空间设置为0
init func(*T)
}
// 清空所有的
func (a *ArenaPool[T]) Free() {
}
// Get 并发读
func (a *ArenaPool[T]) Get(ctx context.Context) (*T, error) {
}
// 回收内存,可以通过指针的加、减法判断
func (a *ArenaPool[T]) Put(t *T) error {
}
func NewAreaPool[T any](blockSize int, options ...Option) *ArenaPool[T] {
}
用户在2的基础上还对内存有更为苛刻的要求,可以再指定要求动态缩容,不过这种需求对于内存什么时候回收就值得讨论一下。如果沿用上述的API,我们只能在某一块数据完全归还,且确定有一段时间再使用的时候释放内存。于是可以设计下面的API,由此引发了更多的问题.......
type ArenaDynamicPool[T any] struct {
blockSize int
arena []*arena
sliceT [][]T
}
type ArenaVal[T any] struct {
val *T
mutex sync.Mutex
}
// 设计方案1
// 这儿要返回的不再是一个指针,不过多了一次拷贝
// 所以使用的场景不应该过多地调用 Val()
func (a *ArenaVal[T any]) Val() T {
}
// 设置val的值
func (a *ArenaVal[T any]) Set(T) {
}
// ArenaDynamicPool定时把指针val置换,使得内存尽可能地紧凑
// 即发现序号小的块中有空闲的,把后面的值移动到这儿
func (a *ArenaVal[T any]) swap(*T) {
}
// 清空所有的
func (a *ArenaDynamicPool[T]) Free() {
}
// Get 并发读
func (a *ArenaDynamicPool[T]) Get(ctx context.Context) (*ArenaVal[T], error) {
}
// 回收内存,可以通过指针的加、减法判断
func (a *ArenaDynamicPool[T]) Put(*ArenaVal[T]) error {
}
func NewArenaDynamicPool[T any](blockSize int, options ...Option) *ArenaDynamicPool[T] {
}
from ekit.
了解了一下arena包提供的API,我觉得有个比较难的点是Arena只能整块被释放,并不能局部释放,这就可能会有一个难题是,对象池里边超过空闲时间的对象释放可能会成为一个问题。我目前能想到的就是以下两种策略:
- 一个对象池共享一个Arena,当Arena分配的空间活跃对象和Arena分配的总对象占比小于一定比例的时候,想办法释放整块Arena,重新分配一块Arena。但是其中有一个问题可能就是,得确保分配出去的对象,用户已经全部归还。
- 一个对象池创建多个Arena,从这多个Arena中分配对象,当需要淘汰内存时,淘汰那些对象已经被全部归还的Arena,但还是涉及到上边的那个问题,如何去判断用户申请的对象已经全数归还。
但是以上2种方式好像都不太好实现。
from ekit.
抱歉,我忽略了这个问题。
容量控制问题
这个我们肯定是要做的,但是前期我们要先看看最简单的 Arena pool 能不能达成我们的目标。
一个对象池创建多个Arena,从这多个Arena中分配对象,当需要淘汰内存时,淘汰那些对象已经被全部归还的Arena,但还是涉及到上边的那个问题,如何去判断用户申请的对象已经全数归还。
但是以上2种方式好像都不太好实现。
根据我对 Arena 对象的了解,貌似我们只能采用一个对象一个 Arena 实例的做法,再多都不可以了。
from ekit.
from ekit.
Related Issues (20)
- Tuple: 新增 Pair 和 Triple 两种类型 HOT 8
- retry: Strategy 接口设计与等间隔重试实现
- retry: 指数退避重试策略实现 HOT 1
- pool相关总issue
- sqlx:ScanRows 和 ScanAll方法 HOT 9
- mapx: MutipleTreeMap
- mapx: 为 MultipleMap 添加 PutVals 方法
- mapx: LinkedMap 特性 HOT 12
- copier: ReflectCopier 支持忽略字段 HOT 1
- copier: 支持类型转换 HOT 20
- randx: 随机验证码生成器 HOT 5
- ekit:AnyValue 支持类型转换 - String 转数字类型
- unsafe 转换 string 和 []byte HOT 1
- sqlx: sqlx.NewNullXXX 方法
- syncx: SegmentKeysLock HOT 3
- slice.ContainsFunc破坏性修改确认 HOT 3
- mapx: 支持 Len 方法
- 重构randx.RandCode以及传入的RandType数值 HOT 3
- slice 转 map HOT 3
- 提供 Must 和 MustT 函数,简化错误处理 HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ekit.