操作系统 实验报告 全Word格式文档下载.docx

上传人:b****5 文档编号:20279592 上传时间:2023-01-21 格式:DOCX 页数:13 大小:18.36KB
下载 相关 举报
操作系统 实验报告 全Word格式文档下载.docx_第1页
第1页 / 共13页
操作系统 实验报告 全Word格式文档下载.docx_第2页
第2页 / 共13页
操作系统 实验报告 全Word格式文档下载.docx_第3页
第3页 / 共13页
操作系统 实验报告 全Word格式文档下载.docx_第4页
第4页 / 共13页
操作系统 实验报告 全Word格式文档下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

操作系统 实验报告 全Word格式文档下载.docx

《操作系统 实验报告 全Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统 实验报告 全Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。

操作系统 实验报告 全Word格式文档下载.docx

/*模拟寄存器*/

intrun;

/*定义指向正在运行进程的进程控制块的指针*/

inthead;

inttail;

}ready;

/*定义指向就绪队列的头指针head和尾指针tail*/

intblock;

/*定义指向等待队列的指针*/

intpfree;

/*定义指向空闲进程控制块队列的指针*/

sheduling()

/*进程调度函数*/

inti;

if(ready.head==-1)/*空闲进程控制块队列为空,退出*/

{

printf("

无就绪进程\n"

);

return0;

}

i=ready.head;

/*就绪队列头指针赋给i*/

ready.head=pcbarea[ready.head].next;

/*就绪队列头指针后移*/

if(ready.head==-1)ready.tail=-1;

/*就绪队列为空,修正尾指针ready.tail*/

pcbarea[i].status=running;

/*修改进程控制块状态*/

TIME=sometime;

/*设置相对时钟寄存器*/

/*恢复该进程现场信息:

*/

AX=pcbarea[run].ax;

BX=pcbarea[run].bx;

CX=pcbarea[run].cx;

DX=pcbarea[run].dx;

PC=pcbarea[run].pc;

PSW=pcbarea[run].psw;

/*修改指向运行进程的指针*/

run=i;

}/*进程调度函数结束*/

create(intx)

/*创建进程*/

if(pfree==-1)/*空闲进程控制块队列为空*/

无空闲进程控制块,进程创建失败\n"

i=pfree;

/*取空闲进程控制块队列的第一个*/

pfree=pcbarea[pfree].next;

/*pfree后移*/

/*填写该进程控制块内容:

pcbarea[i].name=x;

pcbarea[i].status=aready;

pcbarea[i].ax=x;

pcbarea[i].bx=x;

pcbarea[i].cx=x;

pcbarea[i].dx=x;

pcbarea[i].pc=x;

pcbarea[i].psw=x;

if(ready.head!

=-1)

/*就绪队列不空时,挂入就绪队列方式*/

pcbarea[ready.tail].next=i;

ready.tail=i;

pcbarea[ready.tail].next=-1;

else

/*就绪队列空时,挂入就绪队列方式:

ready.head=i;

}/*进程创建函数结束*/

main()

/*系统初始化*/

intnum,j;

run=ready.head=ready.tail=block=-1;

pfree=0;

for(j=0;

j<

n-1;

j++)

pcbarea[j].next=j+1;

pcbarea[n-1].next=-1;

输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程):

\n"

scanf("

%d"

&

num);

while(num>

0)

create(num);

sheduling();

if(run!

进程名进程状态寄存器内容:

axbxcxdxpcpsw:

%4d%10d%14d%3d%3d%3d%3d%3d\n"

pcbarea[run].name,

pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,pcbarea[run].cx,

pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw);

}/*main()结束*/

实验二可变分区管理方式的主存分配回收模拟

一、实验目的

深入了解动态分区存储管理方式主存分配回收的实现。

//动态分区存储管理方式的主存分配回收

#include<

fstream.h>

iostream.h>

iomanip.h>

string.h>

process.h>

#definen10//假定系统允许的最大作业为,假定模拟实验中n值为10

#definem10//假定系统允许的空闲区表最大为m,假定模拟实验中m值为10

#defineminisize100

ofstreamout("

output.txt"

typedefstruct

floataddress;

//已分分区起始地址

floatlength;

//已分分区长度,单位为字节

intflag;

//已分配区表登记栏标志,用"

0"

表示空栏目,实验中只支持一个字符的作业名

}used;

//已分配区表

usedused_table[n];

//空闲区起始地址

//空闲区长度,单位为字节

//空闲区表登记栏标志,用"

表示空栏目,用"

1"

表示未分配

}freed;

//空闲区表

freedfree_table[m];

//采用最优分配算法分配xk大小的空间

voidallocate(charJ,floatxk)

inti,k;

floatad;

k=-1;

for(i=0;

i<

m;

i++)//寻找空间大于xk的最小空闲区登记项k

if(free_table[i].length>

=xk&

&

free_table[i].flag==1)

if(k==-1||free_table[i].length<

free_table[k].length)

k=i;

if(k==-1)//未找到可用空闲区,返回

cout<

<

"

无可用空闲区"

endl;

return;

}

//找到可用空闲区,开始分配:

若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;

若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配

if(free_table[k].length-xk<

=minisize)

free_table[k].flag=0;

ad=free_table[k].address;

xk=free_table[k].length;

else

free_table[k].length=free_table[k].length-xk;

ad=free_table[k].address+free_table[k].length;

//修改已分配区表

i=0;

//寻找空表目

while(used_table[i].flag!

=0&

n)i++;

//无表目填写已分分区

if(i>

=n)

已分配区表长度不足,分配失败,出错"

//修正空闲区表

if(free_table[k].flag==0)

free_table[k].flag=1;

//前面找到的是某个空闲分区的一部分

free_table[k].length=free_table[k].length+xk;

//修改已分配表

used_table[i].address=ad;

used_table[i].length=xk;

used_table[i].flag=J;

//回收作业名为J的作业所占主存空间

voidreclaim(charJ)

inti,k,j,s,t;

floatS,L;

//寻找已分配表中对应登记项

s=0;

while((used_table[s].flag!

=J||used_table[s].flag==0)&

s<

n)

s++;

//在已分配表中找不到名字为J的作业

if(s>

=n)

未找到作业,回收失败"

used_table[s].flag=0;

//取得归还分区的起始地址S和长度L

S=used_table[s].address;

L=used_table[s].length;

j=-1;

//寻找回收分区的空闲上下邻,上邻表目k,下邻表目j

while(i<

m&

(j==-1||k==-1))

if(free_table[i].flag==1)

if(free_table[i].address+free_table[i].length==S)k=i;

//找到上邻

if(free_table[i].address==S+L)j=i;

//找到下邻

i++;

if(k!

if(j!

=-1)//上邻空闲区,下邻空闲区,三项合并

free_table[k].length=free_table[j].length+free_table[k].length+L;

free_table[j].flag=0;

else//上邻空闲区,下邻非空闲区,与上邻合并

free_table[k].length=free_table[k].length+L;

=-1)//上邻非空闲区,下邻为空闲区,与下邻合并

free_table[j].address=S;

free_table[j].length=free_table[j].length+L;

else//上下邻均为非空闲区,回收区域直接填入

{//在空闲区表中寻找空栏目

t=0;

while(free_table[t].flag==1&

t<

m)

t++;

if(t>

=m)//空闲区表满,回收空间失败,将已分配表复原

cout<

主存空闲表没有空间,回收空间失败"

used_table[s].flag=J;

return;

free_table[t].address=S;

free_table[t].length=L;

free_table[t].flag=1;

//主函数

voidmain()

inti,j;

floatxk;

chars;

ifstreamin("

input.txt"

//空闲分区表初始化

free_table[0].address=10240;

free_table[0].length=102400;

free_table[0].flag=1;

for(i=1;

i++)

free_table[i].flag=0;

//已分配表初始化

n;

used_table[i].flag=0;

while

(1)

请输入演示功能项:

"

================================="

endl<

0.退出"

1.分配主存"

2.回收主存"

3.显示主存"

请输入(0-3):

cin>

>

j;

switch(j)

case0:

exit(0);

case1:

输入作业名s(注意:

只能是一个字符):

cin>

s;

作业所需长度xk:

xk;

xk<

allocate(s,xk);

break;

case2:

输入要回收分区的作业名(注意:

只能是一个字符)"

reclaim(s);

case3:

输出空闲区表:

\n起始地址分区长度标志\n"

;

for(i=0;

setw(6)<

free_table[i].address<

setw(9)<

free_table[i].length<

free_table[i].flag<

输出已分配区表:

if(used_table[i].flag!

=0)

used_table[i].address<

used_table[i].length<

char(used_table[i].flag)<

used_table[i].flag<

default:

没有该选项"

}//case

}//while

}//主函数结束

实验三文件操作模拟

读取file1的内容以行为单位倒置输出到file2中(改进)

这两个加一起是一个的答案

importjava.io.File;

importjava.io.FileReader;

importjava.io.FileWriter;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.util.ArrayList;

publicclassTest

publicstaticvoidmain(String[]args)throwsIOException

Filefile1=newFile("

D:

/f1.txt"

Filefile2=newFile("

/f2.txt"

intc;

InputStreaminput1=System.in;

InputStreamReaderreader1=newInputStreamReader(input1);

FileWriterwriter1=newFileWriter(file1);

while((c=reader1.read())!

=-1){

writer1.write(c);

}

writer1.close();

FileReaderreader2=newFileReader(file1);

FileWriterwriter2=newFileWriter(file2);

ArrayList<

Integer>

list=newArrayList<

();

while((c=reader2.read())!

list.add(c);

for(inti=list.size()-1;

i>

=0;

--i){

writer2.write(list.get(i));

writer2.close();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1