操作系统进程调度算法——吸烟者问题

问题描述:

假设一个系统有三个吸烟者进程和一个供应者进程,每个吸烟者都需要得到三个资源才能完成吸烟操作并且他们每人都持有这三种资源中的一种,供应者一次只能提供三种资源中两种的组合,并且要等到接收到吸烟者吸烟完成信号才能继续派发资源。

#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct semaphore {
	int random;//存储随机数,用于选择提供资源的类型
	int offer1;//对应烟草和纸的组合
	int offer2;//对应烟草和胶水的组合
	int offer3;//对应胶水和纸的组合
	int finish;//对应进程执行完毕后的应答
}*semaphoreptr;

class Provider {
public:
	Provider() {}
	~Provider() {}
	int get_random();
	int get_finish(semaphoreptr s);
	void provide(semaphoreptr s,int a);
};
int Provider::get_random() {
	int n;
	n = rand() % 3 + 1;
	return n;
}
int Provider::get_finish(semaphoreptr s) {
	if (s->finish == 1) {
		//表示接收到吸烟者的成功执行确认
		return 1;
	}
	else {
		cout << "进程还没有执行完,不能派发下一个资源..." << endl;
		return 0;
	}
}
void Provider::provide(semaphoreptr s,int a) {
	if (s->finish == 1) {
		switch (a) {
		case 1:
			s->offer1 = 1;
			break;
		case 2:
			s->offer2 = 1;
			break;
		case 3:
			s->offer3 = 1;
			break;
		}
		return;
	}
	else {
		cout << "进程没有使用完资源,还不能派发新的资源..." << endl;
		return;
	}
}

class Smoker {
	int num;
	int sign;
public:
	Smoker(int a):num(a),sign(0){}
	~Smoker(){}
	void wait(semaphoreptr s);
	void signal(semaphoreptr s);
};
void Smoker::wait(semaphoreptr s) {
	switch (this->num) {
		case 1:
			if (s->offer1 == 1) {
				//表示1号进程得到想要的资源
				this->sign = 1;//表示1号进程申请到资源
				break;
			}
			else {
				cout << this->num << "号进程没有申请到需要的资源..." << endl;
				break;
			}
		case 2:
			if (s->offer2 == 1) {
				//表示1号进程得到想要的资源
				this->sign = 1;//表示1号进程申请到资源
				break;
			}
			else {
				cout << this->num << "号进程没有申请到需要的资源..." << endl;
				break;
			}
		case 3:
			if (s->offer3 == 1) {
				//表示1号进程得到想要的资源
				this->sign = 1;//表示1号进程申请到资源
				break;
			}
			else {
				cout << this->num << "号吸烟者没有申请到需要的资源..." << endl;
				break;
			}
	}
}
void Smoker::signal(semaphoreptr s) {
	switch (this->num) {
	case 1:
		if (this->sign == 1) {
			cout << this->num << "号吸烟者得到资源开始吸烟..." << endl;
			s->finish = 1;
			s->offer1 = 0;
			this->sign = 0;
			break;
		}
		else {
			cout << this->num << "号吸烟者没有得到资源,不能吸烟..." << endl;
			break;
		}
	case 2:
		if (this->sign == 1) {
			cout << this->num << "号吸烟者得到资源开始吸烟..." << endl;
			s->finish = 1;
			s->offer2 = 0;
			this->sign = 0;
			break;
		}
		else {
			cout << this->num << "号吸烟者没有得到资源,不能吸烟..." << endl;
			break;
		}
	case 3:
		if (this->sign == 1) {
			cout << this->num << "号吸烟者得到资源开始吸烟..." << endl;
			s->finish = 1;
			s->offer3 = 0;
			this->sign = 0;
			break;
		}
		else {
			cout << this->num << "号吸烟者没有得到资源,不能吸烟..." << endl;
			break;
		}
	}
}

int main()
{
	semaphoreptr s = (semaphore *)malloc(sizeof(semaphore));
	s->finish = 1;
	s->offer1 = 0;
	s->offer2 = 0;
	s->offer3 = 0;
	Provider p;
	Smoker s1(1), s2(2), s3(3);
	int n1,n2,n3;
	n1 = p.get_random();
	n2 = p.get_random();
	while (n2 == n1) {
		n2 = p.get_random();
	}
	n3 = 6 - n1 - n2;
	p.provide(s,n1);
	s1.wait(s);
	s2.wait(s);
	s3.wait(s);
	s1.signal(s);
	s2.signal(s);
	s3.signal(s);
	p.provide(s,n2);
	s1.wait(s);
	s2.wait(s);
	s3.wait(s);
	s1.signal(s);
	s2.signal(s);
	s3.signal(s);
	p.provide(s, n3);
	s1.wait(s);
	s2.wait(s);
	s3.wait(s);
	s1.signal(s);
	s2.signal(s);
	s3.signal(s);
    return 0;
}

调试结果:


参考书籍: 王道 《2018年操作系统考研复习指导》

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/80615263