大家好,又见面了,我是你们的朋友全栈君。
实验一 进程管理
1.目的和要求
通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.实验内容
用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
3.实验环境
Windows操作系统、VC 6.0
C语言
4.实验提示
PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删。
主体程序
代码语言:javascript复制 #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请输入新进程的pidn");
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)
然后根据你选择的不同,出现不同的结果。
6. 实验要求:
- 上机前认真使用C语言编写好程序,采用Visual C 6.0作为编译环境;
- 上机时独立调试程序
根据具体实验要求,填写好实验报告(包括目的和要求、实验内容、实验环境、设计思想、源程序、实例运行结果、总结)
实验报告代码:
代码语言:javascript复制#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
struct PCB_type
{ int pid;
int priority;
int size;
char content[10];
int state; /* 0表示不在内存,1表示在内存,2表示挂起*/
};
struct PCB_type storage[20];
int num=0,hang_up=0,bj,i,j,pid;/*定义相关参数变量*/
/*********************创建新进程*************************/
void create()
{
if(num>=20) /*判断是否有存储空间*/
printf("n 内存已满,请删除或挂起其他程序");
else{
for(i=0;i<20;i )
if(storage[i].state==0) break; /*按顺序在内存中寻找创建新进程的空间*/
printf("n请输入新建进程的pid值n");
scanf("%d",&storage[i].pid);
for(j=0;j<i;j ) /*判断是否之前已存储相同pid进程*/
if(storage[j].pid==storage[i].pid)
{ printf("n该进程已存在于内存中");
return;
}
printf("n请输入新进程的优先级 n" );
scanf("%d",&storage[i].priority);
printf("n请输入新进程的大小n" );
scanf("%d",&storage[i].size);
printf("n请输入新进程的内容n" );
scanf("%s",&storage[i].content);
storage[i].state=1; /*将进程状态设为1,表示在内存中*/
num ;/*内存中进程数目加一*/
}
}
/********************查看当前运行进程**************************/
void run()
{ bj=0;
for(i=0;i<20;i )
if(storage[i].state==1) /*若进程状态设为1,表示在内存中,输出查看*/
{printf("n pid=%d",storage[i].pid);
printf(" priority=%d",storage[i].priority);
printf(" size=%d",storage[i].size);
printf(" content=%s",storage[i].content);
bj=1;/*存在于内存中的进程标记为1 */
}
if(bj==0)
printf("n当前没有运行该进程n" );/*标记为0,表示该进程未创建于内存中*/
}
/********************换出进程***************************/
void swap_out()
{if(num==0) /*num=0,表示内存中无进程*/
{ printf("n当前没有运行的进程n" );
return;
}
printf("n请输入要换出的进程的pid值n" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i )
{
if(pid==storage[i].pid)
{ if(storage[i].state==1)
{storage[i].state=2; /*将该进程的状态设为挂起*/
hang_up ;
printf("n该进程已成功挂起换出n" );
}
else if(storage[i].state==0)
printf("n要换出的进程不存在n" );
else printf("n要换出的进程已经被挂起n" );
bj=1;break;
}
}
if(bj==0) printf("n要换出的进程不存在n" );
}
/********************杀死进程***************************/
void kill()
{
if(num==0)
{ printf("n当前没有运行的进程n" );
return;
}
printf("n请输入要杀死的进程的pid值n" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i )
{
if(pid==storage[i].pid)
{ if(storage[i].state==1)
{storage[i].state=0; /*将该进程的状态设为不在内存中*/
num--; /*内存中的进程数目减少一个*/
printf("n该进程已成功杀死n" );
}
else if(storage[i].state==0)
printf("n要杀死的进程不存在n" );
else printf("n要杀死的进程已经被挂起n" );/*剩余状态为2,挂起*/
bj=1;break;
}
}
if(bj==0) printf("n要杀死的进程不存在n" );
}
/********************唤醒进程***************************/
void rouse()
{
if(num==0)
{ printf("当前没有运行的进程n");
return;
}
if(hang_up==0) /*hang_up=0,表示没有挂起的进程*/
{ printf("n当前没有换出的进程n");
return;
}
printf("n请输入要唤醒的进程的pid值:n");
scanf("%d",&pid);
for(i=0;i<20;i ){
if(pid==storage[i].pid)
{
if(storage[i].state==2)
{storage[i].state=1; /*将该进程的状态设为挂起*/
hang_up--;
num ;
printf("n该进程已成功唤醒n" );
}
else if(storage[i].state==0)
printf("n要唤醒的进程不存在n" );
else printf("n要唤醒的进程已经在内存中n" );
}
}
}
/********************主程序***************************/
int main()
{int serial,n=1,i;
for(i=0;i<20;i )
storage[i].state=0; /*使所有进程都初始设为不在内存中*/
while(n){
printf("n**********************************************");
printf("n* 进程演示系统 *");
printf("n**********************************************");
printf("n 1.创建新的进程 2.查看运行进程");
printf("n 3.换出某个进程 4.杀死运行进程");
printf("n 5.唤醒某个进程 6.退出程序 ");
printf("n**********************************************");
printf("n请选择(1~6):");
scanf("%d",&serial);
switch(serial)
{
case 1: create( ); break;
case 2 :run(); break;
case 3 :swap_out();break;
case 4 :kill();break;
case 5 :rouse();break;
case 6 :exit(0);
default: n=0;
break;
}
}
return 0;
}
运行结果:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195260.html原文链接:https://javaforall.cn