zoukankan      html  css  js  c++  java
  • 华为软件编程题:操作系统任务调度问题

      1 /* scheduler.cpp
      2  * 操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。
      3  * 其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。
      4  * 优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],
      5  * 长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。
      6  * 函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务
      7  * 依次存放到 system_task[] 数组和 user_task[] 数组中
      8  * (数组中元素的值是任务在task[] 数组中的下标),
      9  * 并且优先级高的任务排在前面,数组元素为-1表示结束。
     10  */
     11 
     12 #include <stdio.h>
     13 #include <stdlib.h>
     14 #include <string.h>
     15 
     16 #define N 100
     17 
     18 void scheduler(int task[], int n, int system_task[], int user_task[])
     19 {
     20     if (task == NULL || n < 0 || system_task == NULL || user_task == NULL)
     21     {
     22         printf("The task queue is empty!
    "); 
     23         return;  
     24     }
     25     int i = 0, j = 0, k = 0; 
     26     int temp = 0; 
     27     //Set the content of system_task[] and user_task[]
     28     for (i = 0; i < n; i++)
     29     {
     30         system_task[i] = i; 
     31     }
     32     memset(user_task, 0xff, n * sizeof(int)); 
     33 
     34     //Use bubble sort to order task[] from small to large
     35     //Use system_task[] to record the subscript of task[]
     36     for (i = 0; i < n - 1; i++)
     37     {
     38         for (j = 0; j < n - 1 - i; j++)
     39         {
     40             if (task[j] > task[j + 1])
     41             {
     42                 temp = task[j + 1]; 
     43                 task[j + 1] = task[j]; 
     44                 task[j] = temp; 
     45 
     46                 temp = system_task[j + 1]; 
     47                 system_task[j + 1] = system_task[j]; 
     48                 system_task[j] = temp; 
     49             }
     50         }
     51     }
     52 
     53     //Judge and fulfill system_task and user_task
     54     for (i = 0, j = 0, k = 0; i < n; i++)
     55     {
     56         if (task[i] >= 0 && task[i] < 50)
     57         {
     58             system_task[j] = system_task[i]; 
     59             if (i > j)
     60             {
     61                 system_task[i] = -1; 
     62             }
     63             j++; 
     64         }
     65         else if (task[i] >= 50 && task[i] <= 255)
     66         {
     67             user_task[k] = system_task[i]; 
     68             system_task[i] = -1; 
     69             k++; 
     70         }
     71         else
     72         {
     73             printf("Task %d is illegal!
    ", task[i]); 
     74             system_task[i] = -1; 
     75         }
     76     }
     77 }
     78 
     79 int main()
     80 {
     81     int n = 0; 
     82     int i = 0; 
     83     printf("Please input the quantity of task, less than %d :", N); 
     84     scanf("%d", &n); 
     85     if (n > N || n < 0)
     86     {
     87         printf("The quantity is too large or illegal!
    "); 
     88         return 1; 
     89     }
     90 
     91     int *task = (int *)malloc(n * sizeof(int)); 
     92     int *system_task = (int *)malloc(n * sizeof(int)); 
     93     int *user_task = (int *)malloc(n * sizeof(int)); 
     94 
     95     printf("Please input the task queue : "); 
     96     for (i = 0; i < n; i++)
     97     {
     98         scanf("%d", &task[i]); 
     99     }
    100 
    101     scheduler(task, n, system_task, user_task); 
    102 
    103     printf("The system_task array is : "); 
    104     for (i = 0; i < n; i++)
    105     {
    106         if (system_task[i] == -1)
    107         {
    108             break; 
    109         }
    110         else 
    111         {
    112             printf("%d ", system_task[i]); 
    113         }
    114     }
    115     printf("
    "); 
    116 
    117     printf("The user_task array is : "); 
    118     for (i = 0; i < n; i++)
    119     {
    120         if (user_task[i] == -1)
    121         {
    122             break; 
    123         }
    124         else 
    125         {
    126             printf("%d ", user_task[i]); 
    127         }
    128     }
    129     printf("
    "); 
    130 
    131     delete []task, system_task, user_task; 
    132     return 0; 
    133 }
    134 
    135 //#include <stdio.h>
    136 //#include <string.h>
    137 //#include <malloc.h>
    138 //#include <iostream>
    139 //
    140 //void scheduler(int task[], int n, int system_task[], int user_task[])
    141 //{
    142 //    int i; 
    143 //    int j = 0; 
    144 //    int *p, *pp, *p_user, *pp_user; 
    145 //    int index = 0; 
    146 //    int count, count2; 
    147 //    int min = 0; 
    148 //    int k = 0; 
    149 //    p = (int *)malloc(sizeof(int) * n); 
    150 //    for (i = 0; i < n; i++)
    151 //    {
    152 //        p[i] = 0; 
    153 //    }
    154 //    pp = (int *)malloc(sizeof(int) * n); 
    155 //    for (i = 0; i < 0; i++)
    156 //    {
    157 //        pp[i] = 0; 
    158 //    }
    159 //    p_user = (int *)malloc(sizeof(int) * n); 
    160 //    for (i = 0; i < n; i++)
    161 //    {
    162 //        p_user[i] = 0; 
    163 //    }
    164 //    pp_user = (int *)malloc(sizeof(int) * n); 
    165 //    for (i = 0; i < n; i++)
    166 //    {
    167 //        pp_user[i] = 0; 
    168 //    }
    169 //
    170 //    for (i = 0; i < n; i++)
    171 //    {
    172 //        if (task[i] < 50)
    173 //        {
    174 //            system_task[j] = task[i]; 
    175 //            pp[j] = i; 
    176 //            j++; 
    177 //            count = j; 
    178 //        }
    179 //        else if (task[i] <= 255)
    180 //        {
    181 //            user_task[k] = task[i]; 
    182 //            pp_user[k] = i; 
    183 //            k++; 
    184 //            count2 = k; 
    185 //        }
    186 //        else 
    187 //        {
    188 //            //Is this line necessary?
    189 //            task[i] = task[i]; 
    190 //        }
    191 //    }
    192 //
    193 //    for (i = 0; i < count; i++)
    194 //    {
    195 //        //"%3d" and "%d "(with a blank behind %d), which is better?
    196 //        printf("%3d", system_task[i]); 
    197 //    }
    198 //    printf("
    "); 
    199 //
    200 //    for (i = 0; i < count; i++)
    201 //    {
    202 //        min = system_task[0]; 
    203 //        for (j = 1; j < count; j++)
    204 //        {
    205 //            if (system_task[j] < min)
    206 //            {
    207 //                min = system_task[j]; 
    208 //                p[i] = j; 
    209 //            }
    210 //        }
    211 //        system_task[p[i]] = 51; 
    212 //    }
    213 //
    214 //    pp[count] = -1; 
    215 //    for (i = 0; i < count; i++)
    216 //    {
    217 //        printf("%3d", pp[p[i]]); 
    218 //    }
    219 //    printf("%3d
    ", pp[count]); 
    220 //
    221 //    //then deal with user_task
    222 //    for (i = 0; i < count2; i++)
    223 //    {
    224 //        printf("%4d", user_task[i]); 
    225 //    }
    226 //    printf("
    "); 
    227 //
    228 //    for (i = 0; i < count2; i++)
    229 //    {
    230 //        min = user_task[0]; 
    231 //        for (j = 1; j < count2; j++)
    232 //        {
    233 //            if (user_task[j] < min)
    234 //            {
    235 //                min = user_task[j]; 
    236 //                p_user[i] = j; 
    237 //            }
    238 //        }
    239 //        user_task[p_user[i]] = 256; 
    240 //    }
    241 //
    242 //    pp_user[count2] = -1; 
    243 //    for (i = 0; i < count2; i++)
    244 //    {
    245 //        printf("%4d", pp_user[p_user[i]]); 
    246 //    }
    247 //    printf("%3d
    ", pp_user[count2]); 
    248 //}
    249 //
    250 //int main()
    251 //{
    252 //    int task[9] = {0, 30, 155, 1, 80, 300, 170, 40, 99}; 
    253 //    int system_task[9] = {0}; 
    254 //    int user_task[9] = {0}; 
    255 //    scheduler(task, 9, system_task, user_task); 
    256 //    return 0; 
    257 //}
  • 相关阅读:
    Windbg使用
    C#与C++之间类型的对应
    Hook CreateProcess
    基于EasyHook实现监控explorer资源管理器文件复制、删除、剪切等操作
    GUID和UUID、CLSID、IID 区别及联系
    hook C++
    EasyHook Creating a remote file monitor
    hook工具
    EasyHook
    Hook exe 和 file
  • 原文地址:https://www.cnblogs.com/andrewlee0708/p/scheduler.html
Copyright © 2011-2022 走看看