操作系统实验(一)

操作系统实验

hello,我是橘子
最近突然发现我以前写的操作系统实验,然后分享给大家吧,就是自己写的代码也不是很好,希望大家见谅哈
实验目的
一、进程控制
●基本要求:利用简单的结构和控制方法模拟进程结构、进程状态和进程控制。
●参考学时:9学时
●实验提示:
1、用PCB表示整个进程实体,利用随机数方法或键盘控制方法模拟进程执行中产生的事件,或者利用基于图形界面的鼠标或者键盘操作控制进程管理内容。
2、定义PCB:包括理论PCB中的基本内容,如内部ID、外部ID、队列指针。由于很难实现真正的进程创建功能,在实验中只需建立PCB节点,并用它代表一个完整的进程。每创建一个进程时,可动态分配PCB节点,对相应内容赋值,并链接到适当的队列上。
可参考如下数据结构(动态形式):
struct PCB{
char name[10];
struct PCB*next;
};
struct PCB *ready,*blocked,running;
创建进程时:
struct PCB p=(struct PCB )malloc(sizeof(struct PCB));
并将此进程添加到就绪队列末尾:
add(ready,p);
其中,ready为就绪队列头节点,并在开始处分配了空间;add函数是链表中添加节点函数,代码可以为:
void add(struct PCB head,struct PCBprocess){
struct PCB
tmp=head;
while(tmp->next!=NULL)
tmp=tmp->next;
tmp->next=process;
process->next=NULL;
}
3、定义进程状态转换方式:真实的进程状态转换是由进程内部操作或操作系统的控制引起的。由于模拟程序中无法实现这些功能,我们可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-5的随机数,分别代表创建进程(1)、时间片到(2)、进程阻塞(3)、唤醒进程(4)、结束进程(5)等事件;键盘模拟方法指定义5个选项菜单代表以上五种事件。
4、根据随机数或键盘操作处理就绪队列、阻塞队列和当前执行进程的状态。每次事件处理后应显示出当前系统中的执行进程是哪一个,就绪队列和阻塞队列分别包含哪些进程。
5、
(带
部分为试验班和特长班需要完成的内容,普通班选作)完成可变分区的分配与回收,创建进程的同时申请一块连续的内存空间,结束进程同时回收分配的内存空间。分配采用最佳适应算法,碎片大小为2Kb,最后回收所有进程的空间。可以查看进程所占的空间和系统空闲空间。
●评分标准:满分15分
要求必须完成以下几个方面的内容:
能够模拟进程的创建与撤销过程;5分
可对进程的状态进行全面的控制;5分
按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状态。5分

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct PCB
{
	char data;
	struct PCB *next;
}PCB,*PCBlist;
void show(PCBlist rear)//就绪状态和堵塞状态展示
{
	PCBlist P=rear;
	while(P->next)
	{
		cout<<P->next->data<<" ";
		P=P->next;
	}
}
void runshow(char running)//执行状态展示
{
	if(running=='\0')
		cout<<"没有正在执行的进程"<<endl;
	else
		cout<<running<<endl;
}
void add(PCBlist rear,char ch)//尾插法插入
{
	PCBlist P=rear;//队列头
	PCBlist s=new PCB;//新建节点
	s->data=ch;
	s->next=NULL;
	if(P->next==NULL)//进程链为空添加节点
	{
		P->next=s;
	}
	else
	{
		while(P->next!=NULL)//进程链不为空添加节点
		{
			P=P->next;
		}
		P->next=s;
	}
}
void menu()//进程选择菜单
{
	//cout<<"请选择执行的操作:"<<endl;
	cout<<"1.创建进程"<<endl;
	cout<<"2.时间片到"<<endl;
	cout<<"3.进程阻塞"<<endl;
	cout<<"4.唤醒进程"<<endl;
	cout<<"5.结束进程"<<endl;
}
void showall(PCBlist ready,PCBlist block,char running)//进程状态显示
{
	cout<<"----------------------------------"<<endl;
	cout<<"就绪状态为:";
	show(ready);
	cout<<endl;
	cout<<"执行状态为:";
	runshow(running);
	cout<<"阻塞状态为:";
	show(block);
	cout<<endl;
	cout<<"----------------------------------"<<endl;
}
void main()
{
	PCBlist S;//释放空间
	int n;
	char running ='\0';
	char ch,temp;// ch为输入进程的名字
	PCBlist ready=new PCB;
	PCBlist block=new PCB;
	ready->next=NULL;
	block->next=NULL;
	PCBlist rear1=block;
//	PCBlist pc=ready;

//	PCBlist pd=block;
	showall(ready,block,running);
log:{
	menu();
	cout<<"请选择执行的操作:"<<endl;
	}
	cin>>n;
	while(true)
	{	
		system("cls");
		menu();
		switch(n)
		{
		case 1://创建进程
			{
				cout<<"请输入进程名";
				cin>>ch;
				add(ready,ch);
				//显示:
				if(running=='\0')//如果还没有正在执行的进程
				{
					if(ready->next!=NULL)//就绪队列不为空
					{
						temp=ready->next->data;//获取队头进程(就绪队列第一个元素)
						S=ready->next;
						ready->next=ready->next->next;//出队头
						delete S;
						running=temp;//将就绪状态变为执行状态
					}
					showall(ready,block,running);
				}
				else
				{
					showall(ready,block,running);
				}
				break;
			}
		case 2://时间片到
			{
				if(running!='\0')
				{
					add(ready,running);//将正在执行的进程添加到就绪状态中
					
					if(ready->next!=NULL)
					{
						temp=ready->next->data;
						S=ready->next;
						ready->next=ready->next->next;
						delete S;
						running=temp;
					}//将此时就绪队列的队头变为执行状态
					else
					{
						running='\0';
					}
					showall(ready,block,running);
				}
				else
				{
					cout<<"没有正在进行的进程"<<endl;
				}
				break;
			}
		case 3://进程阻塞
			{
				if(running=='\0')
					cout<<"没有正在进行的进程"<<endl;
				else
				{
					add(block,running);//将阻塞的进程添加到阻塞队列
				
					if(ready->next!=NULL)
					{
						temp=ready->next->data;
						S=ready->next;
						ready->next=ready->next->next;
						delete S;
						running=temp;
					}//将此时就绪队列的队头变为执行状态
					else
					{
						running='\0';
					}
					showall(ready,block,running);
				}
				break;
			}
		case 4://唤醒进程
			{
				if(block->next==NULL)
					cout<<"没有正在阻塞的进程"<<endl;
				else
				{
					cout<<"请输入要唤醒的进程"<<endl;
					cin>>ch;
					
					while(rear1->next->data!=ch)//找到要唤醒的进程
					{
						if(rear1->next->next!=NULL)
						{
							rear1=rear1->next;
						}
						else
						{
							cout<<"未查询到该进程"<<endl;
                            showall(ready,block,running);
							goto log;
						}

					}
					add(ready,rear1->next->data);//将要唤醒的进程添加到就绪队列中
					if(rear1->next->next!=NULL)//判断此节点后面是否还存在节点
					{
					    S=rear1->next ;
					    rear1->next=rear1->next->next;//删除刚才节点
						delete S;
					}
					else
					{
                        rear1->next=NULL;
					}
					if(running=='\0')//如果没有正在执行的进程
				    {
						if(ready->next!=NULL)
						{
							temp=ready->next->data;
							running=temp;
							S=ready->next;
							ready->next=ready->next->next;
							delete S;
						}
					   showall(ready,block,running);
					}
					else
					{
						 showall(ready,block,running);
					}
					
				}
				
				break;
			}
		case 5://结束进程
			{
				//ws/cout<<"请输入要结束的进程号";
				//cin>>q;
				//while(pc->next!=NULL)//在就绪队列中找要结束的进程
				//{
				//	if(pc->next->data==q)
				//	{
				//		pc->next=pc->next->next;
				//		showall(ready,block,running);
				//		break;
				//	}
				//	else
				//		pc=pc->next;
				//}
				//while(pd->next!=NULL)//在阻塞队列中找要结束的进程
				//{
				//	if(pd->next->data==q)
				//	{
				//		pd->next=pd->next->next;
				//		showall(ready,block,running);
				//		break;
				//	}
				//	else
				//		pd=pd->next;
				//}
				//if(running==q)//如果要结束的进程正在执行
				//{
					running='\0';
					if(ready->next!=NULL)
					{
						
						temp=ready->next->data;
						S=ready->next;
						ready->next=ready->next->next;
						running=temp;
						delete S;
					}
					showall(ready,block,running);
				/*}*/
			}
		}
		cout<<"请选择执行的操作:"<<endl;
		cin>>n;
	}
}


猜你喜欢

转载自blog.csdn.net/qq_40172319/article/details/88872485