1. 程式人生 > 其它 >實驗一 程序控制

實驗一 程序控制

【實驗目的】

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 實驗結果

阻塞

喚醒

殺死

【實驗體會總結】