⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.cpp

📁 操作系统的进程管理实验
💻 CPP
字号:
#include <iostream.h>
#include "stdlib.h"
typedef char datatype;
typedef struct node
{ 
	datatype data;
    struct node *next;
	
}linklist;

typedef struct
{
	linklist *front,*rear;
}linkqueue;


linkqueue *a;
linklist *b,*c;
int count=10;
int f=0;


void show1()
{
	cout<<"                           *********************"<<endl;
	cout<<"                            进 程  管  理 系 统 "<<endl;
	cout<<"                           *********************         --20064486--张旭--"<<endl;

}


void show2()
{
	cout<<"        ----------------------------------------------------------------"<<endl;
	cout<<"        ★                  您可以使用的命令有:                      ★"<<endl;
	cout<<"        ★                -----------------------                     ★"<<endl;
	cout<<"        ★    c:创建进程                         b:阻塞进程           ★"<<endl;
	cout<<"        ★    t:时间片到                         w:唤醒进程           ★"<<endl;
	cout<<"        ★    e:结束进程                         s:显示进程           ★"<<endl;
	cout<<"        ★    h:显示命令表                       q:退出系统           ★"<<endl;
	cout<<"        ★                                                            ★"<<endl;
	cout<<"        ----------------------------------------------------------------"<<endl;
}


void progress()
{
    if(c->next!=NULL)
	{
	    if(b->next==NULL)
		{
		    if(a->front->next==NULL)
			{
				cout<<endl;
			    cout<<"已创建的进程已经全部进入阻塞态,系统处于死机状态!"<<endl;
                cout<<endl;
		        cout<<"请重新创建进程或唤醒进程!"<<endl;
			}
			else if(a->front->next==a->rear)
            {
				a->rear=a->front;
			    b->next=a->front->next;
		        a->front->next=a->front->next->next;
		        b->next->next=NULL;
			}
		    else 
			{
			    b->next=a->front->next;
		        a->front->next=a->front->next->next;
		        b->next->next=NULL;
			}
		}
	}
	else
	{
		if(b->next==NULL)
		{
			if(a->front==a->rear)
			{
				cout<<endl;
				cout<<"目前系统中已无进程!"<<endl;
			}
			else if(a->front->next==a->rear)
            {
				a->rear=a->front;
			    b->next=a->front->next;
		        a->front->next=a->front->next->next;
		        b->next->next=NULL;

			}
		    else  
			{
			    b->next=a->front->next;
		        a->front->next=a->front->next->next;
		        b->next->next=NULL;
			}
		}
	}
}
void creat()
{
	linklist *p;
    char i;

	if(count==0)//查看是否有空白的pcb
	{
		cout<<"已经没有空间了,请输入其它命令,创建失败!"<<endl;
	}
	else
	{
		cout<<"请输入要创建进程的名称:";
l1:     cin>>i;
	    p=a->front->next;
	    while(p!=NULL) //查看要创建的进程是否已经存在 ,1在就绪态队列中找。
		{
			if(p->data==i)
			{
				cout<<"您要创建的进程已存在!请重新输入!"<<endl;
			    goto l1;
			}
		    p=p->next;
		}
		p=b->next;
		while(p!=NULL)//2 在执行态队列中查找。
		{
			if(p->data==i)
			{
				cout<<"您要创建的进程已存在!请重新输入!"<<endl;
			    goto l1;
			}
			p=p->next;
		}
        p=c->next;
	    while(p!=NULL) //3 在阻塞态队列中查找。
		{
			if(p->data==i)
			{
				cout<<"您要创建的进程已存在!请重新输入!"<<endl;
			    goto l1;
			}
		    p=p->next;
		}
		

        a->rear->next=(linklist *)malloc(sizeof(linklist));//尾插法入队
	    a->rear=a->rear->next;
        a->rear->data=i;
        a->rear->next=NULL;
	    cout<<"进程创建成功!"<<endl;
	    count--;
        progress();//查看执行队列是否为空,为空则调入新进程
	}
}


void show(linklist *head)//显示链表中的进程
{
	linklist *p;
	p=head;
    while(p!=NULL)
	{
		cout<<"   "<<p->data;
        p=p->next;
	}
    cout<<endl;
}


void timeup()//进程时间片到
{
	linklist *p;
	if(b->next==NULL)
	{
		cout<<"没有处于执行态的进程,无法执行时间片到命令,请输入其他命令!"<<endl;
	}
	else
	{
		p=b->next;
	    b->next=NULL;
	    a->rear->next=p;
	    a->rear=p;
	    cout<<p->data<<"时间片到"<<endl;
		progress();
	}
}


void brock()
{
	if(b->next==NULL)
	{
		cout<<"没有处于执行态的进程,无法阻塞进程,请输入其他命令!"<<endl;
	}
	else
	{
	    linklist *p;
	    p=b->next;
	    b->next=NULL;
        p->next=c->next;
	    c->next=p;
	    cout<<p->data<<"进程已经被阻塞"<<endl;
	}
	progress();
}


void wakeup()
{
	linklist *p,*p1;
	char i;
	int flag=0;
	
	if(c->next==NULL)
	{
		cout<<"暂无阻塞态进程,无法唤醒进程,请输入其他命令!"<<endl;
		
	}
    else
	{
	cout<<"以下为所有处于阻塞态的进程:"<<endl;
	show(c->next);
	cout<<"请选择要唤醒的进程名称:";
l2: cin>>i;
    p1=c;
	p=c->next;
	while(p!=NULL)
	{
		if(p->data==i)
		{
            flag=1;
            p1->next=p->next;
            a->rear->next=p;//尾插法入队
	        a->rear=p;
            p->next=NULL;
			cout<<endl;
			cout<<p->data<<"进程已经被唤醒!"<<endl;
            p=NULL;
		}
		else
		{
			p1=p;
			p=p->next;
		}
	}
	if(flag!=1)
	{
		cout<<"您要唤醒的进程不存在!请重新选择!"<<endl;
		goto l2;
	}
	}
	progress();
}

void end()
{
	if(b->next==NULL)
	{
		cout<<"没有处于执行态的进程,无法结束进程,请输入其他命令!"<<endl;
	}
	else
	{
	    cout<<b->next->data<<"已经被终止"<<endl;
        b->next=NULL;
	}
	progress();
}


void main()
{
	a=(linkqueue *)malloc(sizeof(linkqueue));
	a->rear=(linklist *)malloc(sizeof(linklist));
	a->rear->data=NULL;
	a->front=a->rear;
    a->rear->next=NULL;
	b=(linklist *)malloc(sizeof(linklist));
    c=(linklist *)malloc(sizeof(linklist));
	b->next=NULL;
	c->next=NULL;
	cout<<"系统正在检查木马病毒......请等待......"<<endl;
	int times;
	times=40;
for(int i=0;i<times;i++)
		 {
			 if(i%2==0)
				 cout<<"\b\b\b\b\b\b"<<"      "<<"\b\b\b\b\b\b";
			  else
				  cout<<"........";
			  for(int j=0;j<50;j++)
				  for(int k=0;k<500;k++)
					  cout<<' '<<'\b';
		 }
     cout<<"未发现木马病毒及其衍生物!"<<endl; 
		 cout<<"现在是否运行程序?(是-1,否-0)"<<endl;
	 int ab;
	 cin>>ab;
	 if(ab==0)
	 {
        cout<<"期待你下次使用本程序..."<<endl;
		cout<<"------------------------"<<endl;
		cout<<endl;
		exit(0);
	 }
	char x;
	show1();
	cout<<endl;
	cout<<endl;
	show2();

    while(1)
	{
		cout<<endl;
	    cout<<endl;
	    cout<<"请输入你要执行的命令:"<<endl;
	    cin>>x;
	    cout<<endl;
		switch(x)
		{
		case 'c':
	    {
		    creat();
			break;	
		}
		case 'b':
		{
	   	    brock();
			break;	
		}
		case 't':
		{
		    timeup();
			break;	
		}
		case 'w':
		{
		    wakeup();
			break;	
		}
		case 'e':
		{
		    end();
			break;	
		}
		case 'h':
		{
			show2();
			break;
		}
		case 'q':
		{
            cout<<"__________________________"<<endl;
		    cout<<"欢迎下次继续使用本程序!!!"<<endl;
			cout<<"__________________________"<<endl;
			cout<<endl;
			exit(0);
			break;	
		}
		case 's':
		{
		    cout<<"以下为进程状态表:"<<endl;
	 	    cout<<endl;
		    cout<<"就绪态进程:";
		    show(a->front->next);
		    cout<<"执行态进程:";
		    show(b->next);
		    cout<<"阻塞态进程:";
		    show(c->next);
			break;	
		}
		default:
		{
		    cout<<"您输入的命令不正确,请重新输入!"<<endl;
		    cout<<endl;
		    cout<<"    以下为可供选择的命令:"<<endl;
		    show2();
			break;	
		}
	}   
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -