操作系统任务调度问题
作者: 匿名
时间限制: 1s
章节: 课程设计
问题描述
目的:设计并实现一个算法Schedule,完成简单的操作系统任务调度问题。
描述:操作系统任务分为系统
任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务序列task(顺序存储),任务数为n。每个task的元素值表示任务的优先级,数值越小,优先级越高。算法scheduler实现如下功能,将task中的任务按照系统任务、用户任务依次存放到队列 system_task和 user_task中(队列中元素的值是任务在顺序表task中对应的下标),并且优先级高的任务排在前面。优先级相同的任务按照在task中的相对顺序入队排列(即task序列中在先的任务排在前面)。
要求:顺序表使用vector或数组,队列使用本学期设计好的顺序队列ADT
参考函数原形:
template<class ElemType>
void Schedule(vector<ElemType> &A, SqQueue<int> &system_task, SqQueue<int> &user_task);
输入说明
第一行:任务序列task中各个任务的优先级(任务优先级之间以空格分隔)
输出说明
第一行:任务序列task的遍历结果,以","分隔
格式: (序号,优先级) ...
空行
第二行:系统任务队列遍历结果,每个数字后均跟一个空格。如系统任务队列为空,输出 none
第三行:用户任务队列遍历结果,每个数字后均跟一个空格。如用户任务队列为空,输出 none
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
template<class ElemType>
class SqQueue
{
private:
queue<ElemType> q;
public:
bool isEmpty() const
{
return q.empty();
}
bool EnQueue(const ElemType& e)
{
q.push(e);
return true;
}
bool DeQueue(ElemType& e)
{
if (isEmpty())
{
return false;
}
e = q.front();
q.pop();
return true;
}
void print() const
{
if (q.empty())
{
cout << "none";
}
else
{
queue<ElemType> temp = q;
while (!temp.empty())
{
cout << temp.front() << " ";
temp.pop();
}
}
cout << endl;
}
};
template <class ElemType>
void Schedule(vector<ElemType>& A, SqQueue<int>& system_task, SqQueue<int>& user_task)
{
// 用于存储任务的优先级和索引
vector<pair<ElemType, int>> tasks;
for (int i = 0; i < A.size(); ++i)
{
if (A[i] <= 255)
{
tasks.push_back(make_pair(A[i], i));
}
}
// 按照任务优先级从小到大排序
sort(tasks.begin(), tasks.end());
// 将任务分别加入到对应的队列中
for (const auto& task : tasks)
{
if (task.first < 50)
{
system_task.EnQueue(task.second);
}
else
{
user_task.EnQueue(task.second);
}
}
}
int main()
{
vector<int> A;
int n;
// 读取输入
while (cin.peek() != '\n' && cin >> n)
{
A.push_back(n);
}
// 输出任务序列的遍历结果
for (int i = 0; i < A.size(); ++i)
{
cout << "(" << i << "," << A[i] << ")";
if (i <A.size()-1)
{
cout << ",";
}
}
cout << endl<<endl;
SqQueue<int> system_task;
SqQueue<int> user_task;
Schedule(A, system_task, user_task);
// 输出系统任务队列
system_task.print();
// 输出用户任务队列
user_task.print();
return 0;
}