實驗一 程序控制
【實驗目的】
1.理解程序的概念,明確程序和程式的區別
2.理解併發執行的實質。
3.掌握程序的建立、睡眠、撤銷等程序控制方法。
【實驗內容】
用C語言編寫程式,模擬實現建立新的程序:檢視執行程序;換出某個程序:殺死執行程序等功能。
【實驗步驟】
1.1 資料結構:程序控制塊是描述程序狀態和特性的資料結構,一個程序只能有唯一的程序控制塊。
1.2 程式流程圖
1.3 實驗程式碼
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct jincheng_type
{
int pid;
int youxian;
int daxiao;
int zhuangtai;//標識程序狀態,0-不在記憶體,1-在記憶體,2-阻塞
char info[10];
};
struct jincheng_type neicun[20];
int shumu=0,zuse=0,pid,flag=0;
void create()
{
if(shumu>=20)
printf("\n記憶體已滿,請先喚醒或殺死程序n");
else
{
int i;
for(i=0;i<20;i++)
//定位,找到可以還未建立的程序
if(neicun[i].zhuangtai==0)
break;
printf("\n請輸入新程序pid\n");
scanf("%d",&(neicun[i].pid));
for(int j=0;j<i;j++)
if(neicun[i].pid==neicun[j].pid)
{
printf("\n該程序已存在n");
return;
}
printf("\n請輸入新程序優先順序\n");
scanf("%d",&(neicun[i].youxian));
printf("\n請輸入新程序大小\n");
scanf("%d",&(neicun[i].daxiao));
printf("\n請輸入新程序內容\n");
scanf("%s",neicun[i].info);
//建立程序,使標記位為1
neicun[i].zhuangtai=1;
shumu++;
}
}
void run()
{
for(int i=0;i<20;i++)
{
if(neicun[i].zhuangtai==1)
{
//輸出執行程序的各個屬性值
printf("\npid=%d\t",neicun[i].pid);
printf("youxian=%d\t",neicun[i].youxian);
printf("daxiao=%d\t",neicun[i].daxiao);
printf("zhuangtai=%d\t",neicun[i].zhuangtai);
printf("info=%s\t ",neicun[i].info);
flag=1;
}
}
if(!flag)
printf("\n當前沒有執行程序\n");
}
void zusetai()
{
if(!shumu)
{
printf("當前沒有執行程序\n");
return;
}
printf("\n輸入阻塞程序的PID值:");
scanf("%d",&pid);
for(int i=0;i<20;i++)
{ //定位,找到所要阻塞的程序,根據其狀態做相應處理
if(pid==neicun[i].pid)
{
if(neicun[i].zhuangtai==1)
{
neicun[i].zhuangtai=2;
zuse++;
printf("\n已經成功阻塞程序\n");
}
else if(neicun[i].zhuangtai==0)
printf("\n要阻塞的程序不存在\n");
else
printf("\n要阻塞的程序已被阻塞\n");
flag=1;
}
}
//找不到,則說明程序不存在
if(flag==0)
printf("\n要阻塞的程序不存在\n");
}
void kill()
{
if(!shumu)
{
printf("當前沒有執行程序\n");
return;
}
printf("\n輸入殺死程序的PID值");
scanf("%d",&pid);
for(int i=0;i<20;i++)
{
//定位,找到所要殺死的程序,根據其狀態做相應處理
if(pid==neicun[i].pid)
{
if(neicun[i].zhuangtai==1)
{
neicun[i].zhuangtai=0;
shumu--;
printf("\n已成功殺死程序\n");
}
else if(neicun[i].zhuangtai==0)
printf("\n:要殺死的程序不存在\n");
else
printf("\n要殺死的程序已被阻塞\n");
}
flag=1;
//找不到,則說明程序不存在
if(!flag)
printf("\n要殺死的程序不存在\n");
}
}
void huanxing()
{
if(!shumu)
{
printf("\n當前沒有執行程序\n");
return;
}
if(!zuse)
{
printf("\n當前沒有阻塞程序\n");
return;
}
printf("\n輸人pid:\n");
scanf("%d",&pid);
for(int i=0;i<20;i++)
{
//定位,找到所要殺死的程序,根據其狀態做相應處理
if(pid==neicun[i].pid)
{
if(neicun[i].zhuangtai==2)
{
neicun[i].zhuangtai=1;
zuse--;
printf("\n已經成功喚醒程序\n");
}
else if(neicun[i].zhuangtai==0)
printf("\n要喚醒的程序不存在\n");
else
printf("\n要喚醒的程序已被阻塞\n");
}
flag=1;
//找不到,則說明程序不存在
}
if(!flag)
printf("\n要喚醒的程序不存在\n");
}
int main()
{
int n=1;
int num;
//一開始所有程序都不在記憶體中
for(int i=0;i<20;i++)
neicun[i].zhuangtai=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)\n");
scanf("%d",&num);
switch(num)
{
case 1:create();break;
case 2:run();break;
case 3:zusetai();break;
case 4:kill();break;
case 5:huanxing();break;
case 6:exit(0);
default:n=0;
}
flag=0;//恢復標記
}
return 0;
}
1.4 實驗結果
阻塞
喚醒
殺死
【實驗體會總結】