资源简介

程序完成段页式虚拟存储管理存储分配、地址重定位和缺页中断处理    为一个进程的内存申请(多少个段,每个段多大)分配内存,当一个进程(完成)结束时回收内存;    (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\

评论

共有 条评论