?? cpu.h
字號:
void initial()
{ //系統初始化
int i; //循環標號
link p;
system_time=0; //初始系統時間為0,每執行一條指令增一
id=1; //初始進程號,以后的進程號由此遞增
local_time=5; //初始時間片為3'
psw_flag=0;
for(i=0;i<5;i++) wake[i]=NULL;
//初始空隊列
InitList(&ready_pcb);
InitList(&empty_pcb);
for(i=0;i<10;i++)
{ //創建10個空隊列
p=(link)malloc(sizeof(pcb));
InsertList(&empty_pcb,p);
}
create_idle(); //創建閑逛進程
idle->status=2; //修改進程狀態為運行
running=idle; //系統初始時為運行idle進程
pc=running->ppc;
Initial_equp();
}
void cpu()
{
check_interrupt();
execute_one();
equipment();
}
void execute_one()
{
strcpy(dr,pc->a);
strcpy(ir,dr);
system_time++;
local_time--;
if(local_time==0) psw=2;
if(ir[0]=='x'&&ir[1]=='=') strcpy(ac,ir);
if(ir[1]=='+'&&ir[2]=='+') ac[2]=ac[2]+1;
if(ir[1]=='-'&&ir[2]=='-') ac[2]=ac[2]-1;
if(ir[0]=='e'&&ir[1]=='n'&&ir[2]=='d') psw=1; //程序結束的優先級更高
if(ir[0]=='!'){psw=4;return;} //程序I/O中斷的優先級跟高
if(ir[0]=='?') strcpy(ac,ir);
pc=pc->next;
}
Status create(exelist *l)
{
link p;
char a[4]="0";
if(empty_pcb.len!=0) p=DeleteList(&empty_pcb);
//初始化進程控制塊
p->base=l->head;
p->next=NULL;
p->pid=(id%100);
p->ppc=p->base->next;
p->status=1;
p->wait_time=0;
strcpy(p->temp_result,a);
InsertList(&ready_pcb,p);//將進程插入就緒隊列
id++;
return OK;
}
void check_interrupt()
{
extern exelist *l;
link q;
int i=0;
if(psw) //檢查系統是否有中斷
{
switch(psw){
case 1:i=i%10;
k=i;
psw_flag=psw;
strcpy(temp[i++],ac); //程序結束
q=running;
running=schedul(running);
destory(q); //釋放進程內存
break;
case 2:running=schedul(running); //時間片到
break; //(ok)
case 3:awake();
break; // 結束I/O中斷
case 4:halt=running;
block(); //需要I/O
running=schedul(running);
break;
case 5:on_create=l;
create(on_create);
break; //psw=5,需要創建進程
default:break;
}
}
}
link schedul(link r)
{
link q; //指向pcb塊
linklist *l;
l=&ready_pcb; //l指向就緒隊列
r->ppc=pc;
strcpy(r->temp_result,ac);
if(psw==2&&r->pid!=0)InsertList(&ready_pcb,r);
if(l->len==0)q=idle; // 就緒隊列為空
else q=DeleteList(&ready_pcb);
pc=q->ppc;
strcpy(ac,q->temp_result);
local_time=5; //重設時間片為3
psw=0; //清除中斷
r=q;
return q;
}
Status create_idle()
{
extern Status InitListexe(exelist *l);
extern Status InsertListexe(exelist*l,pointer p);
pointer q; //指向可執行文件的一條指令
link p; //指向pcb
exelist execute; //可執行文件
char a[4]="???";
InitListexe(&execute); //初始化可執行文件
q=(pointer)(malloc(sizeof(exe)));
strcpy(q->a,a);
InsertListexe(&execute,q);
q->next=q;
if(empty_pcb.len!=0) p=DeleteList(&empty_pcb);
//初始化進程控制塊
p->base=execute.head; //指向可執行文件頭部
p->next=NULL; //指向下一個進程
p->pid=0; //閑逛進程id為0
p->ppc=p->base->next; //指向下一條可執行指令,即當前可執行指令
p->status=0; //狀態為新建
p->wait_time=0; //等待設備得時間為0
idle=p;
return OK;
}
Status block()
{
link p;
p=halt;
p->ppc=pc;
strcpy(p->temp_result,ac); //保存cpu現場
p->status=3;
p->ppc->a[2]-=48;
switch(p->ppc->a[1]){
case 'a':;
case 'A':InsertList(&a_block_pcb,p);
printf("a Insert\n");
break;
case 'b':;
case 'B':InsertList(&b_block_pcb,p);
break;
printf("b end\n");
case 'c':;
case 'C':InsertList(&c_block_pcb,p);
break;
printf("c end\n");
default: break;}
printf("block end\n");
return OK;
}
Status awake()
{ //when psw=3
int i;
for(i=0;i<5;i++)
if(wake[i])
InsertList(&ready_pcb,wake[i]);
return OK;
}
void destory(link p)
{
free(p->base);
InsertList(&empty_pcb,p);
p=NULL;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -