操作系统 实验报告 全.docx
- 文档编号:7179599
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:13
- 大小:18.36KB
操作系统 实验报告 全.docx
《操作系统 实验报告 全.docx》由会员分享,可在线阅读,更多相关《操作系统 实验报告 全.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验报告全
河南省高等教育自学考试
实验报告册
计算机及应用专业(本科段)
《操作系统》
姓名准考证号所属地市
实验地点实验日期
实验总成绩指导教师签名
实验单位(实验室)意见:
主考院校审核意见:
河南科技大学自学考试办公室
二零一零年三月
实验一单处理器系统的进程调度模拟
#include"stdio.h"
#definerunning1/*用running表示进程处于运行态*/
#defineaready2/*用aready表示进程处于就绪态*/
#defineblocking3/*用blocking表示进程处于等待态*/
#definesometime5/*用sometime表示时间片大小*/
#definen10/*假定系统允许进程个数为10*/
struct
{
intname;/*进程标识符*/
intstatus;/*进程状态*/
intax,bx,cx,dx;/*进程现场信息,通用寄存器内容*/
intpc;/*进程现场信息,程序计数器内容*/
intpsw;/*进程现场信息,程序状态字寄存器内容*/
intnext;/*下一个进程控制块的位置*/
}pcbarea[n];/*定义模拟进程控制块区域的数组*/
intPSW,AX,BX,CX,DX,PC,TIME;/*模拟寄存器*/
intrun;/*定义指向正在运行进程的进程控制块的指针*/
struct
{
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;
return0;
}/*进程调度函数结束*/
create(intx)
/*创建进程*/
{
inti;
if(pfree==-1)/*空闲进程控制块队列为空*/
{
printf("无空闲进程控制块,进程创建失败\n");
return0;
}
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;
ready.tail=i;
pcbarea[ready.tail].next=-1;
}
}/*进程创建函数结束*/
main()
{
/*系统初始化*/
intnum,j;
run=ready.head=ready.tail=block=-1;
pfree=0;
for(j=0;j pcbarea[j].next=j+1; pcbarea[n-1].next=-1; printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程): \n"); scanf("%d",&num); while(num>0) { create(num); scanf("%d",&num); } sheduling(); if(run! =-1) { printf("进程名进程状态寄存器内容: axbxcxdxpcpsw: \n"); printf("%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); } return0; }/*main()结束*/ 实验二可变分区管理方式的主存分配回收模拟 一、实验目的 深入了解动态分区存储管理方式主存分配回收的实现。 //动态分区存储管理方式的主存分配回收 #include #include #include #include #include #definen10//假定系统允许的最大作业为,假定模拟实验中n值为10 #definem10//假定系统允许的空闲区表最大为m,假定模拟实验中m值为10 #defineminisize100 ofstreamout("output.txt"); typedefstruct { floataddress;//已分分区起始地址 floatlength;//已分分区长度,单位为字节 intflag;//已分配区表登记栏标志,用"0"表示空栏目,实验中只支持一个字符的作业名 }used;//已分配区表 usedused_table[n]; typedefstruct { floataddress;//空闲区起始地址 floatlength;//空闲区长度,单位为字节 intflag;//空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配 }freed;//空闲区表 freedfree_table[m]; //采用最优分配算法分配xk大小的空间 voidallocate(charJ,floatxk) { inti,k; floatad; k=-1; for(i=0;i if(free_table[i].length>=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length k=i; if(k==-1)//未找到可用空闲区,返回 { cout<<"无可用空闲区"< 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&&i //无表目填写已分分区 if(i>=n) { cout<<"已分配区表长度不足,分配失败,出错"< //修正空闲区表 if(free_table[k].flag==0) free_table[k].flag=1; //前面找到的是某个空闲分区的一部分 else { free_table[k].length=free_table[k].length+xk; return; } } //修改已分配表 else { used_table[i].address=ad; used_table[i].length=xk; used_table[i].flag=J; } return; } //回收作业名为J的作业所占主存空间 voidreclaim(charJ) { inti,k,j,s,t; floatS,L; //寻找已分配表中对应登记项 s=0; while((used_table[s].flag! =J||used_table[s].flag==0)&&s s++; //在已分配表中找不到名字为J的作业 if(s>=n) { cout<<"未找到作业,回收失败"< return; } //修改已分配表 used_table[s].flag=0; //取得归还分区的起始地址S和长度L S=used_table[s].address; L=used_table[s].length; j=-1; k=-1; //寻找回收分区的空闲上下邻,上邻表目k,下邻表目j i=0; while(i { 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! =-1) 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; else if(j! =-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 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; } return; } //主函数 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; //已分配表初始化 for(i=0;i used_table[i].flag=0; while (1) { cout<<"请输入演示功能项: "< cout<<"================================="< cout<<"0.退出"< cout<<"1.分配主存"< cout<<"2.回收主存"< cout<<"3.显示主存"< cout<<"================================="< cout<<"请输入(0-3): "< cin>>j; cout< cout< switch(j) { case0: exit(0); case1: cout<<"输入作业名s(注意: 只能是一个字符): "< cin>>s; cout< cout<<"作业所需长度xk: "< cin>>xk; cout< allocate(s,xk); break; case2: cout<<"输入要回收分区的作业名(注意: 只能是一个字符)"< cin>>s; cout< reclaim(s); break; case3: cout<<"输出空闲区表: \n起始地址分区长度标志\n"; for(i=0;i cout< cout<<"输出已分配区表: \n起始地址分区长度标志\n"; for(i=0;i if(used_table[i].flag! =0) cout< else cout< break; default: cout<<"没有该选项"< }//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("D: /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 while((c=reader2.read())! =-1){ list.add(c); } for(inti=list.size()-1;i>=0;--i){ writer2.write(list.get(i)); } writer2.close(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验报告 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)