实验一进程控制
一、 实验目的
1. 理解进程控制块的结构。
2. 理解进程各种状态之间的转换过程。
3. 掌握进程创建与撤消的方法。
4. 掌握进程挂起与唤醒的方法。
二、 实验设备
1. 安装windows或者linux操作系统的PC机
2. C程序编译环境
三、 实验内容
用c语言编程模拟实现操作系统的进程控制过程。进程控制主要包括进程的创建与撤消、进程的挂起与唤醒等。
四、 实验要求
1. 上机编写并调试进程控制的模拟程序。
2. 要把相应的程序代码及程序运行结果写入实验报告中。
//操作系统—进制控制模拟
#include
#include
#include
#include
#define N 10
struct pb
{
int ko;
int no;
int cha;
};
typedef struct pb PCB;
PCB a[N];
int showallproc()
{
PROCESSENTRY32 pe32;//用来存储进程信息的结构体
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获取进程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("调用失败\n");
return 1;
}
BOOL bProc=Process32First(hProcessSnap,&pe32);
while(bProc)
{
printf("%5d %s\n",pe32.th32ProcessID,pe32.szExeFile);//输出进程ID和进程名
bProc=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return 0;
}
static int count=1;
void create() //创建
{
static int pi=1;
int k,l=0,m;
printf("please input n0:");
scanf("%d",&m);
for(k= 1;k<= N;k++ )
if(a[k].no ==m)
l=1;
if(l == 1)
{
printf("Error!\n");
create();
}
else
{
for(k= 1;k<= N;k++ )
{
if(a[k].no==0)
{
pi=k;break;}
}
a[pi].no=m;
printf("\nplease input ko0:");
scanf("%d",&a[pi].ko);
if(count>1) //首次进程状态为执行,之后为活动就绪
a[pi++].cha=3;
else
a[pi++].cha=5;
count++;
}
}
int stopproc()
{
DWORD ProcessID;
printf("请输入想要终止的进程ID\n");
scanf(" %d",&ProcessID);
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打开对应进程句柄
if (hProcess==NULL)
{
printf("失败\n");
return -1;
}
if (!TerminateProcess(hProcess,0))//关闭进程
{
printf("关闭失败\n");
}
else
{
printf("关闭成功\n");
}
CloseHandle(hProcess);
return 0;
}
void dispatch() //调度
{
int i,m,l=0,j=0,k,min=10000;
for(m= 1;m<= N;m++ )
if(a[m].cha==5)
l=m;
if(l!=0)
{
printf("Error!");
return;
}
else
for(k= 1;k<= N;k++ )
{
if(a[k].cha==3)
if(min>a[k].ko)
{
min=a[k].ko;
i=k;
j=1;
}
}
if(j)
a[i].cha=5;
else if(j==0)
printf("Error!\n");
}
void block() //阻塞
{
int k,m,l=0;
printf("please input no0:");
scanf("%d",&m);
for(k= 1;k<= N;k++ )
if(a[k].no==m)
l=k;
if(l!=0)
{
if(a[l].cha==3 || 5)
a[l].cha=4;
else if(a[l].cha==1)
a[l].cha=2;
else
printf("Error!\n");
}
else
printf("Error!");
}
void wakeup() //唤醒
{
int k,m,l=0;
printf("please input no0:");
scanf("%d",&m);
for(k= 1;k<= N;k++ )
if(a[k].no==m)
l=k;
if(l!=0)
{
if(a[l].cha==2)
a[l].cha=1;
else if(a[l].cha==4)
a[l].cha=3;
else
printf("Error!\n");
}
else
printf("Error!");
}
void suspend() //挂起
{
int k,m,l=0;
printf("please input no0:");
scanf("%d",&m);
for(k= 1;k<= N;k++ )
if(a[k].no==m)
l=k;
if(l!=0)
{
if(a[l].cha==3 || 5)
a[l].cha=1;
else if(a[l].cha==4)
a[l].cha=2;
else
printf("Error!\n");
}
else
printf("Error!");
}
void active() //激活
{
int k,m,l=0;
printf("please input no0:");
scanf("%d",&m);
for(k= 1;k<= N;k++ )
if(a[k].no==m)
l=k;
if(l!=0)
{
if(a[l].cha==1)
a[l].cha=3;
else if(a[l].cha==2)
a[l].cha=4;
else
printf("Error!\n");
}
else
printf("Error!");
}
void display() //查看PCB功能模块
{
int i;
printf("\t\tPCB\tno\tko\tcha\n");
for(i= 1;i<= 10;i++ )
printf("\t\t%d\t%d\t%d\t%d\n",i,a[i].no,a[i].ko,a[i].cha);
printf("\t1-静止就绪 2--静止阻塞 3--活动就绪 4--活动阻塞 5--执行\n");
}
void change_KO() //改变优先数
{
int k,m,l=0;
printf("please input no0:");
scanf("%d",&m);
for(k= 1;k<= N;k++ )
if(a[k].no==m)
l=k;
if(l!=0)
{
printf("please input new KO:");
scanf("%d",&a[l].ko);
display();
}
else
printf("Error!");
}
int main()
{
int i;
do
{
printf("\t\t************** choice ***************\n");
printf("\t\t* 1-----进程创建 *\n");
printf("\t\t* 2-----进程撤消 *\n");
printf("\t\t* 3-----调度 *\n");
printf("\t\t* 4-----阻塞 *\n");
printf("\t\t* 5-----唤醒 *\n");
printf("\t\t* 6-----挂起 *\n");
printf("\t\t* 7-----激活 *\n");
printf("\t\t* 8-----查看PCB功能模块 *\n");
printf("\t\t* 9-----改变优先数 *\n");
printf("\t\t* 10----查看进程 *\n");
printf("\t\t* 0-----退出 *\n");
printf("\t\t*************************************\n");
printf("\t\t请选择0-10:");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1: create();break;
case 2:stopproc();break;
case 3: dispatch();break;
case 4: block();break;
case 5: wakeup();break;
case 6: suspend();break;
case 7: active();break;
case 8: display();break;
case 9: change_KO();break;
case 10: showallproc();break;
case 0: exit(0); //程序正常退出
}
}
while(i!=0);
}