| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2495 人关注过本帖
标题:[讨论] 优先级进程调度(C程序),求拍!
只看楼主 加入收藏
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
收藏
 问题点数:0 回复次数:5 
[讨论] 优先级进程调度(C程序),求拍!

题目:
编写并调试一个模拟的进程调度程序,采用优先级调度算法(含静态优先级和动态优先级)对五个进程进行调度。
  优先级调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
  静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
  动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值等等。可以自行设计动态改变优先级的策略。

/* @Process controlment with static and dynamic;
@author: Wayne;
@date:10/16/2007;
*/
#include <stdio.h>
#include <conio.h>
struct process/* 定义一个结构体 */
{
int pNum;
char pName[10];
int pPri;
}pro[5],array1[6],array2[6];

void Pcb1(struct process array1[ ],int n) /*静态调度方法主函数体*/
{
int i,t,k,tem,max;
for(t=0;t<n;t++)
{
max=t;
for(i=t+1;i<n;i++) /*算法:设一个变量max,根据不同的*/
if(array1[i].pPri>array1[max].pPri) /*Pri值,把最大值赋给max,再把max*/
max=i; /*的值按顺序赋到数组array1中,再*/
array1[5]=array1[t]; /*顺序输出,就相当于调度顺序*/
array1[t]=array1[max];
array1[max]=array1[5];
}
printf("Now the static attemmpering queue is:\n");
for(k=0;k<5;k++)
{
printf("%d,%s,%d\n",array1[k].pNum,array1[k].pName,array1[k].pPri);
}

}

void Pcb2(struct process array2[ ],int m) /*动态调度方法函数体*/
{
int i,t,k,st,l,tem,max;

for(st=0;st<10;st++)
{
for(t=0;t<m;t++)
{
max=t; /*前半部的算法同静态,动态与之不同的是*/
for(i=t+1;i<m;i++) /*只输出最先调用的进程即PRI最大的进程*/
if(array2[i].pPri>array2[max].pPri) /*采用的调度算法为,进程每被调度一次其*/
max=i; /*其优先级就变成1,与此同时其它的进程都*/
array2[5]=array2[t]; /*把优先级增加1,然后,再执行一遍函数体*/
array2[t]=array2[max]; /*再先出新的最大优先级的进程,被调用*/
array2[max]=array2[5];
}
printf("The dynamic control process:\n");
printf("Now the first process entering the CPU is:\n");
printf("%d,%s,%d\n",array2[0].pNum,array2[0].pName,array2[0].pPri); /*被调用的进程(Pri值最大),用输出表示被调用*/

array2[0].pPri=1;
for(l=1;l<5;l++)
array2[l].pPri++;
printf("Now changed PRI:\n");
for(k=0;k<5;k++)
printf("%d,%s,%d\n",array2[k].pNum,array2[k].pName,array2[k].pPri);

}

}
main() /*main函数主体*/
{
int i,j;
printf("Please input the list of processes:\n");
for (i=0;i<5;i++)
{
printf("Please input %d process Number:\n",i+1); /*为各结构体赋值*/
scanf("%d",&pro[i].pNum);
printf("Please input %d process Name:\n",i+1);
scanf("%s",&pro[i].pName);
printf("Please input %d process PRI:\n",i+1);
scanf("%d",&pro[i].pPri);
}
printf("the list is;\n");
for(j=0;j<5;j++)
printf("%d %s %d\t",pro[j].pNum,pro[j].pName,pro[j].pPri);
Pcb1(pro,5); /*调用两个函数*/
printf("\n");
Pcb2(pro,5);
getch();
}


[此贴子已经被作者于2007-10-19 22:59:04编辑过]

搜索更多相关主题的帖子: 进程 动态 CPU 静态 
2007-10-18 21:41
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
收藏
得分:0 
各位能不能帮着改善一下....
或者有不同的想法的,请回个贴..

在我的眼里,这个世界是由0和1组成的!~
2007-10-18 21:46
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
说的很玄乎的样子,看下来就是个找最大值的过程。。。

有两个建议:
1、数组维数用常量代替,便于修改
2、如果某个元素的值比max还大的话,把下标记录下来就好,不需要交换,后面根据下标处理就行,比较节省时间

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-18 22:13
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
收藏
得分:0 
以下是引用永夜的极光在2007-10-18 22:13:44的发言:
说的很玄乎的样子,看下来就是个找最大值的过程。。。

有两个建议:
1、数组维数用常量代替,便于修改
2、如果某个元素的值比max还大的话,把下标记录下来就好,不需要交换,后面根据下标处理就行,比较节省时间

上面的代码只是我对题目的理解..我把一些地方做了简化..

不知有没有更好的想法..比如在"动态优先级"时,有没有更好的算法..

你说的建议..我再试着优化一下程序..谢啦.


在我的眼里,这个世界是由0和1组成的!~
2007-10-19 12:48
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 

其实我看你程序之前还以为是多线程


从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-19 13:10
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
收藏
得分:0 
回复:(wzhings)以下是引用永夜的极光在2007-10-18 ...


不涉及线程..只是进程调度..默认为单线程的进程吧..


在我的眼里,这个世界是由0和1组成的!~
2007-10-19 13:55
快速回复:[讨论] 优先级进程调度(C程序),求拍!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043582 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved