操作系统-实验二、模拟进程调度

实验二、进程调度模拟程序2.0实验

一、实验目的

用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解

二、 实验内容和要求

三、实验要求

1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序。

进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。

(1).  每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。

(2).  进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。

(3).  每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

(4).  就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

(5).  如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。

(6).  每进行一次调度程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。   

(7).  重复以上过程,直到所要进程都完成为止。

 

四、实验方法、步骤及结果测试

 

  1 #include<stdio.h>
  2 
  3 #define N 10
  4 
  5 void main()
  6 {
  7  int a,o=1;
  8  
  9 loop: while(o==1)
 10  {
 11   printf("\n");
 12   printf("\t\t/****************************************/\n");
 13   printf("\t\t/****  **** ** 进程调度模拟 **  **** ****/\n");
 14         printf("\t\t/***************************************/");
 15         printf("\n\t\t/*    1、优先级优先  调  度            */");
 16         printf("\n\t\t/*    2、短作业优先  调  度            */");
 17         printf("\n\t\t/*    3、时间片轮转  调  度            */");
 18         printf("\n\t\t/*    4、先到先服务  调  度            */");
 19         printf("\n\t\t/*    0、  退      出                  */\n");
 20         printf("\t\t/****************************************/");
 21         printf("\n\t\t请选择菜单项?\t");
 22         scanf("%d",&a);
 23         printf("\n");
 24 
 25         switch(a)
 26   {
 27           case 4: printf("此功能未完成\n") ;break;//fcfs()
 28           case 2: printf("此功能未完成\n") ;break;//sjf()
 29           case 3: printf("此功能未完成\n") ;break;//sjf()
 30           case 1: yxj();break;//printf("4\n") 
 31           default: break;
 32   }
 33       if(a<0 || a>4){
 34    printf("\t\t输入有误,请重新输入!!") ;
 35    goto loop;
 36    }  
 37 }
 38 
 39 }
 40 
 41 typedef struct process   //进程结构
 42 
 43 {
 44 
 45    char name;
 46 
 47    int arrive;
 48 
 49    int prio;
 50 
 51    int needTime;
 52 
 53    char state;
 54 
 55   
 56 
 57 }Process;
 58 
 59 Process a[N];
 60 
 61  
 62 
 63 
 64 void input(Process a[],int n){                //输入函数
 65 
 66     int i;
 67 
 68    for(i=0;i<n;i++)
 69 
 70    {
 71 
 72         printf("请输入第%d个进程的进程名:",i+1);
 73 
 74         scanf("%c",&a[i].name);
 75 
 76         printf("请输入第%d个进程的优先级:",i+1);
 77 
 78         scanf("%d",&a[i].prio);
 79 
 80         printf("请输入第%d个进程的到达时间:",i+1);
 81 
 82         scanf("%d",&a[i].arrive);
 83 
 84         printf("请输入第%d个进程的需要时间:",i+1);
 85 
 86         scanf("%d",&a[i].needTime);
 87 
 88         a[i].state='r';
 89 
 90         getchar();
 91 
 92         printf("\n");
 93 
 94    }
 95 
 96 }
 97 
 98 void sort(Process a[],int n)               //排序算法
 99 
100 { 
101 
102    int i,j;
103 
104    Process temp;
105 
106    for(i=0;i<n;i++)
107 
108       for(j=i;j<n;j++)
109 
110       {
111 
112              if(a[j].prio>a[i].prio) //按进程优先级排序
113 
114              {
115 
116                     temp=a[j];
117 
118                     a[j]=a[i];
119 
120                     a[i]=temp;
121 
122              }
123 
124              if(a[j].prio==a[i].prio)  //如果优先级相同,按先来先服务原则排序
125 
126              {
127 
128                     if(a[j].arrive<a[i].arrive)
129 
130                     {
131 
132                    temp=a[j];
133 
134                     a[j]=a[i];
135 
136                     a[i]=temp;
137 
138                     }
139 
140              }
141 
142       }
143 
144 }
145 
146 void output(Process a[],int n)            
147 
148 {
149 
150    int i;
151 
152    printf("\t进程排序结果:\n");
153 
154     printf("\t********************************\n");
155 
156    printf("\t进程名\t优先级\t到达\t需要\n");
157 
158    for(i=0;i<n;i++)
159 
160         printf("\t%c\t%d\t%d\t%d\t%c\n",a[i].name,a[i].prio,a[i].arrive,a[i].needTime,a[i].state);
161 
162     printf("\t********************************\n");
163 
164 }
165 
166 void running(Process a[],int n)
167 
168 {
169 
170    int i;
171 
172     for(i=0;i<n;i++)
173 
174    {
175 
176       while(a[i].needTime!=0)
177 
178       {
179 
180             printf("\t按任意键继续。。。。。\n");
181 
182             fflush(stdin);
183 
184             getchar();
185 
186            a[i].needTime=a[i].needTime-1;
187 
188            a[i].prio=a[i].prio-1;
189 
190             if(a[i].needTime==0)
191 
192             {
193 
194                    a[i].state='f';
195 
196             }
197 
198           printf("\t现在执行的进程信息:\n");
199 
200          printf("\t进程名\t优先级\t需要\n");
201 
202          printf("\t%c\t%d\t%d\t%c\n",a[i].name,a[i].prio,a[i].needTime,a[i].state);
203 
204          printf("\t********************************\n");
205 
206             sort(a,n);
207 
208             output(a,n);
209 
210       }
211 
212    }
213 
214 }
215 
216 void yxj()
217 
218 {
219 
220    int n;
221 
222    printf("你想输入多少个进程:");
223 
224    scanf("%d",&n);
225 
226    getchar();
227 
228    input(a,n);
229 
230    sort(a,n);
231 
232    running(a,n);
233 
234 }
235 
236  }

 

 

五、实验总结

这次模拟进程调度的实验主要是计算方式的代码有点乱,导致花了很多时间和精力,结果只做了一个根据进程优先级优先调度的方法,其他三个暂时还未实现,先把第一个完成,在此发个微博记录一下,下次再继续完善。

转载于:https://www.cnblogs.com/huanglinxin/p/5505547.html

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值