zoukankan      html  css  js  c++  java
  • 段页式存储管理

    编写并调试一个段页式存储管理的地址转换的模拟程序。

      首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。

    要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。

    我设计的段表和页表如下:

    代码:

    #include <iostream>
    #include <cstring>
    #define Maxn 5
    using namespace std;
    
    int page_table[5] = {2,3,6,8,9};
    int Seg_address[5] = {2,12,30,45,73};
    bool page_state[10];
    int address[100];
    int tran_address[100];
    int num;
    int Seg_table_register[2];
    
    typedef struct
    {
        int seg_address;
        int seg_final_address;
    } Box;
    
    typedef struct
    {
        Box data[Maxn];
    } Segment;
    
    Segment seg_table;
    
    void Seg_table()
    {
        Seg_table_register[0] = Seg_address[0];
        Seg_table_register[1] = Maxn;
        memset(page_state,false,sizeof(page_state));
        for(int i = 0; i<5; i++)
        {
            seg_table.data[i].seg_address = Seg_address[i];
            seg_table.data[i].seg_final_address = page_table[4] + Seg_address[i] - Seg_table_register[0];
            page_state[page_table[i]] = true;
            cout<<seg_table.data[i].seg_address<<"  "<<seg_table.data[i].seg_final_address<<endl;
        }
    }
    
    void init()
    {
        cout<<"input the number of the address:"<<endl;
        cin>>num;
        cout<<"input the address:"<<endl;
        for(int i = 0; i<num; i++)
            cin>>address[i];
        Seg_table();
    }
    
    void address_translation()
    {
        init();
        for(int k = 0; k<num; k++)
        {
            for(int i = 0; i < Maxn; i++)
            {
                if((address[k] >= seg_table.data[i].seg_address) && (address[k] <= seg_table.data[i].seg_final_address))
                {
                    int index = 0;
                    for(int j = 0; j<5; j++)
                    {
                        if(seg_table.data[i].seg_address + page_table[j] - Seg_table_register[0] == address[k]
                                && page_state[page_table[j]] == true)
                        {
                            cout<<address[k]<<"'s converted address:";
                            cout<<"Segment number:"<<i<<"  Segment address:"
                                <<Seg_address[i]<<"  page number:"<<j
                                <<"  block number:"<<page_table[j]<<endl;
                            page_state[page_table[j]] = false;
                            index = 1;
                            i = Maxn;
                        }
                    }
                    if(index == 0)
                    {
                        cout<<"can not find "<<address[k]<<" in page table!!!"<<endl;
                        i = Maxn;
                    }
                }
                else if(address[k] < Seg_table_register[0])
                {
                    cout<<"address "<<address[k]<<" is too low!"<<endl;
                    i = Maxn;
                }
                else if(address[k] > seg_table.data[Maxn-1].seg_final_address)
                {
                    cout<<"address "<<address[k]<<" is too high!"<<endl;
                    i = Maxn;
                }
                else
                {
                    if(i == Maxn - 1)
                        cout<<"can not find "<<address[k]<<" in segment table!!"<<endl;
                }
            }
        }
    }
    
    int main()
    {
        address_translation();
        return 0;
    }

    运行结果示例:

    1不在段表中,5 不在页表中,37是段表号为 2,页表号为 4,块号为9的地址,54 处在段表不存在的地址,90超过了段表大小。


  • 相关阅读:
    git-将dev代码合并到test
    java中一句话取到用split()截后的最后一个值
    shiro重定向或会话失效后NginxURL地址无效,以及浏览器控制台Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure错误
    Linux 查找Nginx配置文件位置命令
    Linux 常用命令(个人暂时用到的)
    代理模式
    【Vue自学笔记(四)】天气案例
    【Vue自学笔记(三)】网络请求的简单使用
    【Vue自学笔记】案例
    【Vue自学笔记(二)】Vue指令
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9450748.html
Copyright © 2011-2022 走看看