#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)
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)