这里只研究了部分基于共享内存的fifo,大致了解了一下其结构。
fif_segment_main_t负责总管理,其下有多个fifo_segment_t (fs),每个fs对应一个共享内存文件,其虚地址通过mmap映射,为了方便管理,这些fs的虚地址va是连续的。
fs有一个ssvm_private_t ssvm,是用来管理共享内存申请以及va映射的,ssvm有一个ssvm_shared_header_t *sh,用来存储共享内存相关的参数,后面使用比较频繁的是heap,将申请的共享内存的大部分都当成这个fs的私有heap。后续的一些数据申请都在这个heap上申请。
fs对用户数据的管理是通过fifo_segment_header_t (fsh)来管理的,其中fsh内又分为多个片fifo_segment_slice_t *slices(fss)。至于片的个数,有fs中的n_slices来决定。正常情况下,1片就够了。
fsh中,记录了整个fs中可用的内存空间:n_free_bytes;正在使用的fifo数:n_active_fifos;还有一些其他的数据参数。
fss中,存有3个队列,svm_fifo_t *fifos存储正在使用的fifo;svm_fifo_t *free_fifos是空闲的fifo的队列头;svm_fifo_chunk_t **free_chunks是个十字链,按chunk大小保存chunk。分为4K、8K、16K一直到heap/2,申请的chunk分别挂在对应的队列头上。
每次申请fifo时,可能会成批得申请,也可能因为内存不够切片申请。