您的位置:

c语言中pcb块,pcbc是什么

本文目录一览:

用C语言编写并调试一个模拟的进程调度程序,采用“简单时间片轮转法”调度算法对五个进程进行调度。

#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(i5) {

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!=NULLq-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);

}

如何用C语言编写:设计一个时间片轮转调度算法实现处理机调度的程序

实验三 进程调度

一、实验目的

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理机数时,就必须依照某种策略来决定那些进程优先占用处理机。本实验模拟在单处理机情况下的处理机调度,帮助学生加深了解处理机调度的工作。

二、实验内容

设计一个时间片轮转调度算法实现处理机调度的程序。

三、实验指导

1.实验中使用的数据结构:

1)PCB进程控制块

其中包括参数①进程名name;②要求运行时间runtime;③优先数prior;④状态state;⑤已运行时间runedtime。

2)为简单起见,只设运行队列,就绪链表两种数据结构,进程的调度在这两个队列中切换,如图3.1所示。

图3.1PCB链表

2.运行结果,包括各个进程的运行顺序,每次占用处理机的运行时间

3.每个进程运行时间随机产生,为1~20之间的整数。

4.时间片的大小由实验者自己定义,可为3或5。

四、实验要求

1.在上机前写出全部源程序;

2.能在机器上正确运行程序。

五、程序清单

六、运行结果

七、调试分析及实验心得

我的回答和这位老兄的差不多

C语言 用结构体建立 一个PCB表 然后答应 麻烦各位高手帮我看下程序段是哪里出错了 有3个错

#include stdio.h

struct pcb_type

{

int id;

char name[5];

int priority;

char state[5];

};

void main()

{

void list(struct pcb_type pcb);

struct pcb_type pcb[10], *p;

int i;

for(i=1,p=pcb;i=10;p++,i++)

{

printf("Please input the date of pcb[%d]:\n",i);

scanf("%d\n%s\n%d\n%s",(p-id),(p-name),(p-priority),(p-state));

}

for(i=1;i=10;i++)

list(pcb[i]);

}

void list(pcb)

struct pcb_type pcb;

{

printf("%d%s%d%s",pcb.id,pcb.name,pcb.priority,pcb.state);

printf("inputting complete!\n");

}

我用VC编译的可以运行!

谁帮我做这个,用C语言定义一个数据结构PCB。

多看书:谭浩强《C程序设计》、C创造者的《C程序设计语言》、《C陷阱与缺陷》、《C专家编程》(经典)、《C程序员成长攻略》、《算法导论》、《数据结构》等等;

多读代码;多抄袭代码;多动手;多浏览相关网站;多问;另外还要了解一些电路方面的知识,会看SCH和PCB电路,反复阅读相关芯片资料,多做相关方面的开发工作,积累工作经验,光看是不行的,必须亲自冻手设计,初学者可以用开发板来学习,用人家的例程。

努力就会成功!祝你早日入门啊!

用C语言编程模拟处理机调度(实现一种算法)

#include stdlib.h

#include conio.h

#define getpch(type) (type*)malloc(sizeof(type))

#define NULL 0

struct pcb { /* 定义进程控制块PCB */

char name[10];

char state;

int super;

int ntime;

int rtime;

struct pcb* link;

}*ready=NULL,*p;

typedef struct pcb PCB;

void sort() /* 建立对进程进行优先级排列函数*/

{

PCB *first, *second;

int insert=0;

if((ready==NULL)||((p-super)(ready-super))) /*优先级最大者,插入队首*/

{

p-link=ready;

ready=p;

}

else /* 进程比较优先级,插入适当的位置中*/

{

first=ready;

second=first-link;

while(second!=NULL)

{

if((p-super)(second-super)) /*若插入进程比当前进程优先数大,*/

{ /*插入到当前进程前面*/

p-link=second;

first-link=p;

second=NULL;

insert=1;

}

else /* 插入进程优先数最低,则插入到队尾*/

{

first=first-link;

second=second-link;

}

}

if(insert==0) first-link=p;

}

}

void input() /* 建立进程控制块函数*/

{

int i,num;

system("cls"); /*清屏*/

printf("\n 请输入进程数: ");

scanf("%d",num);

for(i=1;i=num;i++)

{

printf("\n 进程号No.%d:\n",i);

p=getpch(PCB);

printf("\n 输入进程名:");

scanf("%s",p-name);

printf("\n 输入进程优先数:");

scanf("%d",p-super);

printf("\n 输入进程运行时间:");

scanf("%d",p-ntime);

printf("\n");

p-rtime=0;p-state='W';

p-link=NULL;

sort(); /* 调用sort函数*/

}

}

int space()

{

int l=0;

PCB* pr=ready;

while(pr!=NULL)

{

l++;

pr=pr-link;

}

return(l);

}

void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/

{

printf("\n 进程名\t 状态\t 优先数\t 需要运行时间\t 已经运行时间\n");

printf("|%s\t",pr-name);

printf("|%c\t",pr-state);

printf("|%d\t",pr-super);

printf("|%d\t\t",pr-ntime);

printf("|%d\t",pr-rtime);

printf("\n");

}

void check() /* 建立进程查看函数 */

{

PCB* pr;

printf("\n **** 当前正在运行的进程是:\n"); /*显示当前运行进程*/

disp(p);

pr=ready;

printf("\n **** 当前就绪队列状态为:\n"); /*显示就绪队列状态*/

while(pr!=NULL)

{

disp(pr);

pr=pr-link;

}

}

void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/

{

printf("\n 进程 [%s] 已完成.\n",p-name);

free(p);

}

void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/

{

(p-rtime)++;

if(p-rtime==p-ntime)

destroy(); /* 调用destroy函数*/

else

{

(p-super)--;

p-state='W';

sort(); /*调用sort函数*/

}

}

void main() /*主函数*/

{

int len,h=0;

char ch;

input();

len=space();

while((len!=0)(ready!=NULL))

{

ch=getchar();

h++;

printf("-----------------------------------------------------");

printf("\n 现在是第%d次运行: \n",h);

p=ready;

ready=p-link;

p-link=NULL;

p-state='R';

check();

running();

printf("\n 按任意键继续......\n");

}

printf("\n\n 进程已经完成.\n");

}