操作系统实验二 进程管理

进程管理

一.实验目的

1、 理解进程的概念,明确进程和程序的区别。
2、 理解并发执行的实质。
3、 掌握进程的创建、睡眠、撤销等进程控制方法。

二.实验内容与基本要求

用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。

三.实验报告内容
1.进程、进程控制块等的基本原理

a.为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,引入了“进程”的概念。它是资源分配和独立运行的基本单位。
b.进程控制块(PCB)是操作系统为进程配置的一个专门的数据结构。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。

2.程序流程图

process

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("\n 内存已满,请删除或挂起其他程序");
    else{
        for(i=0;i<20;i++)
         if(neicun[i].state==0) break; /*按顺序在内存中寻找创建新进程的空间*/
           printf("\n请输入新建进程的pid值\n");
           scanf("%d",&neicun[i].pid);
           for(j=0;j<i;j++)   /*判断是否之前已存储相同pid进程*/
              if(neicun[j].pid==neicun[i].pid)
              {  printf("\n该进程已存在于内存中");
                  return;
              }
              printf("\n请输入新进程的优先级 \n" ); 
            scanf("%d",&neicun[i].youxianji);
            printf("\n请输入新进程的大小\n" ); 
          scanf("%d",&neicun[i].daxiao);
          printf("\n请输入新进程的内容\n" ); 
          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("\n 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("\n当前没有运行该进程\n" );/*标记为0,表示该进程未创建于内存中*/ 

}
/********************换出进程***************************/

void huanchu()
{if(num==0)  /*num=0,表示内存中无进程*/
  { printf("\n当前没有运行的进程\n" );
    return;
  } 
    printf("\n请输入要换出的进程的pid值\n" );
    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("\n该进程已成功挂起换出\n" );
           }
           else if(neicun[i].state==0)
           printf("\n要换出的进程不存在\n" );
           else printf("\n要换出的进程已经被挂起\n" ); 
           bj=1;break;
         }
    }
    if(bj==0) printf("\n要换出的进程不存在\n" );
}  
/********************杀死进程***************************/
void kill()
{
  if(num==0)
  { printf("\n当前没有运行的进程\n" );
    return;
  }
 printf("\n请输入要杀死的进程的pid值\n" );
    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("\n该进程已成功杀死\n" );
           }
           else if(neicun[i].state==0)
           printf("\n要杀死的进程不存在\n" );
           else printf("\n要杀死的进程已经被挂起\n" );/*剩余状态为2,挂起*/
        bj=1;break;
        }
      } 
    if(bj==0) printf("\n要杀死的进程不存在\n" );
  }
/********************唤醒进程***************************/
void huanxing()
{ 
  if(num==0) 
  { printf("当前没有运行的进程\n");
    return;
  }
  if(guaqi==0)  /*guaqi=0,表示没有挂起的进程*/
  { printf("\n当前没有换出的进程\n");
    return;
  }
  printf("\n请输入要唤醒的进程的pid值:\n");
  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("\n该进程已成功唤醒\n" );
           }
           else if(neicun[i].state==0)
           printf("\n要唤醒的进程不存在\n" );
           else printf("\n要唤醒的进程已经在内存中\n" );
         }
    }
  } 
/********************主程序***************************/
void main()
{int xuhao,n=1,i;
for(i=0;i<20;i++)
   neicun[i].state=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):");
       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.运行结果以及结论

程序功能一览
1

创建新的进程,理论上可支持最多20个进程。每个进程对应有唯一的ID,优先级,进程大小(运行时长),进程内容

2

可查看正在运行的进程全部信息。

3

可选择将正在运行的程序换出,挂起。
4

杀死进程
5

唤醒被挂起的进程
6

  • 20
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1.基本系统进程   Csrss.exe:这是子系统服务器进程,负责控制Windows创建或删除线程以及16位的虚拟DOS环境。   System Idle Process:这个进程是作为单线程运行在每个处理器上,并在系统不处理其它线程的时候分派处理器的时间。   Smss.exe:这是一个会话管理子系统,负责启动用户会话。   Services.exe:系统服务的管理工具。   Lsass.exe:本地的安全授权服务。   Explorer.exe:资源管理器。   Spoolsv.exe:管理缓冲区中的打印和传真作业。   Svchost.exe:这个进程要着重说明一下,有不少朋友都有这种错觉:若是在“任务管理器”中看到多个Svchost.exe在运行,就觉得是有病毒了。其实并不一定,系统启动的时候,Svchost.exe将检查注册表中的位置来创建需要加载的服务列表,如果多个Svchost.exe同时运行,则表明当前有多组服务处于活动状态;多个DLL文件正在调用它。   至于其它一些附加进程,大多为系统服务,是可以酌情结束运行的。由于其数量众多,我们在此也不便于一一列举。   在系统资源紧张的情况下,我们可以选择结束一些附加进程,以增加资源,起到优化系统的作用。在排除基本系统及附加进程后,增的陌生进程就值得被大家怀疑了。 更多内容请看Windows操作系统安装、系统优化大全、系统安全设置专题,或进入讨论组讨论。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值