段页式存储管理模拟程序

**

编写一个段页式存储管理模拟程序

**
用C语言编写的一个段页式存储管理模拟程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Maxn 5
 
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;
		printf("%d\t%d\n",seg_table.data[i].seg_address,seg_table.data[i].seg_final_address);
    }
}
 
void init()
{
    printf("请输入地址数量:");
	scanf("%d",&num);
    printf("请输入地址数大小:");
    for(int i = 0; i<num; i++)
        scanf("%d",&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)
                    {
                       printf("%d的转换地址\n",address[k]);
                       printf("段号:%d\n",i);
					   printf("段号对应的地址:%d\n",Seg_address[i]);
					   printf("页号:%d\n",j);
                       printf("块号:%d\n",page_table[j]);
                        page_state[page_table[j]] = false;
                        index = 1;
                        i = Maxn;
                    }
                }
                if(index == 0)
                {
					printf("在页表中没能找到:%d !!!\n",address[k]);
                    i = Maxn;
                }
            }
            else if(address[k] < Seg_table_register[0])
            {
				printf("地址太低:%d !\n",address[k]);
                i = Maxn;
            }
            else if(address[k] > seg_table.data[Maxn-1].seg_final_address)
            {
				printf("地址越界:%d !\n",address[k]);
                i = Maxn;
            }
            else
            {
                if(i == Maxn - 1)
					printf("在段表中没能找到:%d !!\n",address[k]);
            }
        }
    }
}
 
int main()
{
    address_translation();
    return 0;
}

程序输出的结果为:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
段页存储管理是一种操作系统中常见的存储管理,其中将物理内存按固定大小的页面划分,将逻辑地址和物理地址分别分成页号和页内偏移两部分,通过段表和页表进行地址转换。下面是用C语言编写操作系统段页存储管理的地址转换的模拟程序: ```c #include <stdio.h> #include <stdlib.h> #define PAGE_SIZE 4096 #define PAGE_NUM 1024 #define SEGMENT_SIZE 65536 #define SEGMENT_NUM 128 typedef struct { int valid; int frame_num; } PageTable; typedef struct { int base; PageTable *page_table; } SegmentTable; int main() { int logical_address; printf("请输入逻辑地址:"); scanf("%d", &logical_address); int segment_num = logical_address / SEGMENT_SIZE; int page_num = (logical_address % SEGMENT_SIZE) / PAGE_SIZE; int offset = logical_address % PAGE_SIZE; SegmentTable segment_table[SEGMENT_NUM]; for (int i = 0; i < SEGMENT_NUM; i++) { segment_table[i].base = rand() % PAGE_NUM; segment_table[i].page_table = (PageTable *)malloc(PAGE_NUM * sizeof(PageTable)); for (int j = 0; j < PAGE_NUM; j++) { segment_table[i].page_table[j].valid = rand() % 2; segment_table[i].page_table[j].frame_num = rand() % PAGE_NUM; } } if (segment_table[segment_num].page_table[page_num].valid) { int physical_address = segment_table[segment_num].page_table[page_num].frame_num * PAGE_SIZE + offset; printf("物理地址为:%d\n", physical_address); } else { printf("无效页面!\n"); } return 0; } ``` 以上是一个简单的使用C语言编写的操作系统段页存储管理的地址转换的模拟程序。程序通过随机生成的段表和页表来模拟实际的地址转换过程,计算逻辑地址对应的物理地址并输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值