2017-06-02 158 views
0

我想用fifo算法开发缓存模拟器。我了解fifo算法的工作原理,但是我在理解如何实现它时遇到了问题。我提供了用于开发缓存的模板。我想知道实现算法的好方法。在C++上使用fifo算法开发缓存模拟器的好方法

#include <stdlib.h> 

extern int opt_assoc, opt_block, opt_capacity, opt_repl, opt_verbose; 

typedef struct { 
    int set;      // set ID: 0 ~ (#sets - 1) 
    int blk;      // block ID: 0 ~ (#blocks - 1) 
    bool miss;     // whether this access is a miss 
    bool evict;     // whether eviction happens 
    bool is_victim_dirty;   // if evicted, whether the evicted block is dirty 
} cache_state_t; 

cache_state_t cache(unsigned int addr, char type) 
{ 
    // type: either 'l' or 's' 

    cs.miss = true; 
    static bool first_time = true; 
    if (first_time) { 
     first_time = false; 
    } 

    cache_state_t cs; 

    return cs; 
} 
+1

''? 'typedef struct {'?你应该把你的问题标记为“in C99”,而不是“in C++”。 – mloskot

+0

我很困惑这个模板。除非我遗漏了一些东西,'cache()'似乎会在堆栈中声明'cs'并返回它,在这种情况下,只要函数退出,它就会被释放。我错了吗? –

+0

@PatrickRoberts确切! – Huan

回答

0

你的代码是不正确和不完整的,我想你刚开始在C.使用ANSI C语言程序设计(书)进行编程,以了解如何实现双向链表或圆形队列,然后从那里出发。

给予更多提示cache_state_t将成为双向链表或循环队列中的一个节点,一旦你填充缓存下一个请求,如果它的未命中将导致删除缓存的头节点并将新的缓存节点在尾巴。

FIFO缓存替换通常在类别分配中给出,很少这些策略在商业上实现,LRU是商业缓存管理解决方案的视野。

理想情况下,这应该是一个评论,但我没有评论特权。

+0

正如我所说它只是一个模板,所以它这并不奇怪,它不完整。我关心的是算法的实现。我很熟悉C,我只想找出一些方法来实现缓存。 – Huan

+0

不要觉得冒犯,但是什么样的模板稍后会声明变量并在之前赋值。对不起,但对于一个伪代码,你的例子不加起来。但我们都在那里帮助。您必须使用的DS是一个循环队列,其中队列的大小是缓存的大小。 – 2017-06-02 07:26:34