操作系统实验一FSFC和SJF

操作系统先来先服务FSFC算法以及短作业优先SJF算法C++

完整代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
#include<cstring>
using namespace std;
class FSFC
{
public:
	FSFC(int nn, char* jobname, int* jobarrivetime, int* jobneededtime, int* flagi)
		: n(nn), JobArriveTime(jobarrivetime), JobNeededTime(jobneededtime), flag(flagi)
	{
		JobName = new char[strlen(jobname) + 1];
		strcpy(JobName, jobname);
	}
	void Rank()
	{
		for (int i = 0; i < n; ++i)
		{
			for (int j = i; j < n; ++j)
			{
				if (JobArriveTime[i] > JobArriveTime[j])
				{
					int temp = flag[i];
					flag[i] = flag[j];
					flag[j] = temp;
				}
			}
		}
	}
	int* JobArriveTime;		//作业到达时间
	int n;					//作业数
	char* JobName;			//作业名
	int* JobNeededTime;		//作业运行时间
	int* flag;				//运行次序
};
class SJF
{
public:
	SJF(int nn, char* jobname, int* jobarrivetime, int* jobneededtime, int* flagi)
		: n(nn), JobArriveTime(jobarrivetime), JobNeededTime(jobneededtime), flag(flagi)
	{
		JobName = new char[strlen(jobname) + 1];
		strcpy(JobName, jobname);
		exchange = new int[nn];
	}
	void Rank(int nowtime,int m)
	{
		bool* NeedCompare = new bool[n - m];
		if (JobArriveTime[m] < nowtime )
			{
				for (int j = 0; j < n; ++j)
				{
					if (flag[j] >= m)
						NeedCompare[j] = true;
					else NeedCompare[j] = false;
				}
		for (int j = 0; j < n; ++j)
			{
				if (JobNeededTime[j] < JobNeededTime[m] && NeedCompare[m] && NeedCompare[j])
					{
					int temp = flag[m];
					flag[m] = flag[j];
					flag[j] = temp;
					}
				}
			}
	}
	int* exchange;
	int* JobArriveTime;		//作业到达时间
	int n;					//作业数
	char* JobName;			//作业名
	int* JobNeededTime;		//作业运行时间
	int* flag;				//运行次序
};

int main()
{
	int ChooseWay;
	cout << "请选择算法(1:FSFC,2:SJF):";
	cin >> ChooseWay;

	int n;
	cout << "作业数目:";
	cin >> n;

	char* JobName = new char[n];
	cout << "作业名(空格分隔):";
	for (int i = 0; i < n; ++i)cin >> JobName[i];

	int* JobArriveTime = new int[n];	//作业到达时间
	cout << "作业到达时间(mmss格式):";
	for (int i = 0; i < n; ++i)cin >> JobArriveTime[i];

	int* JobNeededTime = new int[n];	//作业运行时间
	cout << "作业运行时间(默认分钟为单位):";
	for (int i = 0; i < n; ++i)cin >> JobNeededTime[i];

	int* flag = new int[n];				//运行次序
	for (int i = 0; i < n; ++i) flag[i] = i;

	cout << setw(15) << "作业名" << setw(15)
		<< "到达时间" << setw(15)
		<< "估计运行时间" << setw(15)
		<< "开始时间" << setw(15)
		<< "完成时间" << setw(15)
		<< "周转时间" << setw(15)
		<< "带权周转时间" << setw(15) << endl;

	if (ChooseWay == 1)
	{
		int NowTime;
		FSFC job_fsfc(n, JobName, JobArriveTime, JobNeededTime, flag);
		job_fsfc.Rank();
		for (int i = 0; i < n; ++i)
		{
			if (flag[i] == 0)
			{
				NowTime = JobArriveTime[i];
			}
		}
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				if (flag[j] == i)
				{
					double CyclingTime = NowTime + JobNeededTime[j] - JobArriveTime[j];
					cout << JobName[j] << setw(15)
						<< JobArriveTime[j] << setw(15)
						<< JobNeededTime[j] << setw(15)
						<< NowTime << setw(15)
						<< NowTime + JobNeededTime[j] << setw(15)
						<< CyclingTime << setw(15)
						<< CyclingTime / JobNeededTime[j] << setw(15) << endl;
					NowTime += JobNeededTime[j];
				}
			}
		}
	}
	if (ChooseWay == 2)
	{
		SJF job_sjf(n, JobName, JobArriveTime, JobNeededTime, flag);
		int NowTime = 0;
		for (int i = 0; i < n; ++i)
		{
			job_sjf.Rank(NowTime,i);
			for (int j = 0; j < n; ++j)
			{
				if (flag[j] == i&&i==0)
					NowTime += JobArriveTime[j] + JobNeededTime[j];
				if (flag[j] == i && i != 0)
					NowTime += JobNeededTime[j];
			}
		}
		for (int i = 0; i < n; ++i)
		{
			if (flag[i] == 0)	NowTime = JobArriveTime[i];
		}
		for (int i = 0; i < n; ++i)
			{
				for (int j = 0; j < n; ++j)
				{
					double CyclingTime = NowTime + JobNeededTime[j] - JobArriveTime[j];
					if (flag[j] == i)
					{
						cout << JobName[j] << setw(15)
							<< JobArriveTime[j] << setw(15)
							<< JobNeededTime[j] << setw(15)
							<< NowTime << setw(15)
							<< NowTime + JobNeededTime[j] << setw(15)
							<< CyclingTime << setw(15)
							<< CyclingTime / JobNeededTime[j] << setw(15) << endl;
						NowTime += JobNeededTime[j];
					}
				}
			}
	}
	return 0;
}
### 关于操作系统FSFC算法的实现与应用 #### FSFC算法概述 FSFC (First Step First Come) 是种用于磁盘调度的改进型算法。该算法旨在通过分组处理磁盘请求队列来提高效率并减少磁臂粘滞现象。具体来说,N步SCAN算法会将所有的磁盘请求分成多个长度为N的小队列,并依照特定顺序逐处理这些子队列,在每个子队列内部则遵循传统的SCAN原则进行读写操作[^2]。 #### 算法特点 - 当`N`非常大时,此方法接近普通的SCAN方式; - 若设定`N=1`,那么它实际上变成了简单的先到先得(FCFS)策略; - 新到达的任务会被分配给尚未被处理过的最合适的子集里而不是立即加入当前正在工作的那部分,从而防止了长时间停留在同区域的情况发生。 #### 应用场景实例 假设有个存储设备管理器需要优化其寻道时间以提升整体性能。可以考虑实施基于FSFC逻辑的设计方案: ```c++ #include <vector> using namespace std; class DiskScheduler { private: vector<int> requests; // 存储所有待处理的磁盘访问请求 int headPosition; public: void addRequest(int position); void processRequests(); }; void DiskScheduler::addRequest(int position){ this->requests.push_back(position); } // 处理请求函数简化版示意代码 void DiskScheduler::processRequests(){ const int N = 5; // 定义每个批次的最大数量 while (!this->requests.empty()){ auto beginIt = this->requests.begin(), endIt = next(beginIt,N); sort(beginIt,endIt,[&](int a,int b){return abs(a-headPosition)<abs(b-headPosition);}); for(auto it=beginIt;it!=endIt;++it){ cout << "Processing request at track: "<< *it<<endl; headPosition=*it; } this->requests.erase(beginIt,min(endIt,this->requests.end())); } } ``` 上述C++伪代码展示了如何利用STL容器标准库功能构建个简易版本的FSFC调度器模型。这里的关键在于合理划分任务集合并通过适当排序使得每次移动都能尽可能覆盖更多目标位置,进而达到降低平均响应时间增加吞吐量的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值