大连理工大学操作系统实验报告.docx
《大连理工大学操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《大连理工大学操作系统实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
大连理工大学操作系统实验报告
大连理工大学
本科实验报告
课程名称:
操作系统实验
学院(系):
计算机科学与技术学院
专业:
计算机科学与技术
班级:
电计
学号:
学生姓名:
年月日
实验项目列表
序号
实验项目名称
学时
成绩
指导教师
预习
操作
结果
1
进程管理
2
存储管理
3
磁盘移臂调度
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
总计
学分:
大连理工大学实验报告
学院(系):
计算机科学与技术学院专业:
计算机科学与技术班级:
电计1301
姓名:
学号:
组:
___
实验时间:
2016.6.3实验室:
综412实验台:
指导教师签字:
成绩:
进程管理实验
一、实验目的
加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。
二、实验原理和内容
原理:
(1)fork成功创建子进程后将返回子进程的进程号,不成功会返回-1
(2)exec系统调用有一组6个函数,其中示例实验中引用了execve系统调用语法:
#include
intexecve(constchar*path,constchar*argv[],constchar*envp[]);
path要装入的新的执行文件的绝对路径名字符串.
argv[]要传递给新执行程序的完整的命令参数列表(可以为空).
envp[]要传递给新执行程序的完整的环境变量参数列表(可以为空).Exec执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。
exec调用失败,它会返回-1。
内容:
(1)每个进程都执行自己独立的程序,打印自己的pid,每个父进程打印其子进程的pid;
(2)
每个进程都执行自己独立的程序,打印自己的pid,父进程打印其子进程的pid;
(3)编写一个命令处理程序,能处理max(m,n),min(m,n)和average(m,n,l)这几个命令。
(使用exec函数族)
三实验代码及结果
(1)
#include
#include
intmain()
{
if(fork()==0)
{
printf("子进程的pid为:
%d.\n",getpid());
if(fork()==0)
{
printf("二级子进程的pid为:
%d.\n",getpid());
}
}
else
{
printf("父进程的pid为%d.\n",getpid());
}
return0;
}
运行结果:
(2)
#include
#include
intmain()
{
if(fork()==0)
{
printf("子进程的pid为%d.\n",getpid());
}
else
{
if(fork()==0)
{
printf("子进程2的pid%d.\n",getpid());
}
else
{
printf("父进程的pid为%d.\n\n",getpid());
}
}
return0;
}
(3)
调用函数为:
include
#include
#include
#defineN10
intmain()
{
inti;
charcmdname[N];
printf("$");
scanf("%s",cmdname);
if(strcmp(cmdname,"min")==0)
{
execl("/home/lenovo/min","min",NULL);
}
elseif(strcmp(cmdname,"max")==0)
{
execl("/home/lenovo/max","max",NULL);
}
elseif(strcmp(cmdname,"ave")==0)
{
execl("/home/lenovo/average","ave",NULL);
}
else
printf("´íÎó!
\n");
return0;
}
Max函数为:
#include
#include
#include
intmain()
{
inta,b;
printf("请输入要比较的两个数:
\n");
scanf("%d%d",&a,&b);
printf("大的数是:
%d\n",a>b?
a:
b);
}
Min函数为:
#include
#include
#include
intmain()
{
inta,b;
printf("请输入要比较的两个数:
\n");
scanf("%d%d",&a,&b);
printf("小的数是:
%d\n",a
a:
b);
}
Average函数为:
#include
#include
#include
intmain()
{
floata,b,c;
printf("请输入要求平均值的两个数:
\n");
scanf("%f%f%f",&a,&b,&c);
printf("平均值为:
%.3f\n",(a+b+c)/3);
}
实验结果为:
(此处文字打错,实际输入三个数)
四实验总结
本次实验熟悉了用cygwin软件模拟linux系统的编译环境,熟悉了编译语句gcc1.c–o1和执行语句./1.exe的使用。
并且编程实现了fork成功创建子进程及父子进程间的关系,比如else则代表父进程,比如二级子进程的建立方法。
大连理工大学实验报告
学院(系):
计算机科学与技术学院专业:
计算机科学与技术班级:
电计1301
姓名:
学号:
组:
___
实验时间:
2016.6.3实验室:
综412实验台:
指导教师签字:
成绩:
存储管理实验
一实验目的
加深对于存储管理的了解,掌握虚拟存储器的实现原理;观察和了解重要的页面置换算法和置换过程。
练习模拟算法的编程技巧,锻炼分析试验数据的能力。
二实验内容
1.示例实验程序中模拟两种置换算法:
LRU算法和FIFO算法。
2.能对两种算法给定任意序列不同的页面引用串和任意页面实内存数目的组合测试,显示页置换的过程。
3.能统计和报告不同置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。
三实验代码及结果
#include
#include
#include
inta[100],b[100];//执行页号序列、主存中的队列
intlen;//序列长度
intn;//引用页面号的个数0~n-1
intm;//内存中可容纳页面数目
intno;//缺页次数
floatqyl;//缺页率
intfront,rear;
intcheck(intx)//检查队列中是否有该页号
{
intj;
for(j=front;j<=rear;j++)
{
if(b[j]==x)return1;
}
return0;
}
intfind(inti)//寻找队列中最近最少使用的页号,仅lrU算法使用该函数
{
intj,k,small=100,x,count=0;
intflag[100];//标记这个数是否在最近使用的m个数中
memset(flag,0,sizeof(flag));
for(k=i-1;k>=0;k--)
{
if(flag[a[k]]==0)
{
flag[a[k]]=1;
count++;
if(count==m)
{
for(j=front;j<=rear;j++)
{
if(b[j]==a[k])returnj;
}
}
}
}
returnx;
}
voidFIFO()//先进先出算法
{
inti,j;
front=rear=0;
no=0;
b[front]=a[0];
printf("%d无淘汰缺页加1\n",b[front]);
no+=1;
for(i=1;i{
if((rear-front+1){
if(check(a[i])==0)//检测到队列中没有该页号
{
b[++rear]=a[i];
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("无淘汰缺页加1\n");
no+=1;
}
elseif(check(a[i])==1)//检测到队列中有该页号
{
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("无淘汰不缺页\n");
}
}
elseif((rear-front+1)==m)//内存页数已满
{
if(check(a[i])==0)//检测到队列中没有该页号
{
b[++rear]=a[i];
front+=1;
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("淘汰页号%d缺页加1\n",b[front-1]);
no+=1;
}
elseif(check(a[i])==1)//检测到队列中有该页号
{
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("无淘汰不缺页\n");
}
}
}
qyl=(float)no/(float)len;
printf("序列长度:
%d缺页次数:
%d缺页率:
%.2f\n",len,no,qyl);
}
voidLRU()//最近最少使用算法
{
inti,j,temp;
front=rear=0;
no=0;
b[front]=a[0];
printf("%d无淘汰缺页加1\n",b[front]);
no+=1;
for(i=1;i{
if((rear-front+1){
if(check(a[i])==0)//检测到队列中没有该页号
{
b[++rear]=a[i];
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("无淘汰缺页加1\n");
no+=1;
}
else//检测到队列中有该页号
{
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("无淘汰不缺页\n");
}
}
elseif((rear-front+1)==m)//内存页数已满,置换策略与FIFO不同
{
if(check(a[i])==0)//检测到队列中没有该页号
{
temp=b[find(i)];
b[find(i)]=a[i];//替换掉最近最少使用的页号
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("淘汰页号%d缺页加1\n",temp);
no+=1;
}
elseif(check(a[i])==1)//检测到队列中有该页号
{
for(j=front;j<=rear;j++)
printf("%d",b[j]);
printf("无淘汰不缺页\n");
}
}
}
qyl=(float)no/(float)len;
printf("序列长度:
%d缺页次数:
%d缺页率:
%.2f\n",len,no,qyl);
}
intmain()
{
inti,choice;
printf("请输入序列长度、页号个数、页面实内存数目:
\n");
scanf("%d%d%d",&len,&n,&m);
//for(i=0;iprintf("随机生成页面引用串:
");
srand((unsigned)time(NULL));//这个就是生成了一个种子
for(i=0;i{
a[i]=rand()%n;//通过rand()%n来生成一个0~n-1的随机数,并将它赋给a[i]
printf("%d",a[i]);
}
printf("\n请选择要使用的算法:
1FIFO2LRU\n");
scanf("%d",&choice);
printf("\n\n");
if(choice==1)FIFO();
elseif(choice==2)LRU();
}
实验结果:
如图,选择FIFO算法序列长度为12,可选页号个数为10个(即随机生成0~9的页号),内存页数为4。
页面置换过程如图,缺页11次,缺页率为0.92。
如图,选择LRU算法,序列长度为12,可选页号个数为10个(即随机生成0~9的页号),内存页数为4。
页面置换过程如图,缺页9次,缺页率为0.75。
四实验总结
本次实验用C语言编程,确定序列长度、页号范围、内存中页面数目,随机生成页号序列。
可分别选择两种算法来算出置换过程及缺页情况。
本次实验使我深入的理解了FIFO算法和LRU算法的置换过程,并且通过比较发现,在大多数情况下LRU算法都具备更低的缺页率。
大连理工大学实验报告
学院(系):
计算机科学与技术学院专业:
计算机科学与技术班级:
电计1301
姓名:
学号:
组:
___
实验时间:
2016.6.3实验室:
综412实验台:
指导教师签字:
成绩:
存储管理实验
一实验目的
加深对于操作系统设备管理技术的了解,体验磁盘移臂调度算法的重要性;掌握几种重要的磁盘移臂调度算法,练习模拟算法的编程技巧,锻炼研究分析试验数据的能力。
二实验内容
1.示例实验程序中模拟两种磁盘移臂调度算法:
SSTF算法和SCAN算法
2.能对两种算法给定任意序列不同的磁盘请求序列,显示响应磁盘请求的过程。
3.能统计和报告不同算法情况下响应请求的顺序、移臂的总量。
三实验代码及结果
#include
#include
intcidao[20];//要被访问的磁道序列
intbiaoji[20];//标记是否访问过
intn,sum;//要访问的磁道个数,疑臂总量
voidSSTF()
{
inti,j,k,min,now=100;//now为当前磁头所在磁道位置
sum=0;
printf("使用SSTF算法处理:
\n");
for(i=0;i{
min=200;//min的最大值可能是0~199,必须设为200
for(j=0;j{
if(abs(cidao[j]-now){
min=abs(cidao[j]-now);
k=j;
}
}
biaoji[k]=1;
sum+=abs(cidao[k]-now);
printf("访问:
%d移动距离:
%d\n",cidao[k],abs(cidao[k]-now));
now=cidao[k];
}
printf("移臂总量为:
%d\n",sum);
}
voidSCAN()
{
inti,j,k,min,now=100;//now为当前磁头所在磁道位置
inta=0,b;//ab分别为大于等于100小于100的磁道个数
sum=0;
printf("使用SCAN算法处理:
\n");
for(i=0;iif(cidao[i]>=100)a+=1;
b=n-a;
for(i=0;i{
min=200;//min的最大值可能是0~199,必须设为200
for(j=0;j{
if(abs(cidao[j]-now)=now)
{
min=abs(cidao[j]-now);
k=j;
}
}
biaoji[k]=1;
sum+=abs(cidao[k]-now);
printf("访问:
%d移动距离:
%d\n",cidao[k],abs(cidao[k]-now));
now=cidao[k];
}
for(i=0;i
{
min=200;//min的最大值可能是0~199,必须设为200
for(j=0;j{
if(abs(cidao[j]-now){
min=abs(cidao[j]-now);
k=j;
}
}
biaoji[k]=1;
sum+=abs(cidao[k]-now);
printf("访问:
%d移动距离:
%d\n",cidao[k],abs(cidao[k]-now));
now=cidao[k];
}
printf("移臂总量为:
%d\n",sum);
}
intmain()//默认从100磁道开始
{
inti;
printf("请输入磁道序列长度:
\n");
scanf("%d",&n);
printf("随机生成磁道序列:
");
srand((unsigned)time(NULL));//这个就是生成了一个种子
for(i=0;i{
cidao[i]=rand()%200;//通过rand()%200来生成一个0~199的随机数,并将它赋给cidao[i]
printf("%d",cidao[i]);
}
printf("\n");
memset(biaoji,0,sizeof(biaoji));
SSTF();
memset(biaoji,0,sizeof(biaoji));
SCAN();
}
如图,输入磁道数量10,随机生成访问磁道的序列188102541731591341129793149,范围在0~199之间。
同时用两个算法对这个序列处理,“访问”即为访问磁道的顺序,最后SSTF算法移臂总量240,SCAN算法移臂总量222。
两个算法移臂总量差距不大,对于某些序列二者的移臂总量相同。
四实验总结
本次实验使用C语言模拟了访问磁道顺序的算法,初始位置设为100,随机生成了0~199的序列,用SSTF和SCAN算法处理,对于大多数序列,SCAN要比SSTF算法节省移臂总量,但节省得不算太多,对于某些序列二者的移臂总量会出现相同的情况,使我深入理解了这两个算法以及比较出了算法之间的优劣。