操作系统实验报告_10

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告
(模拟实现进程管理)
一、实验目的
1、理解进程的概念, 明确进程和程序的区别
2、理解并发执行的实质
掌握进程的创建, 睡眠, 撤销等进程控制方法
二、实验过程
1.模拟实现创建新的进程
模拟实现创建新的进程注释: 键盘输入1, 选择创建新的进程功能, 然后按照提示输入创建新的进程名称和进程的优先级。

图中创建新的进程名称为5, 优先级为3。

查看运行进程, 换出某个进程
2.查看运行进程, 换出某个进程的注释: 键盘输入2, 选择查看某个进程, 系统自动显示出
此刻正在运行的进程名称优先级等等一系列的详细信息。

键盘输入3, 选择换出某个进程的功能, 系统会提示已有处于活动就绪进程的名称, 在按照提示输入需要换出的程序名称。

图中显示的处于活动就绪状态的2 3 5 , 人员操作换出3后, 处于活动就绪进程的是2和5。

3.杀死运行进程
杀死运行进程注释: 键盘输入4, 选择杀死进程的功能, 系统就会自动杀死进程
三.实验心得
通过操作系统的第二次实验课程, 让我们小组成员对进程的创建, 查看运行进程, 换出某个进程, 以及杀死进程等各个功能有了更深深刻的理解, 让我们从当初的晕晕乎乎状态摆脱出来。

我们通过自己编写代码模拟实现进程的各个功能, 对进程有了各家充分的了解。

为了我们以后从事软件工作打下了基础, 让我们懂得如何使得cpu更加充分的利用。

同是通过本次实验也增加了我们小组的配合的默契性, 提高了我们团队的凝聚力。

让我们明白了团队的力量, 才是最强大的。

四.代码展示
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NULL 0
int shumu=0;
//进程的内容结构体
struct node
{
int a;
char ch;
};
//进程PCB结构体
struct jincheng
{
int pid;
int youxian;
float luntime;
float zhantime;
char zhuangtai; //a表示执行, b表示动态就绪
node *neirong;
struct jincheng *next;
};
struct jincheng *neijin,*neizhi,*p,*q;
//换出进程函数
void huanchu(int a)
{
p=neijin;
while(p->pid!=a&&p!=NULL)
{
q=p;
p=p->next;
}
if(p==NULL)
{
printf("该进程不在内存里!\n");
return;
}
if(p==neijin)
{
neijin=neijin->next;
}
else
{
q->next=p->next; //把目标进程换出来, 即把目标进程从就绪队列中移出来
}
}
//杀死正在运行进程函数
void shasi()
{
neizhi->next=NULL;
printf("运行的进程已经杀死!\n");
return;
}
//创建新进程后与正在运行进程比较优先级并根据优先级判断谁该占用处理机int bijiao()
{
int i,j;
p=neijin;
while(p!=NULL)
{
q=p;
p=p->next; //q指向进程的末尾, 即新建的进程
}
i=q->youxian; //i代表新进进程的优先级
j=neizhi->next->youxian; //j代表正在执行进程的优先级
if(i>j) //如果新建的进程的优先级高于正在执行程序的优先级
{
p=neijin;
if(p==q) //就绪队列的进程中只有一个进程。

也就是那个新建的进程
{
neijin=neizhi->next;
p->neirong=(node*)malloc(sizeof(node));
p->neirong->a=9;
p->neirong->ch='c';
neizhi->next=p; //把处理机交给优先级高的新进程
return 1;
}
else{
while(p->next!=q)
{
p=p->next;
} //执行完后p 指针在q指针前面
p->next=neizhi->next; //将正在执行的进程放置p的后面
q->neirong=(node*)malloc(sizeof(node));
q->neirong->a=9;
q->neirong->ch='c';
neizhi->next=q; //将q放置在正在执行列表中, 把处理机交给优先级高的进程
neizhi->next->next=NULL;
return 1;
}
}
else
return -1;
}
void main()
{
int zhixing();//定义函数
void shasi();//定义函数
void chakan();//定义函数
void tongxing(int);//定义函数
neizhi=(jincheng*)malloc(sizeof(jincheng));
neizhi->next=NULL;
neijin=(jincheng*)malloc(sizeof(jincheng));
neijin->next=NULL;
neijin->pid=1;
neijin->youxian=6;
neijin->luntime=3.5;
neijin->zhantime=3;
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong=NULL;
neijin->zhuangtai='b';
shumu++;
p=(jincheng*)malloc(sizeof(jincheng));
p->next=neijin->next;
neijin->next=p;
p->pid=2;
p->youxian=5;
p->luntime=3.5;
p->zhantime=3;
p->neirong=(node*)malloc(sizeof(node));
p->neirong=NULL;
p->zhuangtai='b';
shumu++;
q=(jincheng*)malloc(sizeof(jincheng));
q->next=p->next;
p->next=q;
q->pid=3;
q->youxian=4;
q->luntime=3.5;
q->zhantime=3;
q->neirong=(node*)malloc(sizeof(node));
q->neirong=NULL;
q->zhuangtai='b';
shumu++;
int i,n=1;
int k,j,s;
j=zhixing();
int creat();
while(n==1)
{
printf("********************************************\n");
printf("* 进程演示系统*\n");
printf("********************************************\n");
printf(" 1.创建新的进程2.查看运行进程\n");
printf(" 3.换出某个进程4.杀死运行进程\n");
printf(" 5.进程之间通信6.退出系统\n");
printf("********************************************\n");
printf("请选择(1~6)\n");
scanf("%d",&i);
switch(i)
{
case 1:k=creat();
if(k==1)
printf("进程创建成功!\n");
if(neijin->next==NULL)
{
printf("由于只有一个进程所以为它分配处理机.\n");
neizhi->next=neijin;
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong->a=3;
neijin->neirong->ch='c';
neijin=NULL;
continue;
}
k=bijiao();
if(k==1)
{
printf("由于新进程的优先级高于正在执行的进程所以正在执行的\n");
printf("进程让出处理机交给新进程,而它变为活动就绪!\n");
}
if(k!=1)
printf("新进程的优先级低于正在运行的进程所以它只有等待!\n");
break;
case 2:
if(neizhi->next==NULL)
{
printf("没有进程处于执行状态!\n");
continue;
}
chakan();break;
case 3:
if(neijin==NULL)
{
printf("内存中已经没有处于活动就绪的进程了请创建!\n");
continue;
}
printf("已有处于活动就绪进程的名字为:\n");
p=neijin;
printf("(");
while(p!=NULL)
{
printf("%d ",p->pid);
p=p->next;
}
printf(")\n");
printf("请输入要换出的处于活动就绪进程的名字\n");
scanf("%d",&s);
huanchu(s);
if(neijin==NULL)
printf("内存中已经没有活动就绪进程!\n");
else
{
printf("已有处于活动就绪进程的名字为:\n");
p=neijin;
printf("(");
while(p!=NULL)
{
printf("%d ",p->pid);
p=p->next;
}
printf(")\n");
}
break;
case 4:
if(neizhi->next==NULL)
{
printf("没有处于执行状态的进程!\n");
continue;
}
shasi();
if(neijin==NULL)
{
printf("已经没有处于活动就绪的进程请创建!\n");
continue;
}
j=zhixing();
if(j==1)
{ printf("已为一个动态就绪进程中优先级最高的进程分配处理器!\n");
}
break;
case 5:
if(neijin==NULL)
{
printf("内存中已经没有处于活动就绪的进程了请创建!\n");
continue;
}
if(neizhi->next==NULL)
{
printf("没有处于执行状态的进程!\n");
continue;
}
printf("请输入要与正在运行的进程进行进程通讯的进程名字\n");
scanf("%d",&s);
tongxing(s);
break;
case 6:exit(0);
default:n=0;
}
}
}
//创建新的进程函数
int creat()
{
int i;
if(shumu>20)
{
printf("内存已满请先换出进程!\n");
i=-1;
return i;
}
else
{
if(neijin==NULL) //如果没有就绪队列中没有进程的话
{
p=(jincheng*)malloc(sizeof(jincheng));
printf("请输入新进程的名字(数字):\n");
scanf("%d",&p->pid);
printf("请输入新进程的优先级:(数字)\n");
scanf("%d",&p->youxian);
p->luntime=3.5;
p->zhantime=3;
p->neirong=(node*)malloc(sizeof(node));
p->neirong=NULL;
p->zhuangtai='b'; //新建进程的状态设置为“就绪”
p->next=NULL;
neijin=p;
shumu++;
i=1;
}
else //如果就绪队列不是空队列
{
p=neijin;
while(p->next!=NULL)
{
p=p->next; //p一直指向就绪队列的队尾
}
q=(jincheng*)malloc(sizeof(jincheng));
q->next=p->next;
p->next=q; //在就绪队列的队尾加入新建的进程
printf("请输入新进程的名字(数字):\n");
scanf("%d",&q->pid);
printf("请输入新进程的优先级:(数字)\n");
scanf("%d",&q->youxian);
q->luntime=3.5;
q->zhantime=3;
q->neirong=(node*)malloc(sizeof(node));
q->neirong=NULL;
q->zhuangtai='b'; //新建进程的状态设置为就绪
shumu++;
i=1;
}
}
return i;
}
//从活动就绪进程队列中找到一个优先级最高的进程并为它分配处理机int zhixing()
{
int i,j;
p=neijin;
if(neizhi->next!=NULL)
{
return -1;
}
i=neijin->youxian;
p=neijin->next;
while(p!=NULL)
{ j=p->youxian;
if(i>=j)
{
p=p->next;
}
if(i<j)
{
i=p->youxian;
p=p->next;
}
}
if(neijin->youxian==i)
{
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong->a=9;
neijin->neirong->ch='c';
neizhi->next=neijin;
neijin=neijin->next;
neizhi->next->next=NULL;
}
else
{
p=neijin;
while(i!=p->youxian)
{
q=p;
p=p->next;
} // q是p前面的指针
p->neirong=(node*)malloc(sizeof(node));
p->zhuangtai='a';
p->neirong->a=9;
p->neirong->ch='c';
neizhi->next=p; //将p放入执行列表
q->next=p->next; //将
}
return 1;
}
//
void chakan()
{
p=neizhi->next;
printf("该执行进程的名字为:%d\n",p->pid);
printf("该执行进程的的优先级:%d\n",p->youxian);
printf("该执行进程的轮转时间为:%f\n",p->luntime);
printf("该执行进程占用cpu的时间为:%f\n",p->zhantime);
printf("该执行的进程内容为:\n");
printf("%d ",p->neirong->a);
printf("%c",p->neirong->ch);
printf("\n");
}
void tongxing(int a)
{
q=neijin;
while(q->pid!=a&&q!=NULL)
{
q=q->next;
}//q为id为a的进程
if(q==NULL)
{
printf("所输入的进程不在内存中!\n");
return ;
}
p=neizhi->next;//p为正在执行的进程
q->neirong=(node*)malloc(sizeof(node));
q->neirong->a=p->neirong->a;
q->neirong->ch=p->neirong->ch;//将正在执行的进程内容复制给id为a的进程printf("通信成功!\n");
return;
}。

相关文档
最新文档