#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)
}
如下为Java调用本地的转换文件,其中String[] params就是参数,示例传递了两个悉旦型参数:“123”, “234”,传递的参数全部是字符串类睁猜型,使用时需要转换成具体的格式:[java] view plaincopy
/**
* 调用本地的转换文件(带参数)
*
* @Description:
* @param transFileName
* @throws KettleException
* @author 李文锴
* @since:2012-8-15 下午02:58:54
*/
public static void callNativeTransWithParam(String transFileName) throws KettleException {
// 初始化
EnvUtil.environmentInit()
StepLoader.init()
// 转换元对象
TransMeta transMeta = new TransMeta(transFileName)
// 转换
Trans trans = new Trans(transMeta)
String[] params = {"迟伏123", "234"}// 传递参数
// 执行转换
trans.execute(params)
// 等待转换执行结束
trans.waitUntilFinished()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)