
//程序中有注释部分和需要他自己完善的部分,我给的是框架
//老师只是要求用C程序模拟这个机制来实现,就是通过你所学的知识模拟一个效果即可
//利用P,V *** 作使得在同一时刻,生产者和消费者只能有一个对存储区 *** 作(即临界区)。
//如果陪差两者同时对存储区 *** 作,即同时取和生产的话,必定会有一个等待,当另一个完成 *** 作后自己才会被唤醒。
//生产者在存储区满时不能再生产,进入等待,消费者同理
//完成同步互斥效果
//希望对你朋友有启发
/*----以下为代码部分-----*/
//定义全局变笑乱樱量
int empty = 1//信号量表示存储单元空,可以生产产品
int full = 0//信号量表示存储单元空,不可以消费产品
//P *** 作
void P(int &mutex)
{
*mutex--
if(*mutex<0)
{
//当前进程挂起的程序实现
}
}
//V *** 作
void V(int &mutex)
{
*mutex++
if(*mutex <=0)
{
//唤醒等待中的进程程序实现
}
}
//生产者程序
void producer()
{
P(&empty)//若此时存储区空,则可以生产,否则程序挂起等待
//生产一个产品 *** 作
V(&full)//通知消费者进程,可以取产品
}
//消费者程序
void consumer(){
P(&full)//若此时存储区不空,则可以取产品,否则消费者程序挂起等待
//取走一个产品 *** 作
V(&empty)//通知生产者进程可以生产
}
//主函数
void main()
{
//分别调用生产者,消费者程序,顺序不限,因为已经完成碰丛信号量的同步,若发生同步问题就会等待
producer();
consumer();
consumer();
producer();
………………
}
#include "stdio.h"#include "stdlib.h"
#include "string.h"
struct PCB {
char NAME[10] /*进程名*/
int ROUND /*进程轮转时间片*/
int REACHTIME /*进程到达时间*/
int CPUTIME /*进程占用CPU时间*/
int COUNT /*计数器*/
int NEEDTIME /*进程完成还要的CPU时间*/
char STATE /*进程的状态*/
struct PCB *NEXT /*链指针*/
}
struct LINK { /*PCB的链结构*/
struct PCB *RUN /*当前运行进程指针*/
struct PCB *READY /*就绪队列头指针*/
struct PCB *TAIL /*就绪队碧姿列尾指针*/
struct PCB *FINISH /*完成队列头指针*/
}
void INIT(LINK *) /*对PCB的链结构初始化*/
void INSERT(LINK *) /*将执行了一个单位时间片数且还未完成的进程的PCB插到就绪队列的队尾*/
void FIRSTIN(LINK *) /*将就绪队列中的第一个进程投入运行*/
void PRINT(LINK *) /*打印每执行一个时间片后的所有空慧带进程的状态*/
void PR(PCB *) /*打印一个进程的状态*/
int CREATE(LINK *,int) 斗芦/*创建新的进程*/
void ROUNDSCH(LINK *) /*按时间片轮转法调度进程*/
void main() {
LINK pcbs
int i
INIT(&pcbs)
i=0
printf("创建5个进程\n\n")
while(i<5) {
if(CREATE(&pcbs,i+1)==1) {
printf("进程已创建\n\n")
i++
}
else
printf("进程创建失败\n\n")
}
FIRSTIN(&pcbs)
ROUNDSCH(&pcbs)
}
void ROUNDSCH(LINK *p) {
PCB *pcb
while(p->RUN!=NULL) {
pcb=(PCB *)malloc(sizeof(PCB))
strcpy(pcb->NAME,p->RUN->NAME)
pcb->ROUND=p->RUN->ROUND
pcb->REACHTIME=p->RUN->REACHTIME
pcb->CPUTIME=p->RUN->CPUTIME
pcb->COUNT=p->RUN->COUNT
pcb->NEEDTIME=p->RUN->NEEDTIME
pcb->STATE=p->RUN->STATE
pcb->NEXT=p->RUN->NEXT
pcb->CPUTIME++
pcb->NEEDTIME--
pcb->COUNT++
if(pcb->NEEDTIME==0) {
pcb->NEXT=p->FINISH->NEXT
p->FINISH->NEXT=pcb
pcb->STATE='F'
p->RUN=NULL
if(p->READY!=p->TAIL)
FIRSTIN(p)
}
else {
p->RUN=pcb
if(pcb->COUNT==pcb->ROUND) {
pcb->COUNT=0
if(p->READY!=p->TAIL) {
pcb->STATE='W'
INSERT(p)
FIRSTIN(p)
}
}
}
PRINT(p)
}
}
void INIT(LINK *p) {
p->RUN=NULL
p->TAIL=p->READY=(PCB *)malloc(sizeof(PCB))
p->READY->NEXT=NULL
p->FINISH=(PCB *)malloc(sizeof(PCB))
p->FINISH->NEXT=NULL
}
int CREATE(LINK *p,int n) {
PCB *pcb,*q
pcb=(PCB *)malloc(sizeof(PCB))
flushall()
printf("请输入第%d个进程的名称:\n",n)
gets(pcb->NAME)
printf("请输入第%d个进程的轮转时间片数:\n",n)
scanf("%d",&(pcb->ROUND))
printf("请输入第%d个进程的到达时间:\n",n)
scanf("%d",&(pcb->REACHTIME))
pcb->CPUTIME=0
pcb->COUNT=0
printf("请输入第%d个进程需运行的时间片数:\n",n)
scanf("%d",&(pcb->NEEDTIME))
pcb->STATE='W'
pcb->NEXT=NULL
if(strcmp(pcb->NAME,"")==0||pcb->ROUND<=0||pcb->NEEDTIME<=0) /*输入错误*/
return 0
q=p->READY
while(q->NEXT!=NULL&&q->NEXT->REACHTIME<=pcb->REACHTIME)
q=q->NEXT
pcb->NEXT=q->NEXT
q->NEXT=pcb
if(pcb->NEXT==NULL)
p->TAIL=pcb
return 1
}
void FIRSTIN(LINK *p) {
PCB *q
q=p->READY->NEXT
p->READY->NEXT=q->NEXT
q->NEXT=NULL
if(p->READY->NEXT==NULL)
p->TAIL=p->READY
q->STATE='R'
p->RUN=q
}
void INSERT(LINK *p) {
PCB *pcb
pcb=(PCB *)malloc(sizeof(PCB))
strcpy(pcb->NAME,p->RUN->NAME)
pcb->ROUND=p->RUN->ROUND
pcb->REACHTIME=p->RUN->REACHTIME
pcb->CPUTIME=p->RUN->CPUTIME
pcb->COUNT=p->RUN->COUNT
pcb->NEEDTIME=p->RUN->NEEDTIME
pcb->STATE=p->RUN->STATE
pcb->NEXT=p->RUN->NEXT
p->TAIL->NEXT=pcb
p->TAIL=pcb
p->RUN=NULL
pcb->STATE='W'
}
void PRINT(LINK *p) {
PCB *pcb
printf("执行一个时间片后的所有进程的状态:\n\n")
if(p->RUN!=NULL)
PR(p->RUN)
if(p->READY!=p->TAIL) {
pcb=p->READY->NEXT
while(pcb!=NULL) {
PR(pcb)
pcb=pcb->NEXT
}
}
pcb=p->FINISH->NEXT
while(pcb!=NULL) {
PR(pcb)
pcb=pcb->NEXT
}
}
void PR(PCB *p) {
printf("进程名:%s\n",p->NAME)
printf("进程轮转时间片:%d\n",p->ROUND)
printf("进程到达时间:%d\n",p->REACHTIME)
printf("进程占用CPU时间:%d\n",p->CPUTIME)
printf("计数器:%d\n",p->COUNT)
printf("进程完成还要的CPU时间:%d\n",p->NEEDTIME)
printf("进程的状态:%c\n\n",p->STATE)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)