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

📄 临界资源手动1.cpp

📁 操作系统课程设计
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
int s=1;////////////临界资源数为1
typedef struct qnode/////s 信号量结点
{
	int data,qu;////////data用于保存正在等待资源的进程,qu保存正在使用临界资源的进程.
	struct qnode * next;
}* queues;
typedef struct/////S信号量队列
{
	queues front;////队头指针
	queues rear;///队尾指针
}lqueue;
lqueue sq;////////队列sq
void initq(lqueue &s)//////构造信号量队列S
{
	s.front =s.rear=(queues)malloc(sizeof(qnode));
	s.front->next=NULL;
}
void enqueue(int e)/////////////如果资源忙,则插入队尾
{
	queues p;
	p=(queues)malloc(sizeof(qnode));
	p->data=e;
	p->next=NULL;
	sq.rear->next=p;
	sq.rear=p;
}
void dequeue()//,int e)//////////////////删除队头
{
	queues p;
	p=sq.front->next;
	sq.front->next=p->next;
	free(p);
}
void p()//////////////////p操作
{s=s-1;}
void v()//////////////////v操作                                                                                                                             
{s=s+1;}
void inmanager(int,int);
void outmanager();
void main()
{
	initq(sq);////////构造信号量队列
	char ch;  ////////控制循环
	int m=0;
	while(ch!='q'&&ch!='Q')
	{
		cout<<"************************************"<<endl;
		cout<<"临界资源占有者:";
		if(s==1)
			cout<<"资源空闲!"<<endl;
		else
			cout<<"进程"<<sq.front->qu<<endl;
		cout<<"************************************"<<endl;
		cout<<"进入临界区(I)	退出临界区(e)	退出(Q)"<<endl<<endl;
		cin>>ch;
		if(ch=='i'||ch=='I')
		{
			m++;//////////////////进程序号
			p();///////////////////p操作
			inmanager(m,0);
		}
		if(ch=='e'||ch=='E')
		{
			if(s<1)////////////////////临界资源被占用,则可以调用退出函数
				outmanager();
			if(sq.front->next!=NULL)
				dequeue();///////////////队头元素进入临界资源,删除队头元素
		}
	}	
}
void inmanager(int m,int n)
{
	cout<<"进程"<<m<<"请求进入临界区......"<<endl;
	if(s>=0||n==1)///////////有资源
	{
		cout<<"准许进入!"<<endl;
		cout<<"进程"<<m<<"正在临界区......."<<endl;
		sq.front->qu=m;///////////记录在临界区的进程号
	}
	else
	{
		cout<<"资源忙,请等待!"<<endl;
		if(sq.front->next==NULL)
			sq.rear=sq.front;
		enqueue(m);///////////进入信号量队列
	}
	cout<<endl<<endl;
}
void outmanager()
{	
	cout<<"进程"<<sq.front->qu<<"请求退出临界区......"<<endl;
	v();
	cout<<"准许退出!"<<endl;
	cout<<"进程"<<sq.front->qu<<"退出临界区......."<<endl<<endl;
	if(s<=0)//////////////////资源空闲
		inmanager(sq.front->next->data,1);//////////信号量队列队头元素请求进入临界资源
}

⌨️ 快捷键说明

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