在实现TREE PAGE的过程中,涉及到多个页进行数据更新的过程,实现过程中发现的问题有数据更新页的次序问题,新页生成的问题,缓存不够页置换的问题,数据重新LOAD的问题,写盘时机点的问题。
数据更新次序问题,可以使用一FIFO,将要处理的数据记入到FIFO中,先进先出,保证处理的次序问题,次序是后处理的PAGE的数据依赖前面数据处理的结果。这里是否可以有更快的处理速度?可以将同一个UP LEVEL PAGE中多个下一级PAGE先预先MEMPAGE ALLOC后,一次循环将数据推到下一级。然后此级就可以接收新的数据,目前的做法是 MEMPAGE ALLOC一个,逐个处理。处理完UP LEVEL的数据后,设定标记,才允许数据再次进入到UP LEVEL PAGE中。
在FIFO队列中有需要新生成的页,需要进行MEMPAGE空间的分配和文件位置的分配,MEMPAGE需要从CACHE中ALLOC,如果CACHE中有,可以直接获取到,没有的情况则需要等待,需要定时检查使用有空间可以进行ALLOC,检查的方式目前采用的是TASK自己向自己发消息的方式继续行,前面快,后面慢的方式进行,为了防止TASK此消息影响其他消息的处理。MEMPAGE空间获得后就可进行NEW PAGE的处理,将数据进行导入。
缓存置换的算法使用LRU的算法进行,淘汰的PAGE页需要进行写盘操作,需要判断数据是否在FIFO列表中的数据,最好是不在FIFO中,这样可以减少LOAD数据的IO过程。在写盘的过程中需要对MEMPAGE进行保护,可以通过标记的方式进行,也可以通过消息的方式进行,消息获得后将PAGE还回到CACHE中,供下一个申请的过程使用。标记的方式需要在ALLOC过程中检查标记,如标记表示不可用,则将此数据在加入到FIFO中,取下一个新的页,再检查标记,重复上面过程。两种方式不同在于一个是后加入FIFO 中,一个是先加入到FIFO 中。
数据LOAD的过程分为两个异步过程,一个是CACHE MEMPAGE ALLOC的过程,一个是从FILE中LOAD数据的过程,ALLOC的过程和上面一样,ALLOC不成功需要定时检查,直到获取到。然后是进行文件读取的过程,获取后通知,读到MEM中进行后续处理。
MEMPAGE写盘时机点的问题,其中一个是CACHE REPLACE的过程,需要进行置换页的写盘操作,可以在MEMPAGE中对数据进行标记,没有数据更新的情况下,写盘操作可以直接略过,不需要处理。另一个就是NEW MEMPAGE写盘的时机点的选择,简单的做法是更新到一定比例的数据写一次盘,定时检查,有数据变化就进行刷写文件,没有数据变化不刷写盘。