资源简介
程序完成段页式虚拟存储管理存储分配、地址重定位和缺页中断处理
为一个进程的内存申请(多少个段,每个段多大)分配内存,当一个进程(完成)结束时回收内存;
(2)对一个给定逻辑地址,判断其是否缺段、缺页,若不缺段、不缺页,则映射出其物理地址;
(3)若缺段则进行缺段中断处理,若缺页则进行缺页中断处理。
假定内存64K,内存块(页框)1K,进程逻辑地址空间最大16个段,每个段最大64K。假设进程运行前未预先装入任何地址空间。
输出每次存储分配/回收时,内存自由块分布情况、相关进程的段表和页表信息。
代码片段和文件信息
#include
#include
#include
#include
#include
typedef struct Page //页结构
{
int ID; //页号
char in_out; //是否在内存
int pianyi; //页内偏移
int block_num; //对应块号
int time; //在内存的时间
int Process_ID; //所属进程ID
char name[10]; //所属进程名
int Segment_ID; //所属进程段号
struct Page *next;
}Pa*PaNode;
typedef struct Segment //段结构
{
int ID; //段号
Page *page; //段中的页结构
int size; //段大小
char in_out; //是否在内存中
struct Segment *next;
}Seg*SegNode;
typedef struct PCB //进程信息
{
Segment *segm; //进程段信息
int total_segmet;//段总数
int ID; //进程ID
char name[10]; //进程名
struct PCB *next;
}PCB*pcb;
typedef struct Memory//内存块信息
{
int ID;//页框号
char allocated;//标记是否已分配
int block_size;//页框大小
int Process_ID; //占用进程ID
char name[10]; //占用进程名
int Segment_ID; //占用进程段号
int Page_ID; //占用进程的页号
int time_in_memory;//页在内存中的时间
int recently;//最近访问的时间
struct Memory *next;
}*memory;
//函数申明
void CreateSegment();
void CreateMemory();
void CreateProcess();
void InitPage(PaNode *p);
void InitSegment(SegNode *s);
void PrintProcessSegment();
void InitProcess(pcb *pro);
void ApplyMemory();
void PrintMemory();
void AddressExchange();
void InterruptHanding(int idint iint j);
void Apply();
void Recycle();
int Register;//段表的起始地址
int Flash; //内存大小
int BLOCK;//页框大小
int remained;//剩余的内存
pcb process; //申明一个进程链表
int total_process = 0;//进程总数
memory memory_info;//申明一个记录内存信息的链表
int InterruptType = -1;//中断类型1表示缺段中断,0表示缺页中断
void CreateProcess()//建立进程信息
{
PCB *p*s;
Seg *m*n;
Pa *r*t;
p = process;
int ijk;
printf(“请输入进程总数:“);
scanf(“%d“&total_process);
for(i = 0;i < total_process;i ++)
{
s = (PCB*)malloc(sizeof(PCB));
printf(“\n请输入第%d个进程名:“i+1);
scanf(“%s“s->name);
s->ID = i;
printf(“\n请输入该进程的段总数:“);
scanf(“%d“&s->total_segmet);
InitSegment(&s->segm);
n = s->segm;
for(j = 0;j < s->total_segmet;j ++)
{
m = (Seg*)malloc(sizeof(Seg));
printf(“\n请输入第%d个段的段大小: “j+1);
scanf(“%d“&m->size);
m->ID = j;
m->in_out = ‘N‘;
InitPage(&m->page);
t = m->page;
for(k = 0;k < m->size/BLOCK;k ++)
{
r = (Pa*)malloc(sizeof(Pa));
r->block_num = -1;
r->ID = k;
r->in_out = ‘N‘;
r->time = 0;
r->pianyi = 0;
r->Process_ID = i;
r->Segment_ID = j;
strcpy(r->names->name);
t->next = r;
t = t->next;
t->next = NULL;
}
n->next = m;
n = n->next;
n->next = NULL;
}
p->next = s;
p = p->next;
p->next = NULL;
}
}
//初始化
void InitPage(PaNode *p)
{
*p = (PaNode)malloc(sizeof(Pa));
(*p)->next = NULL;
}
void InitSegment(SegNode *s)
{
*s = (SegNode)malloc(sizeof(Seg));
(*s)->next = NULL;
}
void InitProcess(pcb *pro)
{
*pro = (pcb)malloc(sizeof(PCB));
(*pro)->next = NULL;
}
void InitMemory(memory *m)
{
*m = (memory)malloc(sizeof(Memory)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-05-31 18:11 OS_test2\Debug\
文件 4304 2013-05-23 13:12 OS_test2\OS_test2.dsp
文件 541 2013-05-23 12:42 OS_test2\OS_test2.dsw
文件 66560 2013-05-30 13:06 OS_test2\OS_test2.ncb
文件 53760 2013-05-30 13:06 OS_test2\OS_test2.opt
文件 895 2013-05-30 13:04 OS_test2\OS_test2.plg
文件 24698 2013-05-30 13:04 OS_test2\main.cpp
目录 0 2013-05-30 13:06 OS_test2\
- 上一篇:89c51+DS18B20 数码管
- 下一篇:模拟一个小型磁盘文件管理系统
相关资源
- 操作系统存储管理页面置换算法(O
- 可变式分区存储管理 实验报告和源代
- 请求分页存储管理模拟实验
- 请求页式存储管理实验
- 北京邮电大学操作系统实验实验报告
- 操作系统 实验 模拟分页式虚拟存储管
- 请求分页存储管理系统设计与实现顾
- 设计一个可变式分区分配的存储管理
- 存储管理--可变分区管理 操作系统
- 操作系统实验报告+源代码 基本分页存
- 动态分区分配存储管理
- 实现请求页式存储管理模拟程序
- 基本分段存储管理系统的设计
- 模拟设计动态分区存储管理的分配与
- 段页式管理(combined paging and segmenta
- 基本段式存储管理的模拟实现
- 模拟设计段页式虚拟存储管理中地址
- 请求分页式存储管理
- 模拟设计段式存储管理中地址转换
- 虚拟存储器 操作系统 模拟分页式虚拟
- 动态分区存储管理方式的算法 最佳
- 操作系统实验二存储管理
- 操作系统可变分区存储管理方式的内
- 分段存储管理系统
- 基本分段存储管理系统
- 操作系统 程实现请求分页存储管理页
- PE获取导出表 导入表 资源表 重定位表
评论
共有 条评论