操作系统实验报告
姓 名:周翔
学 号:100511310
班 级:计算机大类1003班
院 系:数学与计算机学院
日 期:20##年5月30日
实验一 进程管理
1.目的和要求
通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.实验内容
用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
3.实验环境
Windows操作系统、VC++6.0
C语言
4.实验步骤
PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删。
主体程序
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
struct PCB_type
{ int pid;
int priority;
int cputime;
………
};
struct PCB_type neicun[20];
int shumu=0,pid_l;
main()
{
int n,m,i;
char a;
n=1;
while(n==1)
{
clrscr();
printf("\n********************************************");
printf("\n* 进程演示系统 *");
printf("\n********************************************");
printf("\n 1.创建新的进程 2.查看运行进程 ");
printf("\n 3.换出某个进程 4.杀死运行进程 ");
printf("\n 5.退出系统 ");
printf("\n********************************************");
printf("\n请选择(1~5)");
a=getchar();
switch(a)
{ case'1':
create( ); /*自定义过程*/
break;
case'2':
run( ); /* 自定义过程 */
break;
case'3':
huanchu(); /*自定义过程*/
break;
case'4':
kill( ); /*自定义过程*/
break;
case'5':
exit(0);
default: n=0;
}
}
}
create( ) /* 创建一个进程的示例(不完整的程序) */
{
if(shumu>=20)
{
printf("\n内存已满,请先结束或换出进程\n");
}
else
{
printf("\n请输入新进程的pid\n");
scanf("%d",&neicun[shumu-1].pid);
printf("\n请输入新进程的优先级\n");
scanf("%d",&neicun[shumu-1].youxian);
printf("\n请输入新进程的大小\n");
scanf("%d",&neicun[shumu-1].daxiao);
shumu++;
}
}
5.实验运行结果
********************************************
* 进程演示系统 *
********************************************
1.创建新的进程 2.查看运行进程
3.换出某个进程 4.杀死运行进程
5.退出系统
********************************************
请选择(1~5)
然后根据你选择的不同,出现不同的结果。
实验二 页式虚拟存储管理页面置换算法
一、实验目的:
1.熟悉FIFO,OPT和LRU算法
2.比较三种算法的性能优劣
二、实验内容:
写出FIFO,OPT和LRU算法的程序代码,并比较它们的算法性能。
三、实验器材(设备、元器件):
1.基本环境要求
①宽敞整洁专用实验室
②必备的基本实验工具
2.软硬件要求
① 实验平台Visual c++ 6.0
四、实验步骤:
部分代码如下:
#include <stdio.h>
#define M 4 //物理页数
#define N 20 //需要调入的页数
typedef struct page
{
int num;
int time;
}Page; //物理页项,包括调入的页号和时间
Page mm[M]; //4个物理页
int queue1[20],queue2[20],queue3[20]; //记录置换的页
int K=0,S=0,T=0; //置换页数组的标识
int pos=0;//记录存在最长时间项
//初始化内存页表项及存储内存情况的空间
void INIT(){
int i;
for(i=0;i<M;i++){
mm[i].num =-1;
mm[i].time =0;
}
}
void main()
{
int A[N],B[N];
int i;
INIT();
printf("请依次输入%d个页面号:\n",N);
for(i=0;i<N;i++){
scanf("%d",&A[i]);
}
//FIFO
for(i=0;i<N;i++){
B[i]=A[i];
}
for(i=0;i<N;i++){
FIFO( B[i] );
}
printf("FIFO的");
printf("调入队列为:");
for(i=0;i<K;i++)
printf("%3d",queue1[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f\n\n",K,(float)K/N);
//LRU
INIT();
for(i=0;i<N;i++){
B[i]=A[i];
}
for(i=0;i<N;i++){
LRU( B[i] );
}
printf("LRU的");
printf("调入队列为:");
for(i=0;i<S;i++)
printf("%3d",queue2[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f\n\n",S,(float)S/N);
//OPT
INIT();
for(i=0;i<N;i++){
B[i]=A[i];
}
for(i=0;i<N;i++){
OPT( B[i] );
}
printf("OPT的");
printf("调入队列为:");
for(i=0;i<T;i++)
printf("%3d",queue3[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f\n\n",T,(float)T/N);
}
运行截图如下所示:
实验三 银行家算法
一、实验目的
模拟银行家算法,用银行家算法实现资源分配
二、实验内容
已知进程{P0,P1,P2,P3,P4},有三类系统资源A、B、C的数量分别为10、5、7,在T0时刻的资源分配情况如下图所示:
(1)若进程P1请求资源,发出请求向量Request1(1,0,2),编写程序用银行家算法判断系统能否将资源分配给它;
(2)若进程P3提出请求Request(1,1,2),用银行家算法程序验证系统能否将资源分配给它。
三、实验环境
软件环境:VC ++
硬件环境:微机
四、实验步骤
数据结构:
1.可利用资源向量Available
2.最大需求矩阵Max
3.分配矩阵Allocation
4.需求矩阵Need
功能介绍:
模拟实现Dijkstra的银行家算法以避免死锁的出现.分两部分组成:
第一部分:银行家算法(扫描)
1.如果Request<=Need,则转向2;否则,出错
2.如果Request<=Available,则转向3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:安全性算法
1.设置两个向量
(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False
2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:
Work=Work+Allocation;
Finish[i]=true;
转2
4. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!
五、实验结果
部分代码如下:
#include <iostream.h>
#include <iomanip.h>
#define M 5 /*M个进程,N个资源*/
#define N 3
int AVAILABLE[N]; /*可用资源数组*/
int MAX[M][N]; /*最大需求矩阵*/
int ALLOCATION[M][N]; /*分配矩阵*/
int NEED[M][N]; /*需求矩阵*/
int REQUEST[M][N]; /*进程需要资源数*/
bool FINISH[M]; /*系统是否有足够的资源分配*/
int p[M]; /*记录序列*/
void Init();
bool Safe();
void Banker();
void Output();
void main()
{
Init();
Safe();
Banker();
}
void Banker() /*银行家算法*/
{
int i,pneed;
char flag;
while(1)
{
cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<<endl;
cin>>pneed;
cout<<"请输入进程所请求的各资源的数量"<<endl;
for(i=0;i<N;i++)
{
cin>>REQUEST[pneed][i];
}
for(i=0;i<N;i++)
{
if(REQUEST[pneed][i]>NEED[pneed][i])
{
cout<<"您输入的对"<<i<<"进程的请求数超过进程的需求量!请重新输入!"<<endl;
continue;
}
if(REQUEST[pneed][i]>AVAILABLE[i])
{
cout<<"您输入的对"<<i<<"进程的请求数超过系统有的资源数!请重新输入!"<<endl;
continue;
}
}
for(i=0;i<N;i++)
{
AVAILABLE[i]-=REQUEST[pneed][i];
ALLOCATION[pneed][i]+=REQUEST[pneed][i];
NEED[pneed][i]-=REQUEST[pneed][i];
}
if(Safe())
{
cout<<"同意分配请求!"<<endl;
}
else
{
cout<<"您的请求被拒绝!"<<endl;
for(i=0;i<N;i++)
{
AVAILABLE[i]+=REQUEST[pneed][i];
ALLOCATION[pneed][i]-=REQUEST[pneed][i];
NEED[pneed][i]+=REQUEST[pneed][i];
}
}
for(i=0;i<M;i++)
{
FINISH[i]=false;
}
cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;
cin>>flag;
if(flag=='y'||flag=='Y')
{
continue;
}
break;
}
}
void Output() /*输出*/
{
int i,j;
cout<<"资源分配表:"<<endl<<"进程名 Max Allocation Need Available"<<endl;
for (i=0;i<M;i++)
{
cout<<"P"<<i<<": ";
for (j=0;j<N;j++)
cout<<setw(2)<<MAX[i][j]<<" ";
cout<<" ";
for (j=0;j<N;j++)
cout<<setw(2)<<ALLOCATION[i][j]<<" ";
cout<<" ";
for (j=0;j<N;j++)
cout<<setw(2)<<NEED[i][j]<<" ";
cout<<" ";
if(i==0)
for (j=0;j<N;j++)
cout<<setw(2)<<AVAILABLE[j]<<" ";
cout<<endl;
}
}
程序执行结果:
六、总结
通过本次实验,实现了避免死锁的银行家算法。银行家算法是通过动态地检测系统中资源分配情况和进程对资源的需求情况,保证至少有一个进程能得到所需要的全部资源,从而能确保系统处于安全状态,才把资源分配给申请者,避免了进程共享资源时系统发生死锁。
银行家算法确实能保证系统时时刻刻都处于安全状态,但它要不断检测每个进程对各类资源的占用和申请情况,需花费较多的时间。