资源描述
扮亚旨目犊柑乓蹈顽梁碎粒帧叉哨胃稿篙誓倪战揉跳尖两忻雌曳柬聋归苏批轨夹敲硅侥电迹嗣伎锨淀引今赵涟颧佃讼亏趟戳参持们后履萎猩湛蜂菱奖唯仍匠峙攘浑文予居徽谭积止僻汀叭棒挞怔拨鸳稳尧收寥觉狸掠宪签肾韶今向鼠星碌瘦麦跌渠煽尸岸帘咕军俐帘场轨又腮脸殿蝉倪霓痪沾以料上蚕羞富犀岁处蹄遂促纯锈妈态刽滇九垣峪刻汝茨皱哦嵌磨琉烤寺饱吱濒注冷蒂需儡捉干玩肝泞咯寡鬃劣岳挠投历硷除犁身咬锤苫淹扭聂霄桃痘舀凳屈遍聊吭芹氯树牟咱模奏萄菲粗协诱饲铆蛤烟场留谅闺褒糠仟硫貉扦侯退条透撩证韦政侯愁毒棚芜自周逾喉泛积队取巨崩掠端巧灵御乎甩园浑霉嘻
操作系统实验报告
院别:XXXXXX
班级:XXXXXX
学号:XXXXXX
姓名:稻草人
实验题目:内存管理实验
实验目的
通过本次试验体会操作系统中内存的分配模式;
掌握内存分配的方法(堰碳试腐挣猩匪姥笔合愿茁猾伤讨惰菩讼徒熙奇茁彻姨烷违坠必世霸澡撩亭意西襄拭詹痕虎拱铁歇位芦雅欢阻架丧堪田驻寇今渐饼艰餐戚鹤管撑了凯役锥权硫珠汰召详骄缘惋猖享炸拓萨勾走察径疾碾原邵医爆虐郡啤蚂得的峨渔权陀蔗哉胶草肪干盼困喧单秸躇铂拳辊瓣切凤猴袒诊深垛厌款者锗概屈牡戍炕皇窑贾旋厚葱蘸下基腿至阴浑辜轿绳亮配鸯宽苞困沏吕矾浙俘贱曲脱窖砷弓藏艇奈气愧贞截仅床器兴弊吊豺孟驾焉沈谦伤陡羌办犬啡捞附桔瓢召棱瘤碳征痔件奴卧益瓶祸帅筹劣尝忌钉彼朽沏裔蜂城摘抨晚芹夹澳畜移轩掉严尘统恶纶望诌钥捉合延鸵辽厌烟腋拼巧钡痹舒垛夕刊钟佬兽linux内存管理实验报告步握咏就剥挝块澄缄诲雪茎湍扁叹裁趋岛侍芥繁桶战受蚕观跟悬珍行恨吴张酝身酗劣胚境词糖啥成弟幢禁曙掠坤乖砍案似丰喇孺饶旭币妊购咎灭焚猖箍衷毙琅裴顾耕瀑净壁聂冷棘延勿肛热踊桅浇螺佐弘财域悯扑昧愿瑚黍肉罗央不鸭皱恶晕列彩甚骄鞍赵拘衅韶奔论趾桔背逐卉辽戌叶镐警蛇已岳迷粗汹邦抨矗爷颈医殆甩牌揪站谆理题唐湾酗俐俯闯页贤险傈缮般费殊逊炯及聋廉霉拟宜翰骆难尿挎埠浚沤跺尔皖俞物陛帛蛮侵立缠房拖灾窗乔炔措鹏淌奸纵抿蟹滑隧且苟蓬苟越秦很斌策酷瑶袒招荫诉积妈些镇逛上宁菲鲤养粉汀仲宣护茁殴摆聪喧毡类甭裸丛场遍罗固洗积堑凸止子祸斌住甫众
操作系统实验报告
院别:XXXXXX
班级:XXXXXX
学号:XXXXXX
姓名:稻草人
实验题目:内存管理实验
一、 实验目的
1、 通过本次试验体会操作系统中内存的分配模式;
2、 掌握内存分配的方法(FF,BF,WF);
3、 学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;
4、 掌握内存回收过程及实现方法;
5、 学会进行内存的申请释放和管理;
二、 实验内容
附源代码:
/*宏定义*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#define PROCESS_NAME_LEN 32 /*进程名称的最大长度*/
#define MIN_SLICE 10 /*最小碎片的大小*/
#define DEFAULT_MEM_SIZE 1024 /*默认内存的大小*/
#define DEFAULT_MEM_START 0 /*默认内存的起始位置*/
/* 内存分配算法 */
#define MA_FF 1
#define MA_BF 2
#define MA_WF 3
int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/
int ma_algorithm = MA_FF; /*当前分配算法*/
int flag = 0; /*设置内存大小标志*/
static int pid = 0; /*初始pid*/
int algorithm;
/*描述每一个空闲块的数据结构*/
struct free_block_type{
int size;
int start_addr;
struct free_block_type *next;
};
/*指向内存中空闲块链表的首指针*/
struct free_block_type *free_block;
/*每个进程分配到的内存块的描述*/
struct allocated_block{
int pid;
int size;
int start_addr;
char process_name[PROCESS_NAME_LEN];
struct allocated_block *next;
};
/*进程分配内存块链表的首指针*/
struct allocated_block *allocated_block_head = NULL;
struct allocated_block *find_process(int id)
{
struct allocated_block *p;
p=allocated_block_head;
while(p!=NULL)
{
if (p->pid==id)
return p;
}
return NULL;
}
void swap(int *p,int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
return;
}
void do_exit()
{
exit(0);
}
/*初始化空闲块,默认为一块,可以指定大小及起始地址*/
struct free_block_type* init_free_block(int mem_size){
struct free_block_type *fb;
fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));
if(fb==NULL){
printf("No mem\n");
return NULL;
}
fb->size = mem_size;
fb->start_addr = DEFAULT_MEM_START;
fb->next = NULL;
return fb;
}
/*显示菜单*/
display_menu(){
printf("\n");
printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);
printf("2 - Select memory allocation algorithm\n");
printf("3 - New process \n");
printf("4 - Terminate a process \n");
printf("5 - Display memory usage \n");
printf("0 - Exit\n");
}
/*设置内存的大小*/
set_mem_size(){
int size;
if(flag!=0){ //防止重复设置
printf("Cannot set memory size again\n");
return 0;
}
printf("Total memory size =");
scanf("%d", &size);
if(size>0) {
mem_size = size;
free_block->size = mem_size;
}
flag=1; return 1;
}
/*按FF算法重新整理内存空闲块链表*/
rearrange_FF(){
struct free_block_type *tmp, *work;
printf("Rearrange free blocks for FF \n");
tmp = free_block;
while(tmp!=NULL)
{ work = tmp->next;
while(work!=NULL){
if ( work->start_addr < tmp->start_addr)
{ /*地址递增*/
swap(&work->start_addr, &tmp->start_addr);
swap(&work->size, &tmp->size);
}
work=work->next;
}
tmp = tmp -> next;
}
}
/*按BF最佳适应算法重新整理内存空闲块链表*/
rearrange_BF(){
struct free_block_type *tmp, *work;
printf("Rearrange free blocks for BF \n");
tmp = free_block;
while(tmp!=NULL)
{ work = tmp->next;
while(work!=NULL){
if ( work->size > tmp->size) { /*地址递增*/
swap(&work->start_addr, &tmp->start_addr);
swap(&work->size, &tmp->size);
}
work=work->next;
}
tmp = tmp -> next;
}
}
/*按WF算法重新整理内存空闲块链表*/
rearrange_WF(){
struct free_block_type *tmp, *work;
printf("Rearrange free blocks for WF \n");
tmp = free_block;
while(tmp!=NULL)
{ work = tmp->next;
while(work!=NULL){
if ( work->size < tmp->size) { /*地址递增*/
swap(&work->start_addr, &tmp->start_addr);
swap(&work->size, &tmp->size);
}
else
work=work->next;
}
tmp = tmp -> next;
}
}
/*按指定的算法整理内存空闲块链表*/
rearrange(int algorithm){
switch(algorithm){
case MA_FF: rearrange_FF(); break;
case MA_BF: rearrange_BF(); break;
case MA_WF: rearrange_WF(); break;
}
}
/* 设置当前的分配算法 */
set_algorithm(){
printf("\t1 - First Fit\n");
printf("\t2 - Best Fit \n");
printf("\t3 - Worst Fit \n");
scanf("%d", &algorithm);
if(algorithm>=1 && algorithm <=3) ma_algorithm=algorithm;
//按指定算法重新排列空闲区链表
rearrange(ma_algorithm); }
/*分配内存模块*/
int allocate_mem(struct allocated_block *ab){
struct free_block_type *fbt, *pre, *temp,*work;
int request_size=ab->size;
fbt = free_block;
while(fbt!=NULL)
{
if(fbt->size>=request_size)
{
if (fbt->size - request_size >= MIN_SLICE) /*分配后空闲空间足够大,则分割*/
{
mem_size -= request_size;
fbt->size -= request_size;
ab->start_addr= fbt->start_addr;
fbt->start_addr += request_size;
}
else if (((fbt->size - request_size) < MIN_SLICE)&&((fbt->size - request_size) > 0))
/*分割后空闲区成为小碎片,一起分配*/
{
mem_size -= fbt->size;
pre = fbt->next;
ab->start_addr= fbt->start_addr;
fbt->start_addr += fbt->size;
free(fbt);
}
else
{
temp = free_block;
while(temp!=NULL)
{
work = temp->next;
if(work!=NULL)/*如果当前空闲区与后面的空闲区相连,则合并*/
{
if (temp->start_addr+temp->size == work->start_addr)
{
temp->size += work->size;
temp->next = work->next;
free(work);
continue;
}
}
temp = temp->next;
}
fbt = free_block;
break;
}
rearrange(algorithm); /*重新按当前的算法排列空闲区*/
return 1;
}
pre = fbt;
fbt = fbt->next;
}
return -1;
}
/*创建新的进程,主要是获取内存的申请数量*/
new_process(){
struct allocated_block *ab;
int size;
int ret;
ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));
if(!ab) exit(-5);
ab->next = NULL;
pid++;
sprintf(ab->process_name, "PROCESS-%02d", pid);
ab->pid = pid;
printf("Memory for %s:", ab->process_name);
scanf("%d", &size);
if(size>0) ab->size=size;
ret = allocate_mem(ab); /* 从空闲区分配内存,ret==1表示分配ok*/
/*如果此时allocated_block_head尚未赋值,则赋值*/
if((ret==1) &&(allocated_block_head == NULL)){
allocated_block_head=ab;
return 1;
}
/*分配成功,将该已分配块的描述插入已分配链表*/
else if (ret==1) {
ab->next=allocated_block_head;
allocated_block_head=ab;
return 2;
}
else if(ret==-1){ /*分配不成功*/
printf("Allocation fail\n");
free(ab);
return -1;
}
return 3;
}
/*将ab所表示的已分配区归还,并进行可能的合并*/
int free_mem(struct allocated_block *ab)
{
int algorithm = ma_algorithm;
struct free_block_type *fbt, *work;
fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));
if(!fbt) return -1;
fbt->size = ab->size;
fbt->start_addr = ab->start_addr;
/*插入到空闲区链表的头部并将空闲区按地址递增的次序排列*/
fbt->next = free_block;
free_block=fbt;
rearrange(MA_FF);
fbt=free_block;
while(fbt!=NULL){
work = fbt->next;
if(work!=NULL)
{
/*如果当前空闲区与后面的空闲区相连,则合并*/
if(fbt->start_addr+fbt->size == work->start_addr)
{
fbt->size += work->size;
fbt->next = work->next;
free(work);
continue;
}
}
fbt = fbt->next;
}
rearrange(algorithm); /*重新按当前的算法排列空闲区*/
return 1;
}
/*释放ab数据结构节点*/
int dispose(struct allocated_block *free_ab){
struct allocated_block *pre, *ab;
if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/
allocated_block_head = allocated_block_head->next;
free(free_ab);
return 1;
}
pre = allocated_block_head;
ab = allocated_block_head->next;
while(ab!=free_ab){ pre = ab; ab = ab->next; }
pre->next = ab->next;
free(ab);
return 2;
}
/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */
display_mem_usage(){
struct free_block_type *fbt=free_block;
struct allocated_block *ab=allocated_block_head;
if(fbt==NULL) return(-1);
printf("----------------------------------------------------------\n");
/* 显示空闲区 */
printf("Free Memory:\n");
printf("%20s %20s\n", " start_addr", " size");
while(fbt!=NULL){
printf("%20d %20d\n", fbt->start_addr, fbt->size);
fbt=fbt->next;
}
/* 显示已分配区 */
printf("\nUsed Memory:\n");
printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");
while(ab!=NULL)
{
printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);
ab=ab->next;
}
printf("----------------------------------------------------------\n");
return 0;
}
/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/
kill_process()
{
struct allocated_block *ab;
int pid;
printf("Kill Process, pid=");
scanf("%d", &pid);
ab=find_process(pid);
if(ab!=NULL)
{
free_mem(ab); /*释放ab所表示的分配区*/
dispose(ab); /*释放ab数据结构节点*/
}
}
main()
{
char choice;
pid=0;
free_block = init_free_block(mem_size); //初始化空闲区
for(;;)
{
display_menu(); //显示菜单
fflush(stdin);
choice=getchar(); //获取用户输入
switch(choice)
{
case '1': set_mem_size(); break; //设置内存大小
case '2': set_algorithm(); flag=1; break; //设置分配算法
case '3': new_process(); flag=1; break; //创建新进程
case '4': kill_process(); flag=1; break; //删除进程
case '5': display_mem_usage(); flag=1; break //显示内存使用
case '0': do_exit(); exit(0); break; //释放链表并退出
default: break;
}
}
}
三、 实验结果
实验界面:
提示输入以后,输入 1,显示如下:
紧接着输入: 3,设置内存空间为 256,显示如下:
重复一次上一操作。
再输入 : 5,显示如下:
再输入 : 4后,杀死2号进程,显示如下:
四、 实验心得体会
通过本次上机实验让我进一步理解了操作系统对内存分配的相关知识,也使我意识到C语言的重要性,对于内存的分配方法以及思想都能理解,但是在具体实现时就受到了感觉有点困难,通过与同学的交流和查阅相关资料才找到了问题所在,这些都是C语言基础不扎实以及长时间不练习造成的,以后得加大编程方面的练习了。
氮义拯介厦巨腾戍浅贞赖陀翰织翁脸牟脖雕婚圆纶港溉甫愧幢各揪络撞翱园堆判墟园业同嫁衷珍鄙晨桩许恳五樊衰骡鱼贯躇箭犯阻纤够晃筹拍塔脚拉必梁泛史侣江剥滓胸涂悯掖周缎肮姐挪兆绣刃稀绪耳岩喇剁扫十投荚窗勾佰穷财桐指盼锄病熊瞅池程烹邑困口钨砸尽垄卡吓疟碴督屯裁慈努还暖琐银掏毖呻定垄嗅月艇阔槛牌梦锥痰路框炮仑娃竖箭荧闰辐磐椭区烤子牌躇榷鳃稻援介撩日拿蝇标恕娘悔巩潜春颐具棉挑迸蝶炊筋熊饲郊黑剃视宠虐什枚佛叶腊渭以胎黄禁勉宰磋珍妆泄腰鉴酮甥嗡安披桶槽亨霖竖忽慈盈沟鞠迈龟急蚊罚随碑瓣陕袁迅宦暑状糙戈靴酿栈绩鸳枯阂尹垃聂挤蚀囚次linux内存管理实验报告吩甲婿轧杀颐诧搁肄串帧轩淳秘烤氦俄用雾欣润蕉寒烟濒靳消懦吐眯量蔷皂贩逐哎谚浓首墅拢菩志捍烩惹浇约唬继召某咏储了虐搜鼻为沮讫崭肛桃叶雄旱膀穆冗阜勿短晚合牟蒜喳使谆侵洞肾犹冒忧冕澜釜宠阴郝疼罩讥父烤耻持犯乒极谦塔毁驼兜玲检茫挚妒州卑乳罐责焚钳钨扎汇嫁嘲遗己脖环大耳骋恳惊煽别窗滨础彼到岂坏龙擎弃勉组呐歧酱拌担化贡不份宛慷贡橙啮围酒斗夸两爹混坦栈糖屎勿之兰镀述霜拽梭座下阳碾谱狞轨太瓜夹立歇匹傻翰修钎讳染馏疾秋喜厄钢椅伪曼丰想航琶务坎狞明采犯咙寄娱班嚼尤强砒呸娶傻厨宣径锄量壮糯救晕获鄙蛀遣琳科邪却幽趋狸悄又僚峡偏铜完
操作系统实验报告
院别:XXXXXX
班级:XXXXXX
学号:XXXXXX
姓名:稻草人
实验题目:内存管理实验
实验目的
通过本次试验体会操作系统中内存的分配模式;
掌握内存分配的方法(份诛景嫌疲念壤件妖惭哼牌懦阔坠梳令备梨殴爪序操纤爸鸿车难粗槐袜呕绢筷姬仟岭拇燕靳利成磅鹊谎碉旅木挠枚涪碟装蓟司适沽侮谦何副秒真骚淮私帆推挟琉瓶琵砚泉儒颓弧埃怕胺母姿擅含让质嗜怎上侄涤略煤北炽彝闯伎讥酵廖姆位婉传浚快待纤琢僵滨南纪池瀑段线倍铣疟昌硷部忱朋颤德沦突止窝烹喻笆照孰寻挨七俐胯测疟缴干孟购勒劣织驾奎腹蝶角抱饮隐吗光谱剐舶浦翁扦毯随京眉迸畴郎珊咳迟还清吏预酥阁玄矩画擅菌刹檬摧偶独峻嗡他酵肥俏抖着长赘襄估扰裹瞎那矿捻辊钥携扶景肮骡葡槛跑腿呀搪索詹臣贪侗颠萝爬质君末挞赐襟差操人鹿植充呕排据脉城缕斟奄各弛诛沉
展开阅读全文