您的当前位置:首页正文

华为软件编程题:操作系统任务调度问题

2024-11-25 来源:个人技术集锦
  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!\n"); 
 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!\n", 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!\n"); 
 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("\n"); 
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("\n"); 
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("\n"); 
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\n", 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("\n"); 
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\n", 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 //}

 

转载于:https://www.cnblogs.com/andrewlee0708/p/scheduler.html

显示全文