Giter VIP home page Giter VIP logo

Comments (4)

archer-wyz avatar archer-wyz commented on June 16, 2024 1

首先我们需要明确使用arena设计一个新的sync.pool的使用场景——根据proposal说明,arena的设计初衷是,因为一个服务要在较短时间内开辟一大片内存,用于存储同一种数据,而在服务退出后这些内存不再需要,就应当迅速归还给操作系统。

  1. 先讨论最简单的情况,用户直接分配一块固定大小的空间,有明确的数据类型、要的数据个数,那么用户可以直接指定要的数据个数,我们通过arena直接分配。
  2. 用户自己不明确需要多少个数据,我们可以通过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.

uzziahlin avatar uzziahlin commented on June 16, 2024

了解了一下arena包提供的API,我觉得有个比较难的点是Arena只能整块被释放,并不能局部释放,这就可能会有一个难题是,对象池里边超过空闲时间的对象释放可能会成为一个问题。我目前能想到的就是以下两种策略:

  1. 一个对象池共享一个Arena,当Arena分配的空间活跃对象和Arena分配的总对象占比小于一定比例的时候,想办法释放整块Arena,重新分配一块Arena。但是其中有一个问题可能就是,得确保分配出去的对象,用户已经全部归还。
  2. 一个对象池创建多个Arena,从这多个Arena中分配对象,当需要淘汰内存时,淘汰那些对象已经被全部归还的Arena,但还是涉及到上边的那个问题,如何去判断用户申请的对象已经全数归还。
    但是以上2种方式好像都不太好实现。

from ekit.

flycash avatar flycash commented on June 16, 2024

抱歉,我忽略了这个问题。

容量控制问题
这个我们肯定是要做的,但是前期我们要先看看最简单的 Arena pool 能不能达成我们的目标。

一个对象池创建多个Arena,从这多个Arena中分配对象,当需要淘汰内存时,淘汰那些对象已经被全部归还的Arena,但还是涉及到上边的那个问题,如何去判断用户申请的对象已经全数归还。
但是以上2种方式好像都不太好实现。

根据我对 Arena 对象的了解,貌似我们只能采用一个对象一个 Arena 实例的做法,再多都不可以了。

from ekit.

flycash avatar flycash commented on June 16, 2024

#166

from ekit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.