操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(70页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
实验一项目名称:
熟悉使用计算机系统
1、实验题目
要求确定两组初值,运行设计的程序,显示或打印每一组的A和AT。
编制一个程序,求
1010矩阵A的转置矩阵AT,即
二、流程图
3、源程序代码
#include
intmain(){
intarray[10][10],array[10][10];
inti,j;//输入矩阵
printf("Transposedbefore\n");
for(i=0;i<10;i++){
for(j=0;j<10;j++){
scanf("%d",&a[i][j]);//scanf可以替换成相应的随机函数
}
}
//转置矩阵
printf("*************************************\n");
for(i=0;i<10;i++)
for(j=0;j<10;j++){
array[j][i]=a[i][j];
}
//输出转置后的矩阵
printf("Transposedafter\n");
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%d",array[i][j]);
}
printf("\n");
}
system("pause");
return0;
}
4、实验结果截图
A矩阵:
AT矩阵:
二者进行转置后结果为:
5、实验总结
这次是操作系统第一次上机实验,所以主要是熟悉使用计算机系统,然后编一个转置矩阵,可以用c语言,也可以用c++等语言编程。
本实验用c语言编,让我重新温习到了所学的知识,虽然过程中有很多不懂,但经过询问同学以及查阅相关书籍,理清了编程思路,画出流程图,终于完成了本实验内容,一个10*10的矩阵的转置。
从这次实验中,我知道了光弄懂书本的内容是远远不够的,还得用实践证明,从实践中学习到更多的知识,巩固更多的理论知识。
实验二项目名称:
处理器调度
一、实验题目
设计一个按优先数调度算法实现处理器调度的程序。
[提示]:
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。
五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。
用一单元指出队首进程,用指针指出队列的连接情况。
二、程序中使用的数据结构及符号说明:
#definenum5//假定系统中进程个数为5
structPCB{
charID;//进程名
intruntime;//要求运行时间
intpri;//优先数
charstate;//状态,R-就绪,F-结束
};
structPCBpcblist[num];//定义进程控制块数组
三、流程图:
(1)主程序流程图:
(2)子程序init()流程图:
(3)子程序max_pri_process()流程图:
(4)子程序show()流程图:
(5)子程序run()流程图:
4、源程序代码
#include"stdio.h"
#include"string.h"
#definenum5//假定系统中进程个数为5
structPCB{
charID;//进程名
intruntime;//要求运行时间
intpri;//优先数
charstate;//状态,R-就绪,F-结束
};
structPCBpcblist[num];//定义进程控制块数组
voidinit(){//PCB初始化子程序
inti;
for(i=0;iprintf("PCB[%d]:
IDpriruntime\n",i+1);//为每个进程任意指定pri和runtime
scanf("%s%d%d",&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime);
pcblist[i].state='R';//进程初始状态均为就绪
getchar();//接收回车符
}
}
intmax_pri_process(){//确定最大优先级进程子程序
intmax=-100;//max为最大优先数,初始化为-100
inti;
intkey;
for(i=0;i{if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行
return-1;//返回-1
else
if(max{
max=pcblist[i].pri;//max存放每次循环中的最大优先数
key=i;//将进程号赋给key
}
}
if(pcblist[key].state=='F')//具有最大优先数的进程若已运行完毕
return-1;//则返回-1
else//否则
returnkey;//将key作为返回值返回
}
voidshow()//显示子程序
{inti;
printf("\nIDpriruntimestate\n");
printf("-------------------------------------------------\n");
for(i=0;iprintf("%s%6d%8d%s\n",&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state);
}
printf("pressanykeytocontinue...\n");
}
voidrun(){//进程运行子程序
inti,j;
intt=0;//t为运行次数
for(j=0;jt+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和
printf("\nbeforerun,theconditonis:
\n");
show();//调用show()子程序显示运行前PCB的情况
getchar();//等待输入回车符
for(j=0;jwhile(max_pri_process()!
=-1)//具有最大优先数的进程没有运行完,让其运行
{
pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行
}
for(i=0;iif(pcblist[i].state=='r'){
pcblist[i].pri-=1;//将当前运行进程的优先数减1
pcblist[i].runtime--;{//要求运行时间减1
if(pcblist[i].runtime==0)
pcblist[i].state='F';//运行完则将该进程状态置为结束
else
pcblist[i].state='R';//未运行完将其状态置为就绪
}
show();//显示每次运行后各PCB的情况
getchar();//等待回车进入下一次运行
}
}
}
}
voidmain(){//按动态优先数调度主程序
init();//初始化各个进程PCB
run();//进程调度模拟
}
5、实验结果截图
6、实验总结
这次是操作系统第二次上机实验,主要是选择一个调度算法,实现处理器调度,可以用c语言,也可以用c++等语言编程。
本实验用c++编,让我重新温习到了所学的知识,虽然过程中有很多不懂,但经过询问同学以及查阅相关书籍,理清了编程思路,画出流程图,终于完成了本实验内容,一个按优先数调度算法实现处理器调度的程序。
从这次实验中,我知道了光弄懂书本的内容是远远不够的,还得用实践证明,从实践中学习到更多的知识,巩固更多的理论知识。
实验三项目名称:
模拟批处理多道操作系统的作业调度。
1、
采用先来先服务算法和运行时间最短者优先算法模拟设计作业调度程序。
[提示]:
(1)作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。
作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。
但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。
先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。
运行时间最短者优先算法总是按作业要求运行的时间来选择作业,每次挑选要求运行时间短且资源要求能满足的作业先进入主存执行。
(2)为了表示暂存在输入井中的各个作业的情况(作业信息在输入井中的位置、作业的资源要求等),常常采用二级目录结构:
作业表和预输入表。
二、程序中使用的数据结构及符号说明:
设计一个结构体数组
typedefstructwork{
charusername[10];//用户名
charworkname[10];//作业名
floattime;//作业运行时间
charstate;//状态R为收容,A表示执行状态,T为完成
intstore;//主存
inttape;//磁带
}WORK;
WORKw[N];//工作数组
初始化操作
printf("初始化:
\n");
for(i=0;iprintf("--请输入第%d个作业的信息--\n",i+1);
printf("第%d个作业:
用户名:
",i+1);
scanf("%s",w[i].username);
printf("第%d个作业:
作业名:
",i+1);
scanf("%s",w[i].workname);
printf("第%d个作业:
运行时间:
",i+1);
scanf("%f",&w[i].time);
printf("第%d个作业:
状态:
",i+1);
scanf("%s",&w[i].state);
printf("第%d个作业:
主存:
",i+1);
scanf("%d",&w[i].store);
printf("第%d个作业:
磁带:
",i+1);
scanf("%d",&w[i].tape);
}
3、源程序代码
#include
#include
#include
#include
#defineN5//作业数
#defineT5//资源数
#defineS100//主存大小
typedefstructwork{
charusername[10];//用户名
charworkname[10];//作业名
floattime;//作业运行时间
charstate;//状态R为收容,Z表示执行状态,W为完成
intstore;//主存
inttape;//磁带
}WORK;
intSJF();//运行时间最短者优先算法
intFCFS();//先来先服务
intchoiceWork();//选择一个"收容状态",资源能满足的作业
voidAdminister();//执行程序
intt=T;//m为系统中剩余的磁带资源量
ints=S;//s为主存剩余大小
WORKw[N];//工作数组
voidmain(){
inti;
printf("初始化:
\n");
for(i=0;iprintf("--请输入第%d个作业的信息--\n",i+1);
printf("第%d个作业:
用户名:
",i+1);
scanf("%s",w[i].username);
printf("第%d个作业:
作业名:
",i+1);
scanf("%s",w[i].workname);
printf("第%d个作业:
运行时间:
",i+1);
scanf("%f",&w[i].time);
printf("第%d个作业:
状态:
",i+1);
scanf("%s",&w[i].state);
printf("第%d个作业:
主存:
",i+1);
scanf("%d",&w[i].store);
printf("第%d个作业:
磁带:
",i+1);
scanf("%d",&w[i].tape);
}
Administer();//执行程序
}
voidAdminister(){//执行程序
inti,j,f;
intn=0;//主存中的作业数
for(i=0;iif(w[i].state=='Z'){
t=t-w[i].tape;
s=s-w[i].store;
n++;
}
if(s<0||t<0||n>2){
printf("初始化失败,退出系统\n");
return;
}
charworkname[10];
charusername[10];
for(;;){
floatp;
intk;
intq;
charb;
getchar();
time_tt;
srand((unsigned)time(&t));
printf("电脑随机数是:
\n");
for(k=0;k<1;k++)
q=rand()%10;
p=q*0.1;
printf("%f\n",p);
if(p>0.5){
printf("随机数大于0.5,转入作业表\n");
}
else{
printf("随机数不大于0.5,转入主存\n");
}
printf("继续(N)、返回(B)、显示当前著作业状态(D)还是退出系统(Q):
");
scanf("%s",&b);
if(b=='N'){
if(p>0.5&&p<=1){
f=0;
for(i=0;iif(w[i].state=='R')
f=1;
if(f==1){//主存中尚有未被选中的作业
if(t>0&&s>0){//主存中还能装入作业
j=choiceWork();
if(j<0){//没选到
printf("等待作业执行结束归还资源.\n");
continue;
}
else{//为作业分配资源
t=t-w[j].tape;
s=s-w[j].store;
w[j].state='Z';
n++;
if(n>2){
t=t+w[j].tape;
s=s+w[j].store;
w[j].state='R';
n++;
printf("主存无法正常运行,返回.\n");
continue;
}
printf("--显示被调入主存的作业的用户名和作业名--\n");
printf("%s%s\n",w[j].username,w[j].workname);
continue;
}
}
else{
printf("主存中作业满载.\n");
continue;
}
}
else{
printf("请操作员输入作业.\n");
}
}
else{
if(n==2){
floath=0;
floatl=100;
intH=-1;
intL=-1;
for(i=0;iif(w[i].state=='Z'&&w[i].time>h){
h=w[i].time;
H=i;
}
elseif(w[i].state=='Z'&&w[i].timeH=w[i].time;
L=i;
}
if(H>L){
for(i=0;iif(w[i].state=='Z'){
printf("作业%s正在执行.\n",w[i].workname);
printf("输入用户名(该作业结束):
",i);
scanf("%s",username);
printf("输入作业名(该作业结束):
",i);
scanf("%s",workname);
}
for(i=0;iif(strcmp(workname,w[i].workname)==0){
w[i].state='W';
s+=w[i].store;
t+=w[i].tape;
n=0;
break;
}
}
else{
for(i=N-1;i>-1;i--)
if(w[i].state=='Z'){
printf("作业%s正在执行.\n",w[i].workname);
printf("输入用户名(该作业结束):
",i);
scanf("%s",username);
printf("输入作业名(该作业结束):
",i);
scanf("%s",workname);
}
for(i=N-1;i>-1;i--)
if(strcmp(workname,w[i].workname)==0){
w[i].state='W';
s+=w[i].store;
t+=w[i].tape;
n=0;
break;
}
}
continue;
}
elseif(n==1){
for(i=0;iif(w[i].state=='Z'){
printf("作业%s正在执行.\n",w[i].workname);
printf("输入用户名(该作业结束):
",i);
scanf("%s",username);
printf("输入作业名(该作业结束):
",i);
scanf("%s",workname);
}
for(i=0;iif(strcmp(workname,w[i].workname)==0){
w[i].state='W';
s+=w[i].store;
t+=w[i].tape;
n=0;
break;
}
continue;
}
else{
printf("主存中没有作业.\n");
continue;
}
}
}
if(b=='B'){
printf("返回重新随即.\n");
continue;
}
if(b=='Q'){
break;
}
if(b=='D'){
printf("--显示众作业当前的信息--\n",i+1);
printf("用户名\t作业名\t运行时间\t状态\t主存\t磁带\n");
for(i=0;i}
}
}
}
intchoiceWork()//选择一个"收容状态",资源能满足的作业
{
inti;
charc;
getchar();
printf("用先来先服务算法,或者用运行时间最短者优先算法ForS:
");
scanf("%c",&c);
switch(c)
{
case'F':
i=FCFS();break;
case'S':
i=SJF();break;
}
returni;
}
intFCFS()//先来先服务
{
inti;
for(i=0;iif(w[i].state=='R'&&w[i].store<=s&&w[i].tape<=t)
break;
if(i>=0&&ireturni;
else
return-1;
}
intSJF()//运行时间最短者优先算法
{
inti,j=-1;
floatk=100;//100为任意给的值,可以换任意的大于最长作业时间的数
for(i=0;iif(w[i].state=='R'&&w[i].store<=s&&w[i].tape<=t&&w[i].time{
k=