操作系统实验二 进程管理
进程管理
一.实验目的
1、 理解进程的概念,明确进程和程序的区别。
2、 理解并发执行的实质。
3、 掌握进程的创建、睡眠、撤销等进程控制方法。
二.实验内容与基本要求
用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
三.实验报告内容
1.进程、进程控制块等的基本原理
a.为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,引入了“进程”的概念。它是资源分配和独立运行的基本单位。
b.进程控制块(PCB)是操作系统为进程配置的一个专门的数据结构。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。
2.程序流程图
3.程序及注释
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
struct PCB_type
{ int pid;
int youxianji;
int daxiao;
char neirong[10];
int state; /* 0表示不在内存,1表示在内存,2表示挂起*/
};
struct PCB_type neicun[20];
int num=0,guaqi=0,bj,i,j,pid;/*定义相关参数变量*/
/*********************创建新进程*************************/
void create()
{
if(num>=20) /*判断是否有存储空间*/
printf("
内存已满,请删除或挂起其他程序");
else{
for(i=0;i<20;i++)
if(neicun[i].state==0) break; /*按顺序在内存中寻找创建新进程的空间*/
printf("
请输入新建进程的pid值
");
scanf("%d",&neicun[i].pid);
for(j=0;j<i;j++) /*判断是否之前已存储相同pid进程*/
if(neicun[j].pid==neicun[i].pid)
{ printf("
该进程已存在于内存中");
return;
}
printf("
请输入新进程的优先级
" );
scanf("%d",&neicun[i].youxianji);
printf("
请输入新进程的大小
" );
scanf("%d",&neicun[i].daxiao);
printf("
请输入新进程的内容
" );
scanf("%s",&neicun[i].neirong);
neicun[i].state=1; /*将进程状态设为1,表示在内存中*/
num++;/*内存中进程数目加一*/
}
}
/********************查看当前运行进程**************************/
void run()
{ bj=0;
for(i=0;i<20;i++)
if(neicun[i].state==1) /*若进程状态设为1,表示在内存中,输出查看*/
{printf("
pid=%d",neicun[i].pid);
printf(" youxianji=%d",neicun[i].youxianji);
printf(" daxiao=%d",neicun[i].daxiao);
printf(" neirong=%s",neicun[i].neirong);
bj=1;/*存在于内存中的进程标记为1 */
}
if(bj==0)
printf("
当前没有运行该进程
" );/*标记为0,表示该进程未创建于内存中*/
}
/********************换出进程***************************/
void huanchu()
{if(num==0) /*num=0,表示内存中无进程*/
{ printf("
当前没有运行的进程
" );
return;
}
printf("
请输入要换出的进程的pid值
" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i++)
{
if(pid==neicun[i].pid)
{ if(neicun[i].state==1)
{neicun[i].state=2; /*将该进程的状态设为挂起*/
guaqi++;
printf("
该进程已成功挂起换出
" );
}
else if(neicun[i].state==0)
printf("
要换出的进程不存在
" );
else printf("
要换出的进程已经被挂起
" );
bj=1;break;
}
}
if(bj==0) printf("
要换出的进程不存在
" );
}
/********************杀死进程***************************/
void kill()
{
if(num==0)
{ printf("
当前没有运行的进程
" );
return;
}
printf("
请输入要杀死的进程的pid值
" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i++)
{
if(pid==neicun[i].pid)
{ if(neicun[i].state==1)
{neicun[i].state=0; /*将该进程的状态设为不在内存中*/
num--; /*内存中的进程数目减少一个*/
printf("
该进程已成功杀死
" );
}
else if(neicun[i].state==0)
printf("
要杀死的进程不存在
" );
else printf("
要杀死的进程已经被挂起
" );/*剩余状态为2,挂起*/
bj=1;break;
}
}
if(bj==0) printf("
要杀死的进程不存在
" );
}
/********************唤醒进程***************************/
void huanxing()
{
if(num==0)
{ printf("当前没有运行的进程
");
return;
}
if(guaqi==0) /*guaqi=0,表示没有挂起的进程*/
{ printf("
当前没有换出的进程
");
return;
}
printf("
请输入要唤醒的进程的pid值:
");
scanf("%d",&pid);
for(i=0;i<20;i++){
if(pid==neicun[i].pid)
{
if(neicun[i].state==2)
{neicun[i].state=1; /*将该进程的状态设为挂起*/
guaqi--;
num++;
printf("
该进程已成功唤醒
" );
}
else if(neicun[i].state==0)
printf("
要唤醒的进程不存在
" );
else printf("
要唤醒的进程已经在内存中
" );
}
}
}
/********************主程序***************************/
void main()
{int xuhao,n=1,i;
for(i=0;i<20;i++)
neicun[i].state=0; /*使所有进程都初始设为不在内存中*/
while(n){
printf("
**********************************************");
printf("
* 进程演示系统 *");
printf("
**********************************************");
printf("
1.创建新的进程 2.查看运行进程");
printf("
3.换出某个进程 4.杀死运行进程");
printf("
5.唤醒某个进程 6.退出程序 ");
printf("
**********************************************");
printf("
请选择(1~6):");
scanf("%d",&xuhao);
switch(xuhao)
{
case 1: create( ); break;
case 2 :run(); break;
case 3 :huanchu();break;
case 4 :kill();break;
case 5 :huanxing();break;
case 6 :exit(0);
default: n=0;
break;
}
}
}
4.运行结果以及结论
程序功能一览
创建新的进程,理论上可支持最多20个进程。每个进程对应有唯一的ID,优先级,进程大小(运行时长),进程内容
可查看正在运行的进程全部信息。
可选择将正在运行的程序换出,挂起。
杀死进程
唤醒被挂起的进程
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇: C语言 查找字符串子串 返回位置
