存储器管理

实验目的:

 

本实验的目的是,使学生熟悉存储器管理系统的设计方法,加深对所学各种存储器管理方案的了解。

实验要求:

要求能独立地编写一个常用的存储分配算法,并能设计一个存储管理的模拟系统并调试运行。

对存储算法进行分析比较,评测其性能优劣,加深理解。

 

实验内容:

采用固定分区、最佳适应BF算法或首次适应算法,编写存储器管理模拟系统。

可用任何一种高级语言编写。

基本要求: (1)掌握动态内存分配过程alloc()和回收过程free();(2)在给定初始状态下,采用一种算法进行内存块的分配和回收,要求每次分配和回收后显示空闲内存分区的情况。

注:算法可任选、数据结构可任选。

#include<stdio.h>
#include<stdlib.h>
typedef struct freearea{
int address;
int size;
struct freearea *front;
struct freearea *next;
}*FreeLink,FreeNode;
typedef struct Mat{
int address;
int size;
struct Mat *front;
struct Mat *next;
}*MatLink,Matnode;
MatLink mat,Mathead,Matend;
FreeLink freelink,freehead,freeend;
int total;
int jobcount=0;

void insert();
void deletejob();
void shuchu1();
void shuchu2();
void initfreearea(){
freelink=(FreeLink)malloc(sizeof(FreeNode));

freelink->address=2000;
freelink->size=5000;
total=freelink->size;
freelink->front=NULL;
freelink->next=NULL;
freehead=freelink;
freeend=freelink;
}

void founction(){
printf("\n1.插入作业 2.删除作业 3.查看作业 4.查看空闲内存\n");
int n;
printf("请输入(1-4):\n");
scanf("%d",&n);
if(n<1||n>4){
printf("请重新输入(1-4):\n");
scanf("%d",&n);
}
switch(n){
case 1 :insert();break;
case 2 :deletejob();break;
case 3 :shuchu2();break;
case 4 :shuchu1();break;
}
}
void insert(){
int n;
MatLink p;
FreeLink fh,fn,h;

h=freehead;

printf("请输入分配内存的大小:\n");
scanf("%d",&n);
if(n>total){
printf("内存只剩下%d,请输入分配内存的大小:\n",total);
scanf("%d",&n);
}

if(jobcount==0){
Mathead=(MatLink)malloc(sizeof(Matnode));
while(h!=NULL){

if(freehead->size>=n){

Mathead->address=freehead->address;
printf("\n-----------%d\n",freehead->address);
freehead->address=freehead->address+n;
freehead->size=freehead->size-n;
if(freehead->size==0){
h=h->next;
freehead=h;
}
break;
}else if(freeend->size>=n&&freeend->front->size<n){
Mathead->address=freeend->address;
freeend->address=freeend->address+n;
freeend->size=freeend->address-n;
if(freeend->size==0){
freeend=freeend->front;
}
break;
}else{
while(h!=freeend){
if(h->size<=n&&h->next->size>n){

Mathead->address=h->address;
h->address=h->address+n;
h->size=h->size-n;
if(h->size==0){
fn=h->next;
fh=h->front;
fh->next=fn;
fn->front=fh;
}
break;
}else{
h=h->next;
}
}
}

}

Mathead->size=n;
Mathead->front=NULL;
Mathead->next=NULL;
Matend=Mathead;
jobcount++;
total=total-n;

}else{
p=(MatLink)malloc(sizeof(Matnode));
printf("\n-----------%d--%d\n",freehead->size,n);
while(h!=NULL){
if(freehead->size>=n){
printf("\n---1--------\n");
p->address=freehead->address;
freehead->address=freehead->address+n;
freehead->size=freehead->size-n;
if(freehead->size==0){
h=h->next;
freehead=h;
}
break;
}else if(freeend->size>=n&&freeend->front->size<n){
p->address=freeend->address;
freeend->address=freeend->address+n;
freeend->size=freeend->address-n;
if(freeend->size==0){
freeend=freeend->front;}
break;
}else{
while(h!=freeend){
if(h->size<=n&&h->next->size>n){

p->address=h->address;
h->address=h->address+n;
h->size=h->size-n;
if(h->size==0){
fn=h->next;
fh=h->front;
fh->next=fn;
fn->front=fh;
}
break;
}else{
h=h->next;
}
}
}

}
p->size=n;
p->front=Matend;
Matend->next=p;
p->next=NULL;
Matend=p;

jobcount++;

total=total-n;
}
shuchu1();
shuchu2();
}
void shuchu1(){
FreeLink p;
p=freehead;
while(p!=NULL)
{
printf("空闲内存首地址:%d\t空闲内存大小:%d\n",p->address,p->size);
p=p->next;
}

}
void shuchu2(){
MatLink p;
p=Mathead;
while(p!=NULL)
{
printf("内存首地址:%d\t内存大小:%d\n",p->address,p->size);
p=p->next;
}
}
void deletejob(){
int n,i;
MatLink p,q,t,z;
FreeLink h,f,y;
p=Mathead;
printf("请输入删除作业的编号(0-%d):\n",jobcount-1);
scanf("%d",&n);
if(n>jobcount||n<0){
printf("内存无此作业\n");
printf("请重新输入删除作业的编号(0-%d):\n",jobcount-1);
scanf("%d",&n);
}
if(jobcount==1){
t=Mathead;
Mathead=NULL;
}else{
if(n==0){
t=Mathead;
p=p->next;
p->front=NULL;

Mathead=p;
}else if(n==jobcount-1){
t=Matend;
q=Matend->front;
q->next=NULL;
Matend=p;
}else{
for(i=0;i<jobcount-1;i++){
if(i==n){

z=p->next;
q=p->front;
q->next=z;
z->front=q;

t=p;

break;
}else{
p=p->next;
}
}
}

}//*

jobcount-=1;
total=total+t->size;
h=freehead;
f=(FreeLink)malloc(sizeof(FreeNode));
f->address=t->address;
f->size=t->size;
printf("\n--1---%d %d\n",t->address,t->size);
if(f->address<freehead->address){
freehead->front=f;
f->next=freehead;
f->front=NULL;
freehead=f;
printf("\n---...--\n");

}else if(f->address>freeend->address){
freeend->next=f;
f->front=freeend;
f->next=NULL;
freeend=f;

}else{
while(h!=freeend){
if(f->address>h->address&&f->address<h->next->address){
y=h->next;
h->next=f;
f->front=h;
y->front=f;
f->next=y;

break;
}else{

h=h->next;

}

}
}

shuchu1();
shuchu2();
}
int main(){
initfreearea();
while(1){
founction();
}

return 0;
}

原文地址:https://www.cnblogs.com/huifeidezhuzai/p/9278983.html

时间: 2024-10-13 11:39:44

存储器管理的相关文章

【操作系统】存储器管理(四)

一.前言 在分析了处理器调度后,接着分析存储器管理,如何对存储器进行有效的管理,直接影响着存储器的利用率和系统性能.下面,开始存储器管理的学习. 二.存储器的层次结构 2.1 主存储器 主存储器是计算机系统中的一个主要部件,用于保存进程运行时的程序和数据,CPU的控制部件只能从主存储器中取得指令和数据,数据能够从主存储器中读取并将他们装入到寄存器中,或者从寄存器存入到主存储器,CPU与外围设备交换的信息一般也依托于主存储器地址空间.但是,主存储器的访问速度远低于CPU执行指令的速度,于是引入了寄

二、存储器管理

操作系统的功能包括:处理器管理.存储器管理.文件管理.设备管理等. 内存管理的功能有:1.内存空间的分配与回收,包括内存的管理和共享.2.地址转换,把逻辑地址转换成相应的物理地址.3.内存空间的扩充,利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存.4.存储保护,保证各道作业在各自的存储空间内运行,互不干扰. 逻辑地址转换为物理地址的过程叫做地址重定位. 内存分配管理方式 内存分配管理方式:连续分配管理方式(包括:单一连续分配,固定分区分配,动态分区分配)与非连续分配管理方式(包括:基本分页存储

操作系统-存储器管理

存储器管理 存储器的层次结构 程序的装入和链接 用户程序要在系统中运行的话,就必须装入内存,然偶后将其转变为一个可执行的程序. 编译 由编译程序对用户源程序进行编译,形成若干个目标文件 链接 由链接程序将编译后形成的一组目标模块以及它们所需要的库函数接在一起,形成一个完整的装入模块 装入 由装入程序将装入模块装入内存 程序的链接 静态链接方式 在程序运行前,就先将各个目标模块以及它们所需要的库函数链接成一个完成的装配模块,之后都不会拆开,这样需要解决两个问题:修改相对地址,变换外部调用符号 装入

操作系统之存储器管理

存储器的层次结构 存储器的层次如下图: 上图中,寄存器和主存储器称为可执行存储器.高速缓存的作用是缓和CPU与内存之间的速度差异,主要由硬件实现.磁盘缓存的出现是由于内存容量不够,需要引入磁盘,然而磁盘的I/O速度远低于主存的访问速度,为了缓和两者之间在速度上的差异,设置了磁盘缓存.磁盘缓存与高速缓存不同,它本身并不是实际存在的存储器,是利用主存中的部分空间暂时存放从磁盘中读出写入的信息. 程序的装入与链接 用户程序需要运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常要经历一下

计算机操作系统之存储器管理

程序运行 将用户的一个源程序变成一个可在内存中执行的程序,通常要经过以下几个步骤: 1.编译:由编译程序,将程序编译成若干个目标模块 2.链接:由链接程序将编译后形成的一组目标模块,以及他们所需要的库函数链接在一起,形成一个完整的装入模块. 3.装入:由装入程序将装入模块装入内存 具体讨论一下如何把一个装入模块,装入内存: 1.绝对装入方式:编译程序产生带有绝对地址的目标代码,只适合于单道程序环境. 2.可重定位装入方式:所得到的模块都是以0开始的,程序中的其它地址也都是相对于起始地址计算的,此

第三章:存储器管理

内存管理: 存储管理的功能: ·内存空间的分配与回收,包括内存的分配和共享 ·地址转换 ·内存空间的扩充 ·存储保护   程序的装入: ·静态重定位 ·动态重定位   程序的链接: ·静态链接 ·装入时动态链接 ·运行时动态链接   逻辑地址空间:   物理地址空间:   内存保护: ·存储键保护 ·上下限保护   静态式连续分配管理方式: ·固定式分区存储管理:内存均等划分 ·可变式分区存储管理:按一定比例划分内存 动态式分配管理: 用多少分多少,时间长了会产生很多碎片   分配算法: ·首次

操作系统-存储器管理部分

存储器历来都是计算机系统中重要的组成部分.仍然是一种宝贵而又稀缺的资源. 如何对它加以有效的管理,不仅直接影响到存储器的利用效率,而且会影响系统的性能. 存储器的管理的主要对象是内存.在计算机执行时,几乎每一条指令都会涉及到对存储器的访问. 存储器的三个理想条件(这三个条件从现在技术来讲是不可能同时达到的) 1.对存储器的访问速度要跟得上处理机的运行速度. 2.要求存储器要有很大的容量. 3.而且存储器的造价应该很低. 在现代计算机系统当中无一例外的采用了多层结构的存储器系统. 存储器的多层结构

OSOS存储器管理(三) 虚拟存储器

基本概念与实现 1)局部性原理 在一段时间内,运行的作业程序仅访问(涉及到)一部分作业代码,即不会涉及整个地址空间.即在一段时间间隔内,仅装入一部分代码,作业照样能正常运行 2)虚拟存储器的引入 作业(进程)运行时,仅装入其代码的一部分到物理内存,待需要时再装入其余部分,同时还可将不再运行的部分调出物理内存.变相地扩充了内存容量,即实现了虚拟存储器. 虚拟内存 ①虚拟内存将内存抽象成一个巨大的.统一的存储数组,进而将用户看到的逻辑内存与物理内存分开 ②只要部分程序需要放在内存中就能使程序执行 ③

存储器管理之页面置换算法

地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间.而用来选择淘汰哪一页的规则叫做页面置换算法.常见的置换算法有: 1)最佳置换算法(OPT)(理想置换算法) 这是一种理想情况下的页面置换算法,但实际上是不可能实现的.该算法的基本思想是:发生缺页时,有些页面在内存中,其中有一页将很快被访问(也包含紧接着的下一条指令的那页),而其他页面则可能要到10.100或者1000条指令后才会被访问,