本文目錄一覽:
- 1、用C語言編寫並調試一個模擬的進程調度程序,採用“簡單時間片輪轉法”調度算法對五個進程進行調度。
- 2、如何用C語言編寫:設計一個時間片輪轉調度算法實現處理機調度的程序
- 3、C語言 用結構體建立 一個PCB表 然後答應 麻煩各位高手幫我看下程序段是哪裡出錯了 有3個錯
- 4、誰幫我做這個,用C語言定義一個數據結構PCB。
- 5、用C語言編程模擬處理機調度(實現一種算法)
用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”);
}
原創文章,作者:ITZRV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/331434.html