您的位置:首页 > 其它

操作系统对系统任务和用户任务调度问题

2014-04-11 12:56 351 查看
操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务用户任务依次存放到 system_task[]数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入//队顺序排列(即先入队的任务排在前面),数组元素为-1表示结束。例如:

task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}           system_task[] = {0, 3, 1, 7, -1}          user_task[] = {4, 8, 2, 6, -1}
函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])

#include <stdio.h>
#include <stdlib.h>

void printfdata(int data[], int n){
int i;
printf("\n");
for(i = 0; i < n; i++){
printf("%d\t", data[i]);
}
printf("\n");
}
/**
对数组排序,然后将在原来task中对应的下标(即index数组中的内容)存入input数组中。
首先按input数组中的内容做排序,排序时改变对应的index数组中的值,保证input[i]中的值在原来task中的下标对应于index[i]
用bubble排序好后(注意index也对应排序)
将index数组中的内容对应存储到input中。
注意:n为数组的大小,即数组中元素的个数
*/
void bubblesort(int input[],int n,  int index[]){
//将input数组按从小到大排列,index存储在原来数组中对应的下标
int i, j;
int temp;
for(i = 0; i < n; i++){
for(j = i+1; j < n; j++){
if(input[i] > input[j]){
//交换input中的元素
temp = input[i];
input[i] = input[j];
input[j] = temp;
//交换数组下标
temp = index[i];
index[i] = index[j];
index[j] = temp;
}
}
}
//将input数组存储换成元素的下标,其原来的数据仅作为排序使用,排序过后,应该将对应的下标存入,即对应的index数组中的值
for(i = 0; i < n; i++){
input[i] = index[i];
}
}
void  scheduler(int task[], int n, int system_task[], int user_task[]){
int i;
int sys_i = 0,  user_i = 0;
int *sys_index = (int *)malloc((n + 1) * (sizeof(int)));
int *user_index = (int *)malloc((n + 1) * (sizeof(int)));
while((task == NULL) || (system_task == NULL) || (user_task == NULL)){
return ;//不符合要求返回
}

for(i = 0; i < n; i++){
if((task[i] >= 0) && (task[i] <= 255)){
if(task[i] < 50){
//系统任务
system_task[sys_i] = task[i];
sys_index[sys_i] = i;//记住在task数组中的下标
sys_i++;
}else{
//用户任务
user_task[user_i] = task[i];
user_index[user_i] = i;//记住在task数组中的下标
user_i++;
}
}
}
/**
输出用于过程检验
*/
printf("输出中间结果,用于检验:\n");
printfdata(system_task, sys_i);
printfdata(user_task, user_i );
printfdata(sys_index, sys_i);
printfdata(user_index, user_i);
//排序
bubblesort(system_task, sys_i , sys_index);//sys_i对应数组元素的个数
bubblesort(user_task, user_i , user_index);
system_task[sys_i] = -1;
user_task[user_i] = -1;
}

void main(){
int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
int sys_task[9];
int user_task[9];
int i = 0;
scheduler(task, 9, sys_task, user_task);
printf("输出原来的task数组:\n");
printfdata(task, 9);
printf("输出结果:\n");
printf("sys_task数组:\n");
while(sys_task[i] != -1){
printf("%d\t", sys_task[i]);
i++;
}
printf("%d\t", sys_task[i]);
printf("\n");
printf("user_task数组:\n");
i = 0;
while(user_task[i] != -1){
printf("%d\t", user_task[i]);
i++;
}
printf("%d\t", user_task[i]);
printf("\n");
getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: