操作系统第一次上机实验 进程控制(终极版)

时间:2023-01-16 20:53:08

实验一进程控制

一、      实验目的

1.       理解进程控制块的结构。 

2.       理解进程各种状态之间的转换过程。

3.       掌握进程创建与撤消的方法。

4.       掌握进程挂起与唤醒的方法。 

二、      实验设备

1.      安装windows或者linux操作系统的PC机

2.      C程序编译环境

三、      实验内容

用c语言编程模拟实现操作系统的进程控制过程。进程控制主要包括进程的创建与撤消、进程的挂起与唤醒等。

四、      实验要求

1.      上机编写并调试进程控制的模拟程序。

2.      要把相应的程序代码及程序运行结果写入实验报告中。

 

 

//操作系统—进制控制模拟
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include<tlhelp32.h>
#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);
}