c - 第二次机会页面替换

标签 c page-tables

为什么我的第二次机会页面替换寻呼机系统的功能不起作用?

该函数仅选择受害者帧并返回它。

如果有空闲帧,则返回它。否则,它必须根据 SC(第二次机会)算法选择当前正在使用的帧。

它返回所选帧的帧号,但不返回 更新所有寻呼机数据。

我的职能是:

// select the frame based on second chance, passing the page
uint64 sc_select_victim_frame(pager_data* pager)
{   
    // these first 4 lines its like fifo, if frame for this page is not occopied (free)
    //then just return it,
    then am just incrementing the sc_count for future indexing of fifo,

    if(!(pager->frames[0].occupied)){
        return pager->SC_count;
    }

    pager->SC_count +=1;
    pager->SC_count = pager->SC_count % pager->num_frames;


    for(uint64 i=0; i<pager->num_frames; i++){
        if(pager->frames[i].occupied){
            if(!pager->second_chance[i]){
                pager->second_chance[i] = 1;
            }
            return i;
        }
    }



    return pager->SC_count;

}

寻呼机结构具有:

typedef struct _pager_data{

uint64 num_pages, num_frames, page_sz, num_procs;
frame* frames;
page_table_entry** page_tables;
uint64 SC_count;
bool* second_chance; // I have created this array to track the second chance

} pager_data;

页表项结构为:

typedef struct _page_table_entry{
    uint64 flags : 12; 
    uint64 frame : 40; 
    uint64 unused : 12; 
} page_table_entry;

最后,我的框架是:

typedef struct _frame{
    bool occupied; 
    uint64 pid, page_number;
} frame;

我已在寻呼机内添加了 bool* secondary_chance; 但我不确定这是否正确。我的第二次机会算法不正确吗?

为什么我的函数无法正常工作?

最佳答案

最后我的解决方案是;

uint64 sc_select_victim_frame(pager_data* pager)
{   

    if(!(pager->frames[0].occupied)){
        pager->SC_count +=1;
        pager->SC_count = pager->SC_count % pager->num_frames;
        return pager->SC_count;
    }



    if(pager->second_chance[pager->SC_count] == 0){
        pager->second_chance[pager->SC_count] = 1;
        pager->SC_count +=1;
        pager->SC_count = pager->SC_count % pager->num_frames;
        return pager->SC_count;
    }

    pager->second_chance[pager->SC_count] = 0;
    return pager->SC_count;



}

关于c - 第二次机会页面替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58892861/

相关文章:

objective-c - 我是编程新手。我的目标是学习 Objective-C,但到目前为止 C 更容易理解。我该往哪个方向走?

如果用户输入 ' . ',我可以让程序读取 ' , ' 吗?使用 C

字符表,段错误

windows - AMD64 页面条目基地址字段如何将 52 位地址编码为 40 位?

memory - 多级页表如何节省内存空间?

我可以使用 pthread_kill 停止(暂停)pthread 执行吗

c - 堆栈头部和尾部更新为相同的值但仅在 head-C 编程上调用更新

assembly - x86 cr3 和 linux swqpper_pg_dir

x86 - x86的多级分页相对于单页表有什么优势?

x86-64 - x86_64 是否与指令中的 aarch64 等效?