【操作系统】进程的创建、睡眠、撤销

【实验目的】

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 实验结果

阻塞

唤醒

杀死

【实验体会总结】

 

posted @   Mymcky  阅读(518)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示