处理机调度模拟程序:选择一个调度算法,实现处理机调度。

处理机调度模拟程序:选择一个调度算法,实现处理机调度。,第1张

七、源程序:

#include <stdio.h>

int m1 //共享变量

int m2 //共享变量

struct{

int id //进程标号

int waiter1 //指针,用于标识等待队列的下一个进程

int priority //进程优先级

char status //进程状态

}pcb[4]

struct{

int value //信号量的值

int waiter2//指针,用于标识等待此信号量队列的第一个进程

}sem[3]

char stack[11][4] //现场保护堆栈

int i; //cpu中的通用寄存器

int ep//当前运行进程指针

char addr //程序运行时的地址

void init() //初始化

int find() //找出就绪进程

int w2() //

int process1() //进程1

int process2() //进程2

int process3() //进程3

int p(int,int ,char) //P原语

int v(int,int ,char) //V原语

main()

{

init()

printf("系统程序开始执行\n")

for(){

if(find()!=0) //找出就绪进程

w2() //进程调度

else break//退出程序

}

printf("系统程序结束\n")

}

void init() //初始化进程

{

int j,k

pcb[0].status='w' //进程状态设置为等待

pcb[0].priority=4 //进程的优先级别

for(j=1j<=3j++){

pcb[j].id=j //进程编号

pcb[j].status='r' //进程状态设置为就绪

pcb[j].waiter1=0 //进程指针初始化为0

pcb[j].priority=j //设置进程优先级

}

for(j=1j<=2j++){

sem[j].value=1 //信号量赋值为1

sem[j].waiter2=0 //等待信号量队列的初始化

}

i=0 //CPU通用寄存器初始化

ep=0 //

addr='0' //程序运行地址

m1=0 //共享变量初始化

m2=0 //共享变量初始化

for(j=1j<=10j++){

for(k=1k<=3k++)

stack[j][k]='0' //现场保护堆栈初始化

}

}

int find(){ //查找初始化变量

int j

for(j=1j<=3j++)

if(pcb[j].status=='r') return(j)//如果pcb队列中有就绪进程,返回进程编号

return(0)

}

int w2(){ //进程调度程序

int pd

pd=find() //找出就绪进程编号

if(pd==0) return(0)//如果没有找到就绪进程,退出程序

else if(ep==0){//如果当前运行进程是否为0

pcb[pd].status='e' //直接将当前进程设置为运行状态

ep=pd //当前运行进程设置为pd

printf("进程%d正在执行\n",ep)

}

else

if(pcb[pd].priority<pcb[ep].priority)//如果当前进程比待调入进程优先级进行比较

{//调入进程优先级别高

pcb[ep].status='r'//把CPU运行进程执行状态设置为就绪

printf("读取进程%d\n",pcb[pd].id)

pcb[pd].status='e'//将待调入进程执行状态设置为执行

ep=pd//将当前运行进程指针为待调入进程

}

printf("运行进程%d\n",ep)

i=stack[1][ep] //恢复进程的通用寄存器中的值和运行地址。

addr=stack[2][ep]

switch(ep){ //根据当前运行的进程选择运行

case 1:process1()

break

case 2:process2()

break

case 3:process3()

break

default:printf("当前进程出现错误%d\n",ep)

break

}

}

int process1(){//进程1

if(addr=='m') goto m//如果当前运行地址是m,跳到m运行

i=1

a:

printf("进程1在信号量sem[1]上调用P操作\n")

if(p(1,1,'m')==0) return(0)//进行p操作,m表示程序执行到m

else goto m

m:

printf("打印进程1...m1=%d\n",m1)//进程1的操作,打印,寄存器i+5

printf("打印进程1...i=%d\n",i)

i+=5

goto a//跳回a执行

}

int process2(){//进程分为3部分

if(addr=='m') goto m

if(addr=='n') goto n

i=1

a:

printf("进程2在信号量sem[2]上调用P操作\n")

if(p(2,2,'m')==0) return(0)

m:

m1=2*m2

printf("进程2在信号量sem[1]上调用V操作m1=%d\n",m1)

if(v(1,2,'n')==0) return(0)

else{

n:

printf("打印进程2...i=%d\n",i)

i+=10

goto a

}

}

int process3(){

if(addr=='m') goto m

if(addr=='n') goto n

i=1

a:

if(i>4){

printf("进程3在信号量sem[2]上调用P操作\n")

if(p(2,3,'n')==0) return(0)

}

n:

m2=i

printf("进程3在sem[2]信号量上调用V操作m=%d\n",m2)

if(v(2,3,'m')==0) return(0)

else{

m:

i+=1

goto a

}

}

int p(int se,int p,char ad){

int w

sem[se].value--//信号量减1

if(sem[se].value==0) return(1)//如果信号量=0,返回1,说明阻塞

printf("阻塞当前进程%d\n",p)

pcb[p].status='w'//改变进程状态

ep=0//运行进程为空

pcb[p].waiter1=0//设为尾末

w=sem[se].waiter2//找出等待队列的队尾

if(w==0) sem[se].waiter2=p//插入等待队列

else{

while(pcb[w].waiter1!=0) w=pcb[w].waiter1

pcb[w].waiter1=p

}

stack[1][p]=i//保存现场

stack[2][p]=ad

return(0)

}

int v(int se,int p,char ad){

int w

sem[se].value++//信号量加1

if(sem[se].value>0) return(1)//信号量>0,无等待进程

w=sem[se].waiter2//返回第一个等待进程

sem[se].waiter2=pcb[w].waiter1//调整位置

pcb[w].status='r'//进程改变状态

printf("唤醒进程%d\n",w)

stack[1][p]=i//进程状态进栈

stack[2][p]=ad

return(0)

}

虽然不是C#,但意思如下,希望能帮到你。。。。。这是我自己以前做过的。

#include <stdio.h>

struct{

char pstatus //哲学家状态

int pid//哲学家编号

int waiter1

int priority//优先级,数值大的就餐的优先级高

}pcb[6]

struct sp{

int stick //筷子状态,0表示可使用或表示空闲,1表示有人在使用或不空闲

}num[6]//筷子编号

struct{

int value  //互斥信号量,临界区数,初值为1

int waiter2 //同步信号量,初值为0

}sem[5]

char stack[11][6]

int m1,m2//为系统设置的公用数据被三个进程共享使用。

int i,ep  //ep表示正在就餐的哲学家的pid,i为通用寄存器

char addr  //addr为程序计数器

void init()//初始化函数

int find()//查找

int hungry()

int process1()

int process2()

int process3()

int process4()

int process5()

int p(int,int ,char)

int v(int,int ,char)

int main(){

init()

printf("系统程序开始执行\n")

for()

{   if( find()!=0 )  hungry()

else  break

}

printf("系统程序结束\n")

}

void init(){

int j,k

pcb[0].pstatus='w'

pcb[0].priority=2//数越大优先级越高

for( j=1j<=5j++)

{

num[j].stick=0

pcb[j].pid=j

pcb[j].pstatus='t'

pcb[j].priority=5

}

for(j=1j<=5j++)

{

sem[j].value=1

sem[j].waiter2=0

}

i=0ep=0m1=0 m2=0

for(j=1j<=11j++)

{

for(k=1k<=6k++)

stack[j][k]='0'

}

}

int find()

{

int j

for(j=1j<=5j++)

if(pcb[j].pstatus=='t'&&pcb[j].priority==5)return (j)

return 0

}

int hungry(){

int j,left,right 

j=find()

left=j

right=j+1

if(j==0) return(0)

/*else if(num[left].stick==1||num[right].stick==1){

num[left].stick=0

num[right].stick=0

pcb[j].pstatus='w'

printf("在等吃饭的哲学家编号为%d\n",pcb[j].pid)}*/

if(ep==0){

//&&num[left].stick==0 &&num[right].stick==0&&pcb[j].pstatus=='t'&&pcb[j].priority==5

if(num[left].stick==0&&num[right].stick==0)

{

printf("将正在思考的哲学家%d状态设为执行状态\n",pcb[j].pid)

printf("读取进程%d\n",pcb[j].pid)

pcb[j].pstatus='e'

ep=j

num[left].stick=1

num[right].stick=1

printf("运行进程%d\n",ep)

pcb[ep].priority--

}

else{

printf("哲学家%d没有同时获得左右两只筷子,只好放下筷子等待吃饭\n",pcb[j].pid)

num[left].stick=0

num[right].stick=0

pcb[j].pstatus='w'

pcb[j].priority++

if(pcb[j].pstatus=='w'&&pcb[j].priority>pcb[j-1].priority)

{ printf("将在等待中哲学家%d设为t状态\n",pcb[j].pid)

pcb[j].pstatus='t' 

printf("读取进程%d\n",pcb[j].pid)

pcb[j].pstatus='e'

ep=j}

}

}

i=stack[1][ep]

addr=stack[2][ep]

switch(ep){

case 1:process1()

break

case 2:process2()

break

case 3:process3()

break

case 4:process4()

break

case 5:process5()

break

default:printf("当前进程出错!%d\n",ep)

break

}

}

process1(){

if(addr=='m') goto m

i=1

a:

printf("哲学家1在信号量sem[1]上调用P操作\n")

if(p(1,1,'m')==0) return(0)

else goto m

m:

printf("打印进程1...m1=%d\n",m1)

printf("打印进程1...i=%d\n",i)

i+=5

goto a

}

process2(){

if(addr=='m') goto m

if(addr=='n') goto n

i=1

a:

printf("进程2在信号量sem[3]上调用P操作\n")

if(p(3,2,'m')==0) return(0)

m:

m1=m2+4

printf("进程2在信号量sem[2]上调用V操作m1=%d\n",m1)

if(v(2,2,'n')==0) return(0)

else{

n:

printf("打印进程2...i=%d\n",i)

i+=10

goto a

}

}

process3(){

if(addr=='m') goto m

if(addr=='n') goto n

i=1

a:

printf("进程3在信号量sem[4]上调用P操作\n")

if(p(4,3,'m')==0) return(0)

m:

m1=m2+4

printf("进程3在信号量sem[2]上调用V操作m1=%d\n",m1)

if(v(2,3,'n')==0) return(0)

else{

n:

printf("打印进程3...i=%d\n",i)

i+=15

goto a

}

}

process4(){

if(addr=='m') goto m

if(addr=='n') goto n

i=1

a:

printf("进程4在信号量sem[4]上调用P操作\n")

if(p(4,4,'m')==0) return(0)

m:

m1=m2+4

printf("进程4在信号量sem[3]上调用V操作m1=%d\n",m1)

if(v(3,4,'n')==0) return(0)

else{

n:

printf("打印进程4...i=%d\n",i)

i+=20

goto a

}

}

process5(){

if(addr=='m') goto m

if(addr=='n') goto n

i=1

a:

if(i>1){

printf("进程5在信号量sem[2]上调用P操作\n")

if(p(2,5,'n')==0) return(0)

}

n:

m2=i

printf("进程5在sem[5]信号量上调用V操作m=%d\n",m2)

if(v(5,5,'m')==0) return(0)

else{

m:

i+=1

goto a

}

}

int p(int se,int p,char ad){ //p操作

int w  //等待指示字单元

sem[se].value--

if(sem[se].value==0) return(1) //判断是否有资源

printf("阻塞当前进程%d\n",p) //打印阻塞进程

pcb[p].pstatus='w' //把阻塞进程置"w"状态

ep=0

pcb[p].waiter1=0

w=sem[se].waiter2

//下一状态指示字赋给w

if(w==0) sem[se].waiter2=p //把等待进程标识符送入信号单元

else{

while(pcb[w].waiter1!=0) //找等待队列是否为空

w=pcb[w].waiter1 //送入等待指示字单元

pcb[w].waiter1=p //否则插入等待队列

}

stack[1][p]=i

stack[2][p]=ad// 保护现场

return(0)

}

int v(int se,int p,char ad){

int w

sem[se].value++

if(sem[se].value>0) return(1)

w=sem[se].waiter2

sem[se].waiter2=pcb[w].waiter1

pcb[w].pstatus='t'

printf("唤醒进程%d\n",w)

stack[1][p]=i

stack[2][p]=ad

return(0)

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/314416.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存